Update http-parser to feae95a3a69f111bc1897b9048d9acbc290992f9

This commit is contained in:
Tatsuhiro Tsujikawa 2016-10-16 17:56:24 +09:00
parent 3de2654223
commit a5d66e71d0
4 changed files with 36 additions and 10 deletions

View File

@ -148,7 +148,7 @@ callback in a threadsafe manner. This allows http-parser to be used in
multi-threaded contexts. multi-threaded contexts.
Example: Example:
``` ```c
typedef struct { typedef struct {
socket_t sock; socket_t sock;
void* buffer; void* buffer;
@ -184,7 +184,7 @@ void http_parser_thread(socket_t sock) {
parser supplied to callback functions */ parser supplied to callback functions */
parser->data = my_data; parser->data = my_data;
http_parser_settings settings; / * set up callbacks */ http_parser_settings settings; /* set up callbacks */
settings.on_url = my_url_callback; settings.on_url = my_url_callback;
/* execute parser */ /* execute parser */

View File

@ -1366,12 +1366,7 @@ reexecute:
|| c != CONTENT_LENGTH[parser->index]) { || c != CONTENT_LENGTH[parser->index]) {
parser->header_state = h_general; parser->header_state = h_general;
} else if (parser->index == sizeof(CONTENT_LENGTH)-2) { } else if (parser->index == sizeof(CONTENT_LENGTH)-2) {
if (parser->flags & F_CONTENTLENGTH) {
SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
goto error;
}
parser->header_state = h_content_length; parser->header_state = h_content_length;
parser->flags |= F_CONTENTLENGTH;
} }
break; break;
@ -1474,6 +1469,12 @@ reexecute:
goto error; goto error;
} }
if (parser->flags & F_CONTENTLENGTH) {
SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
goto error;
}
parser->flags |= F_CONTENTLENGTH;
parser->content_length = ch - '0'; parser->content_length = ch - '0';
break; break;

View File

@ -27,7 +27,7 @@ extern "C" {
/* Also update SONAME in the Makefile whenever you change these. */ /* Also update SONAME in the Makefile whenever you change these. */
#define HTTP_PARSER_VERSION_MAJOR 2 #define HTTP_PARSER_VERSION_MAJOR 2
#define HTTP_PARSER_VERSION_MINOR 7 #define HTTP_PARSER_VERSION_MINOR 7
#define HTTP_PARSER_VERSION_PATCH 0 #define HTTP_PARSER_VERSION_PATCH 1
#include <sys/types.h> #include <sys/types.h>
#if defined(_WIN32) && !defined(__MINGW32__) && \ #if defined(_WIN32) && !defined(__MINGW32__) && \

View File

@ -1745,6 +1745,32 @@ const struct message responses[] =
,.body= "" ,.body= ""
} }
#define CONTENT_LENGTH_X 21
, {.name= "Content-Length-X"
,.type= HTTP_RESPONSE
,.raw= "HTTP/1.1 200 OK\r\n"
"Content-Length-X: 0\r\n"
"Transfer-Encoding: chunked\r\n"
"\r\n"
"2\r\n"
"OK\r\n"
"0\r\n"
"\r\n"
,.should_keep_alive= TRUE
,.message_complete_on_eof= FALSE
,.http_major= 1
,.http_minor= 1
,.status_code= 200
,.response_status= "OK"
,.num_headers= 2
,.headers= { { "Content-Length-X", "0" }
, { "Transfer-Encoding", "chunked" }
}
,.body= "OK"
,.num_chunks_complete= 2
,.chunk_lengths= { 2 }
}
, {.name= NULL } /* sentinel */ , {.name= NULL } /* sentinel */
}; };
@ -3850,11 +3876,10 @@ test_message_connect (const struct message *msg)
{ {
char *buf = (char*) msg->raw; char *buf = (char*) msg->raw;
size_t buflen = strlen(msg->raw); size_t buflen = strlen(msg->raw);
size_t nread;
parser_init(msg->type); parser_init(msg->type);
nread = parse_connect(buf, buflen); parse_connect(buf, buflen);
if (num_messages != 1) { if (num_messages != 1) {
printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name);