Bugfix: sometimes servers send \n instead of \r\n

event_stream
Ryan Dahl 15 years ago
parent 1d9ebac036
commit 6108b765ce

@ -930,8 +930,10 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
} }
if (ch == LF) { if (ch == LF) {
// XXX recover from this? nginx does. /* they might be just sending \n instead of \r\n so this would be
goto error; * the second \n to denote the end of headers*/
state = s_headers_almost_done;
goto headers_almost_done;
} }
c = LOWER(ch); 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) { if (ch == LF) {
CALLBACK(header_value); CALLBACK(header_value);
state = s_header_field_start; goto header_almost_done;
break;
} }
break; 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: case s_header_almost_done:
header_almost_done:
{ {
STRICT_CHECK(ch != LF); 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: case s_headers_almost_done:
headers_almost_done:
{ {
STRICT_CHECK(ch != LF); STRICT_CHECK(ch != LF);

@ -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 */ , {.name= NULL } /* sentinel */
}; };

Loading…
Cancel
Save