WebSocket: fix header parsing

This commit is contained in:
Přemysl Eric Janouch 2017-02-06 18:28:40 +01:00
parent 2b7d455471
commit a785dc9670
Signed by: p
GPG Key ID: B715679E3A361BE6

View File

@ -476,7 +476,7 @@ struct ws_handler
// HTTP handshake: // HTTP handshake:
http_parser hp; ///< HTTP parser http_parser hp; ///< HTTP parser
bool parsing_header_value; ///< Parsing header value or field? bool have_header_value; ///< Parsing header value or field?
struct str field; ///< Field part buffer struct str field; ///< Field part buffer
struct str value; ///< Value part buffer struct str value; ///< Value part buffer
struct str_map headers; ///< HTTP Headers struct str_map headers; ///< HTTP Headers
@ -873,14 +873,14 @@ static int
ws_handler_on_header_field (http_parser *parser, const char *at, size_t len) ws_handler_on_header_field (http_parser *parser, const char *at, size_t len)
{ {
struct ws_handler *self = parser->data; struct ws_handler *self = parser->data;
if (self->parsing_header_value) if (self->have_header_value)
{ {
ws_handler_on_header_read (self); ws_handler_on_header_read (self);
str_reset (&self->field); str_reset (&self->field);
str_reset (&self->value); str_reset (&self->value);
} }
str_append_data (&self->field, at, len); str_append_data (&self->field, at, len);
self->parsing_header_value = false; self->have_header_value = false;
return 0; return 0;
} }
@ -889,13 +889,17 @@ ws_handler_on_header_value (http_parser *parser, const char *at, size_t len)
{ {
struct ws_handler *self = parser->data; struct ws_handler *self = parser->data;
str_append_data (&self->value, at, len); str_append_data (&self->value, at, len);
self->parsing_header_value = true; self->have_header_value = true;
return 0; return 0;
} }
static int static int
ws_handler_on_headers_complete (http_parser *parser) ws_handler_on_headers_complete (http_parser *parser)
{ {
struct ws_handler *self = parser->data;
if (self->have_header_value)
ws_handler_on_header_read (self);
// We strictly require a protocol upgrade // We strictly require a protocol upgrade
if (!parser->upgrade) if (!parser->upgrade)
return 2; return 2;