diff --git a/http_parser.c b/http_parser.c index 5576911..9088af7 100644 --- a/http_parser.c +++ b/http_parser.c @@ -930,8 +930,10 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state } if (ch == LF) { - // XXX recover from this? nginx does. - goto error; + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + state = s_headers_almost_done; + goto headers_almost_done; } c = LOWER(ch); @@ -1137,8 +1139,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state if (ch == LF) { CALLBACK(header_value); - state = s_header_field_start; - break; + goto header_almost_done; } break; } @@ -1205,6 +1206,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state } case s_header_almost_done: + header_almost_done: { STRICT_CHECK(ch != LF); @@ -1227,6 +1229,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state } case s_headers_almost_done: + headers_almost_done: { STRICT_CHECK(ch != LF); diff --git a/test.c b/test.c index 6fdc372..5f4c418 100644 --- a/test.c +++ b/test.c @@ -579,6 +579,27 @@ const struct message responses[] = } +#define NO_CARRIAGE_RET 5 +, {.name="no carriage ret" + ,.type= RESPONSE + ,.raw= "HTTP/1.1 200 OK\n" + "Content-Type: text/html; charset=utf-8\n" + "Connection: close\n" + "\n" + "these headers are from http://news.ycombinator.com/" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/html; charset=utf-8" } + , {"Connection", "close" } + } + ,.body= "these headers are from http://news.ycombinator.com/" + } + , {.name= NULL } /* sentinel */ };