113 if (val > 0 && val < 31) {
114 *well_known_value = -1;
117 }
else if (val == 31) {
118 *well_known_value = -1;
122 }
else if (val > 127) {
123 *well_known_value = val - 128;
125 }
else if (val ==
WSP_QUOTE || val ==
'"') {
126 *well_known_value = -1;
130 *well_known_value = -1;
155 if (len > (
long)
sizeof(val) || len < 0)
192 }
else if (val > 0 && val < 31) {
195 }
else if (val == 31) {
199 }
else if (val > 127) {
223 }
else if (val > 127) {
226 warning(0,
"WSP headers: bad integer-value.");
244 if (q >= 1 && q <= 100) {
255 if (q > 100 && q <= 1000) {
280 if (c2 < 0 || (c2 & 0x80))
282 c = ((c & 0x7f) << 8) + c2;
296 major = ((value >> 4) & 0x7);
297 minor = (value & 0xf);
315 warning(0,
"WSP: bad Encoding-Version value");
342 parm = wsp_parameter_to_string(
type);
349 warning(0,
"Format error in parameter.");
355 panic(0,
"Unknown secondary field value type %d.", ret);
363 warning(0,
"bad parameter value");
379 value = wsp_charset_to_string(val);
381 warning(0,
"Unknown charset %04lx.", val);
388 warning(0,
"Text-string parameter with integer encoding");
391 value = wsp_header_to_string(val);
393 warning(0,
"Unknown differences header %02lx.", val);
396 warning(0,
"Unknown parameter encoding %02lx.",
407 warning(0,
"Format error in parameter value.");
420 if (!
parm || !value) {
421 warning(0,
"Skipping parameters");
494 unsigned long timeval;
499 warning(0,
"WSP headers: bad date-value.");
505 warning(0,
"WSP headers: cannot unpack date-value.");
532 warning(0,
"bad media-range or media-type");
537 decoded = wsp_content_type_to_string(val);
539 warning(0,
"Unknown content type 0x%02lx.", val);
545 warning(0,
"Format error in content type");
549 panic(0,
"Unknown secondary field value type %d.", ret);
565 warning(0,
"Bad accept-charset-general-form");
570 decoded = wsp_charset_to_string(val);
572 warning(0,
"Unknown character set %04lx.", val);
578 warning(0,
"Format error in accept-charset");
582 panic(0,
"Unknown secondary field value type %d.", ret);
598 warning(0,
"Bad accept-language-general-form");
605 decoded = wsp_language_to_string(val);
607 warning(0,
"Unknown language %02lx.", val);
613 warning(0,
"Format error in accept-language");
617 panic(0,
"Unknown secondary field value type %d.", ret);
663 }
else if (val >= 32 && val < 128) {
671 warning(0,
"Cannot parse credentials.");
705 }
else if (val >= 32 && val < 128) {
713 warning(0,
"Cannot parse credentials.");
722 Octstr *realm_value = NULL;
734 }
else if (val >= 32 && val < 128) {
738 if (decoded && realm_value) {
752 warning(0,
"Cannot parse challenge.");
764 warning(0,
"Decoding of content-range not supported");
800 warning(0,
"Bad field-name encoding");
805 decoded = wsp_header_to_string(val);
807 warning(0,
"Unknown field-name 0x%02x.", val);
813 warning(0,
"Bad field-name encoding");
817 panic(0,
"Unknown field value type %d.", ret);
832 warning(0,
"Bad cache-directive");
837 decoded = wsp_cache_control_to_string(val);
839 warning(0,
"Bad cache-directive 0x%02x.", val);
844 case WSP_CACHE_CONTROL_NO_CACHE:
845 case WSP_CACHE_CONTROL_PRIVATE:
847 warning(0,
"Too short cache-directive");
854 warning(0,
"Bad field name in cache directive");
867 case WSP_CACHE_CONTROL_MAX_AGE:
868 case WSP_CACHE_CONTROL_MAX_STALE:
869 case WSP_CACHE_CONTROL_MIN_FRESH:
874 warning(0,
"Bad integer value in cache directive");
882 warning(0,
"Unexpected value 0x%02x in cache directive.", val);
892 warning(0,
"Format error in cache-control.");
898 panic(0,
"Unknown field value type %d.", ret);
919 warning(0,
"Cannot parse retry-after value.");
931 decoded = wsp_disposition_to_string(selector);
933 warning(0,
"Cannot parse content-disposition value.");
945 unsigned long first_byte_pos, last_byte_pos, suffix_length;
978 warning(0,
"Bad format for range-value.");
988 Octstr *warn_agent = NULL;
990 unsigned char quote =
'"';
1022 warning(0,
"Bad format for warning-value.");
1034 unsigned char *headername = NULL;
1035 unsigned char *ch = NULL;
1040 warning(0,
"Faulty header, skipping remaining headers.");
1045 headername = wsp_header_to_cstr(field_type);
1060 switch (field_type) {
1061 case WSP_HEADER_ACCEPT:
1062 case WSP_HEADER_CONTENT_TYPE:
1063 ch = wsp_content_type_to_cstr(val);
1065 warning(0,
"Unknown content type 0x%02x.", val);
1068 case WSP_HEADER_ACCEPT_CHARSET:
1069 ch = wsp_charset_to_cstr(val);
1071 warning(0,
"Unknown charset 0x%02x.", val);
1074 case WSP_HEADER_ACCEPT_ENCODING:
1075 case WSP_HEADER_CONTENT_ENCODING:
1076 ch = wsp_encoding_to_cstr(val);
1078 warning(0,
"Unknown encoding 0x%02x.", val);
1081 case WSP_HEADER_ACCEPT_LANGUAGE:
1082 case WSP_HEADER_CONTENT_LANGUAGE:
1083 ch = wsp_language_to_cstr(val);
1085 warning(0,
"Unknown language 0x%02x.", val);
1088 case WSP_HEADER_ACCEPT_RANGES:
1089 ch = wsp_ranges_to_cstr(val);
1091 warning(0,
"Unknown ranges value 0x%02x.", val);
1094 case WSP_HEADER_AGE:
1095 case WSP_HEADER_CONTENT_LENGTH:
1096 case WSP_HEADER_MAX_FORWARDS:
1102 case WSP_HEADER_ALLOW:
1103 case WSP_HEADER_PUBLIC:
1104 ch = wsp_method_to_cstr(val);
1107 warning(0,
"Unknown method 0x%02x.", val);
1111 case WSP_HEADER_CACHE_CONTROL:
1112 case WSP_HEADER_CACHE_CONTROL_V13:
1113 case WSP_HEADER_CACHE_CONTROL_V14:
1114 ch = wsp_cache_control_to_cstr(val);
1116 warning(0,
"Unknown cache-control value 0x%02x.", val);
1119 case WSP_HEADER_CONNECTION:
1120 ch = wsp_connection_to_cstr(val);
1122 warning(0,
"Unknown connection value 0x%02x.", val);
1126 case WSP_HEADER_PRAGMA:
1128 ch = (
unsigned char *)
"no-cache";
1130 warning(0,
"Unknown pragma value 0x%02x.", val);
1133 case WSP_HEADER_TRANSFER_ENCODING:
1134 ch = wsp_transfer_encoding_to_cstr(val);
1136 warning(0,
"Unknown transfer encoding value 0x%02x.", val);
1139 case WSP_HEADER_VARY:
1140 ch = wsp_header_to_cstr(val);
1142 warning(0,
"Unknown Vary field name 0x%02x.", val);
1145 case WSP_HEADER_WARNING:
1150 case WSP_HEADER_BEARER_INDICATION:
1151 ch = wsp_bearer_indication_to_cstr(val);
1153 warning(0,
"Unknown Bearer-Indication field name 0x%02x.", val);
1156 case WSP_HEADER_ACCEPT_APPLICATION:
1157 ch = wsp_application_id_to_cstr(val);
1159 warning(0,
"Unknown Accept-Application field name 0x%02x.", val);
1164 warning(0,
"Did not expect short-integer with " 1165 "'%s' header, skipping.", headername);
1170 switch (field_type) {
1171 case WSP_HEADER_ACCEPT:
1172 case WSP_HEADER_CONTENT_TYPE:
1179 case WSP_HEADER_ACCEPT_CHARSET:
1183 case WSP_HEADER_ACCEPT_LANGUAGE:
1187 case WSP_HEADER_AGE:
1188 case WSP_HEADER_CONTENT_LENGTH:
1189 case WSP_HEADER_MAX_FORWARDS:
1190 case WSP_HEADER_BEARER_INDICATION:
1191 case WSP_HEADER_ACCEPT_APPLICATION:
1201 case WSP_HEADER_AUTHORIZATION:
1205 case WSP_HEADER_PROXY_AUTHORIZATION:
1209 case WSP_HEADER_CACHE_CONTROL:
1213 case WSP_HEADER_CONTENT_MD5:
1221 case WSP_HEADER_CONTENT_RANGE:
1225 case WSP_HEADER_DATE:
1226 case WSP_HEADER_EXPIRES:
1227 case WSP_HEADER_IF_MODIFIED_SINCE:
1228 case WSP_HEADER_IF_RANGE:
1229 case WSP_HEADER_IF_UNMODIFIED_SINCE:
1230 case WSP_HEADER_LAST_MODIFIED:
1236 case WSP_HEADER_PRAGMA:
1250 case WSP_HEADER_PROXY_AUTHENTICATE:
1251 case WSP_HEADER_WWW_AUTHENTICATE:
1255 case WSP_HEADER_RANGE:
1259 case WSP_HEADER_RETRY_AFTER:
1263 case WSP_HEADER_WARNING:
1267 case WSP_HEADER_CONTENT_DISPOSITION:
1271 case WSP_HEADER_ENCODING_VERSION:
1277 warning(0,
"Did not expect value-length with " 1278 "'%s' header, skipping.", headername);
1283 warning(0,
"WSP: %s: skipping %ld trailing octets.",
1289 panic(0,
"Unknown field-value type %d.", ret);
1292 if (ch == NULL && decoded != NULL)
1298 warning(0,
"Unknown header number 0x%02x.", field_type);
1307 warning(0,
"Skipping faulty header.");
1319 if (header && value) {
1325 warning(0,
"Error parsing application-header.");
1342 debug(
"wsp", 0,
"WSP: decoding headers:");
1346 if (content_type_present)
1348 WSP_HEADER_CONTENT_TYPE,
context);
1355 if (byte == 127 || (byte >= 1 && byte <= 31)) {
1361 info(0,
"Returning to code page 1 (default).");
1363 warning(0,
"Shift to unknown code page %d.",
1365 warning(0,
"Will try to skip headers until " 1366 "next known code page.");
1368 }
else if (byte >= 128) {
1372 debug(
"wsp", 0,
"Skipping field 0x%02x.", byte);
1375 }
else if (byte > 31 && byte < 127) {
1380 warning(0,
"Unsupported token or header (start 0x%x)", byte);
1388 debug(
"wsp", 0,
"WSP: decoded headers:");
1393 debug(
"wsp", 0,
"WSP: End of decoded headers.");
1449 { WSP_HEADER_CONTENT_BASE,
pack_uri, 0 },
1453 { WSP_HEADER_CONTENT_LOCATION,
pack_uri, 0 },
1454 { WSP_HEADER_CONTENT_MD5,
pack_md5, 0 },
1468 { WSP_HEADER_LOCATION,
pack_uri, 0 },
1475 { WSP_HEADER_REFERER,
pack_uri, 0 },
1487 { WSP_HEADER_X_WAP_CONTENT_URI,
pack_uri, 0},
1488 { WSP_HEADER_X_WAP_INITIATOR_URI,
pack_uri, 0},
1564 for (pos = 0; pos < len; pos++) {
1578 for (pos++; pos > 0 && pos < len; pos++) {
1719 if (qvalue < 0 || qvalue > 1000)
1741 return default_qvalue;
1752 if (qvalue % 10 == 0)
1753 qvalue = qvalue / 10 + 1;
1755 qvalue = qvalue + 100;
1779 unsigned char octet;
1791 for (len = 0; integer != 0; integer >>= 8, len++) {
1792 octet = integer & 0xff;
1817 unsigned long integer;
1823 for (pos = 0; pos <
octstr_len(value); pos++) {
1828 if (integer > ULONG_MAX / 10)
1831 if (integer > ULONG_MAX - digit)
1836 debug(
"wsp",0,
"WSP: %s: value `%s', integer 0x%04lx", __func__,
1842 warning(0,
"WSP: Number too large to handle: '%s'.",
1850 unsigned long integer;
1855 if (pos < 0 || major < 1 || major > 7)
1864 if (pos !=
octstr_len(version) || minor < 0 || minor > 14)
1868 integer = major << 4 | minor;
1869 debug(
"wsp",0,
"WSP: %s: value `%s', integer 0x%04lx", __func__,
1899 keytoken = wsp_string_to_versioned_parameter(
parm->key,
WSP_1_2);
1901 if (keytoken >= 0) {
1911 }
else switch (keytoken) {
1922 tmp = wsp_string_to_charset(
parm->
value);
1998 error(0,
"WSP: MD5 value not 128 bits.");
2020 Octstr *parmstring = NULL;
2030 for (pos = 0; pos <
octstr_len(value); pos++) {
2075 if (realmparm == NULL ||
2077 realmparm->
value == NULL)
2104 warning(0,
"WSP: Cannot parse challenge.");
2128 for (pos = 0; pos <
octstr_len(value); pos++) {
2151 warning(0,
"WSP: bad cookie in credentials '%s'.",
2194 if (timeval == -1) {
2195 warning(0,
"WSP headers: cannot decode date '%s'",
2208 wsp_string_to_connection(value));
2214 wsp_string_to_encoding(value));
2223 wsp_string_to_versioned_header(value,
WSP_1_2));
2232 language = wsp_string_to_language(value);
2246 wsp_string_to_method(value));
2253 wsp_string_to_ranges(value));
2260 long first_byte_pos;
2271 if (pos < 0 || first_byte_pos < 0)
2286 if (pos < 0 || last_byte_pos < 0)
2295 if (last_byte_pos >= 0)
2304 if (pos < 0 || suffix_length < 0)
2321 wsp_string_to_transfer_encoding(value));
2333 media = wsp_string_to_versioned_content_type(value,
WSP_1_2);
2362 charset = wsp_string_to_charset(value);
2407 warning(0,
"Cannot encode q-value in Accept-Encoding.");
2410 warning(0,
"Cannot encode q=0 in Accept-Encoding; skipping this encoding.");
2424 language = wsp_string_to_language(value);
2460 wsp_string_to_cache_control(
parm->key));
2464 tmp = wsp_string_to_cache_control(
parm->key);
2485 case WSP_CACHE_CONTROL_NO_CACHE:
2486 case WSP_CACHE_CONTROL_PRIVATE:
2500 case WSP_CACHE_CONTROL_MAX_AGE:
2501 case WSP_CACHE_CONTROL_MAX_STALE:
2502 case WSP_CACHE_CONTROL_MIN_FRESH:
2532 disposition = wsp_string_to_disposition(value);
2534 if (disposition >= 0) {
2542 warning(0,
"WSP: Cannot encode Content-Disposition '%s'.",
2559 long firstbyte, lastbyte, instancelen;
2601 if (lastbyte < firstbyte || instancelen < lastbyte) {
2602 warning(0,
"WSP: Content-Range '%s' is invalid.",
2616 warning(0,
"WSP: Cannot parse Content-Range '%s'.",
2621 warning(0,
"WSP: Cannot encode Content-Range '%s'.",
2721 warning(0,
"WSP: Cannot parse 'Range: %s'.",
2758 } code_transform[] = {
2769 for (i = 0; code_transform[i].rfc2616code >= 0; i++) {
2770 if (code_transform[i].rfc2616code == warn_code)
2771 return code_transform[i].rfc2068code;
2779 long warn_code = -1;
2780 Octstr *warn_agent = NULL;
2781 Octstr *warn_text = NULL;
2786 if (pos < 0 || warn_code < 0)
2789 if (warn_code > 99) {
2798 warning(0,
"WSP: Cannot encode warning code %ld.", warn_code);
2820 if (warn_agent == NULL && warn_text == NULL) {
2827 if (warn_agent == NULL)
2829 if (warn_text == NULL)
2844 warning(0,
"WSP: Cannot parse 'Warning: %s'.",
2860 warning(0,
"WSP: Missing Content-Type header in " 2861 "response, guessing application/octet-stream");
2891 List *elements = NULL;
2905 error(0,
"WSP: Do not know how to encode header type %ld",
2917 if (elements != NULL) {
2922 debug(
"wsp",0,
"WSP: Known header 0x%04lx, value `%s'.",
2942 warning(0,
"WSP headers: `%s' is not a valid HTTP token.",
2970 if (separate_content_type)
2974 for (i = 0; i < len; i++) {
2982 fieldnum = wsp_string_to_versioned_header(fieldname, wsp_version);
2986 if (separate_content_type && fieldnum == WSP_HEADER_CONTENT_TYPE) {
2988 debug(
"wsp",0,
"WSP: content type already handled.");
2989 }
else if (fieldnum < 0) {
2998 warning(0,
"Skipping header: %s: %s",
void error(int err, const char *fmt,...)
void info(int err, const char *fmt,...)
void http_header_get(List *headers, long i, Octstr **name, Octstr **value)
void http_header_add(List *headers, char *name, char *contents)
int parse_peek_char(ParseContext *context)
int parse_get_char(ParseContext *context)
gw_assert(wtls_machine->packet_to_send !=NULL)
void gwlist_append(List *list, void *item)
List * http_header_split_auth_value(Octstr *value)
int octstr_check_range(Octstr *ostr, long pos, long len, octstr_func_t filter)
long date_parse_http(Octstr *date)
void octstr_append(Octstr *ostr1, const Octstr *ostr2)
long gwlist_len(List *list)
void * gwlist_get(List *list, long pos)
void octstr_append_char(Octstr *ostr, int ch)
void octstr_binary_to_base64(Octstr *ostr)
long http_header_quoted_string_len(Octstr *header, long start)
void octstr_insert_data(Octstr *ostr, long pos, const char *data, long len)
void octstr_strip_blanks(Octstr *text)
#define octstr_get_cstr(ostr)
void parse_skip_to_limit(ParseContext *context)
#define octstr_copy(ostr, from, len)
long octstr_search_char(const Octstr *ostr, int ch, long pos)
int parse_pop_limit(ParseContext *context)
Octstr * octstr_imm(const char *cstr)
void octstr_insert(Octstr *ostr1, const Octstr *ostr2, long pos)
void gwlist_delete(List *list, long pos, long count)
void octstr_delete(Octstr *ostr1, long pos, long len)
List * http_create_empty_headers(void)
int octstr_ncompare(const Octstr *ostr1, const Octstr *ostr2, long n)
Octstr * parse_get_octets(ParseContext *context, long length)
#define octstr_duplicate(ostr)
#define octstr_dump(ostr, level,...)
#define http_header_find_first(headers, name)
List * http_header_split_value(Octstr *value)
int octstr_case_compare(const Octstr *os1, const Octstr *os2)
void parse_set_error(ParseContext *context)
void warning(int err, const char *fmt,...)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
void octstr_destroy_item(void *os)
const char * content_type
void octstr_base64_to_binary(Octstr *ostr)
int parse_limit(ParseContext *context, long length)
long octstr_len(const Octstr *ostr)
void octstr_append_uintvar(Octstr *ostr, unsigned long value)
int parse_skip(ParseContext *context, long count)
void octstr_append_decimal(Octstr *ostr, long value)
void parse_context_destroy(ParseContext *context)
void * gwlist_consume(List *list)
void debug(const char *place, int err, const char *fmt,...)
int octstr_str_compare(const Octstr *ostr, const char *str)
long octstr_parse_long(long *nump, Octstr *ostr, long pos, int base)
Octstr * parse_get_nul_string(ParseContext *context)
unsigned long parse_get_uintvar(ParseContext *context)
Octstr * date_format_http(unsigned long unixtime)
int parse_error(ParseContext *context)
int octstr_get_char(const Octstr *ostr, long pos)
void octstr_set_char(Octstr *ostr, long pos, int ch)
void parse_clear_error(ParseContext *context)
ParseContext * parse_context_create(Octstr *str)
long parse_octets_left(ParseContext *context)
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)