int http_parser_skip_token(struct http_parser *parser) { /* token = 1*tchar */ if (parser->cur >= parser->end || !http_char_is_token(*parser->cur)) return 0; parser->cur++; while (parser->cur < parser->end && http_char_is_token(*parser->cur)) parser->cur++; return 1; }
int http_parse_token(struct http_parser *parser, const char **token_r) { const unsigned char *first; /* token = 1*tchar */ if (parser->cur >= parser->end || !http_char_is_token(*parser->cur)) return 0; first = parser->cur++; while (parser->cur < parser->end && http_char_is_token(*parser->cur)) parser->cur++; *token_r = t_strndup(first, parser->cur - first); return 1; }
static int http_transfer_chunked_skip_token (struct http_transfer_chunked_istream *tcstream) { const unsigned char *first = tcstream->cur; /* token = 1*tchar */ while (tcstream->cur < tcstream->end && http_char_is_token(*tcstream->cur)) tcstream->cur++; tcstream->parsed_chars += (tcstream->cur-first); if (tcstream->cur == tcstream->end) return 0; if (tcstream->parsed_chars == 0) return -1; return 1; }
static int http_header_parse_name(struct http_header_parser *parser) { const unsigned char *first = parser->cur; /* field-name = token token = 1*tchar */ while (parser->cur < parser->end && http_char_is_token(*parser->cur)) parser->cur++; str_append_n(parser->name, first, parser->cur-first); if (parser->cur == parser->end) return 0; if (str_len(parser->name) == 0) { parser->error = "Empty header field name"; return -1; } return 1; }
static int http_request_parse_method(struct http_request_parser *parser) { const unsigned char *p = parser->parser.cur; /* method = token */ while (p < parser->parser.end && http_char_is_token(*p)) p++; if ((p - parser->parser.cur) > HTTP_REQUEST_PARSER_MAX_METHOD_LENGTH) { parser->error_code = HTTP_REQUEST_PARSE_ERROR_METHOD_TOO_LONG; parser->parser.error = "HTTP request method is too long"; return -1; } if (p == parser->parser.end) return 0; parser->request_method = p_strdup_until(parser->parser.msg.pool, parser->parser.cur, p); parser->parser.cur = p; return 1; }