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)