diff --git a/components/nghttp/port/http_parser.c b/components/nghttp/port/http_parser.c index 8c1f4dd07..ef1ecd48c 100644 --- a/components/nghttp/port/http_parser.c +++ b/components/nghttp/port/http_parser.c @@ -280,8 +280,11 @@ enum state { s_dead = 1 /* important that this is > 0 */ , s_start_req_or_res + , s_res_or_resp_I /* for ICY URIs */ , s_res_or_resp_H , s_start_res + , s_res_I /* for ICY URIs */ + , s_res_IC /* for ICY URIs */ , s_res_H , s_res_HT , s_res_HTT @@ -728,6 +731,10 @@ reexecute: if (ch == 'H') { UPDATE_STATE(s_res_or_resp_H); + CALLBACK_NOTIFY(message_begin); + } else if (ch == 'I') { + UPDATE_STATE(s_res_or_resp_I); + CALLBACK_NOTIFY(message_begin); } else { parser->type = HTTP_REQUEST; @@ -738,6 +745,13 @@ reexecute: break; } + case s_res_or_resp_I: /* ICY URI case */ + if (ch == 'C') { + parser->type = HTTP_RESPONSE; + UPDATE_STATE(s_res_IC); + } + break; + case s_res_or_resp_H: if (ch == 'T') { parser->type = HTTP_RESPONSE; @@ -764,7 +778,9 @@ reexecute: case 'H': UPDATE_STATE(s_res_H); break; - + case 'I': /* ICY URI */ + UPDATE_STATE(s_res_I); + break; case CR: case LF: break; @@ -777,6 +793,15 @@ reexecute: CALLBACK_NOTIFY(message_begin); break; } + case s_res_I: + STRICT_CHECK(ch != 'C'); + UPDATE_STATE(s_res_IC); + break; + + case s_res_IC: + STRICT_CHECK(ch != 'Y'); + UPDATE_STATE(s_res_http_minor); + break; case s_res_H: STRICT_CHECK(ch != 'T');