From 4683377dfa6a81e632940abd92b0cbee330f89f5 Mon Sep 17 00:00:00 2001 From: Rowan Collins Date: Tue, 11 Oct 2016 21:12:18 +0000 Subject: [PATCH 1/5] Add failing test for bug#73297 --- ext/standard/tests/http/bug73297.phpt | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 ext/standard/tests/http/bug73297.phpt diff --git a/ext/standard/tests/http/bug73297.phpt b/ext/standard/tests/http/bug73297.phpt new file mode 100644 index 00000000000..3575ccbcaa7 --- /dev/null +++ b/ext/standard/tests/http/bug73297.phpt @@ -0,0 +1,41 @@ +--TEST-- +Bug #73297 (Ignore 100 Continue returned by HTTP/1.1 servers) +--INI-- +allow_url_fopen=1 +--SKIPIF-- + +--FILE-- + [ + 'protocol_version' => '1.1', + 'header' => 'Connection: Close' + ], + ]; + + $ctx = stream_context_create($options); + + $responses = [ + "data://text/plain,HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n\r\n" + . "Hello" + ]; + $pid = http_server('tcp://127.0.0.1:12342', $responses); + + echo file_get_contents('http://127.0.0.1:12342/', false, $ctx); + echo "\n"; + + http_server_kill($pid); +} + +do_test(); +echo "\n"; + +?> +--EXPECT-- +Hello + From 94374c51e71854895f941ab4ea3933a91a89cdd9 Mon Sep 17 00:00:00 2001 From: Rowan Collins Date: Sun, 23 Oct 2016 18:24:58 +0000 Subject: [PATCH 2/5] http_fopen_wrapper.c - bug#73297 Skip past "100 Continue" responses --- ext/standard/http_fopen_wrapper.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index 02b580fa289..72fa1894b60 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -697,6 +697,24 @@ finish: if ((options & STREAM_ONLY_GET_HEADERS) || ignore_errors) { reqok = 1; } + + /* status codes of 1xx are "informational", and will be followed by a real response + * e.g "100 Continue". RFC 7231 states that unexpected 1xx status MUST be parsed, + * and MAY be ignored. As such, we need to skip ahead to the "real" status*/ + if (response_code >= 100 && response_code < 200) { + /* consume lines until we find a line starting 'HTTP/1' */ + while ( + !php_stream_eof(stream) + && php_stream_get_line(stream, tmp_line, sizeof(tmp_line) - 1, &tmp_line_len) != NULL + && ( tmp_line_len < 6 || strncasecmp(tmp_line, "HTTP/1", 6) ) + ); + + if (tmp_line_len > 9) { + response_code = atoi(tmp_line + 9); + } else { + response_code = 0; + } + } /* all status codes in the 2xx range are defined by the specification as successful; * all status codes in the 3xx range are for redirection, and so also should never * fail */ From 66ac73bee8d14673332c76fe62c7fcab00f5c5c4 Mon Sep 17 00:00:00 2001 From: Rowan Collins Date: Mon, 24 Oct 2016 18:01:17 +0000 Subject: [PATCH 3/5] Simplify ext/standard/tests/http/bug73297.phpt --- ext/standard/tests/http/bug73297.phpt | 38 +++++++++++---------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/ext/standard/tests/http/bug73297.phpt b/ext/standard/tests/http/bug73297.phpt index 3575ccbcaa7..0b0e02f3fd0 100644 --- a/ext/standard/tests/http/bug73297.phpt +++ b/ext/standard/tests/http/bug73297.phpt @@ -8,34 +8,26 @@ allow_url_fopen=1 [ + 'protocol_version' => '1.1', + 'header' => 'Connection: Close' + ], +]; -function do_test() { - $options = [ - 'http' => [ - 'protocol_version' => '1.1', - 'header' => 'Connection: Close' - ], - ]; +$ctx = stream_context_create($options); - $ctx = stream_context_create($options); +$responses = [ + "data://text/plain,HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n\r\n" + . "Hello" +]; +$pid = http_server('tcp://127.0.0.1:12342', $responses); - $responses = [ - "data://text/plain,HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\n\r\n" - . "Hello" - ]; - $pid = http_server('tcp://127.0.0.1:12342', $responses); - - echo file_get_contents('http://127.0.0.1:12342/', false, $ctx); - echo "\n"; - - http_server_kill($pid); -} - -do_test(); +echo file_get_contents('http://127.0.0.1:12342/', false, $ctx); echo "\n"; +http_server_kill($pid); + ?> --EXPECT-- Hello - From 4b2cbc3f2fab8721887d53536916b15e870a7272 Mon Sep 17 00:00:00 2001 From: Julien Pauli Date: Thu, 17 Nov 2016 11:33:36 +0100 Subject: [PATCH 4/5] Improvement for bug73297 --- ext/standard/http_fopen_wrapper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index 72fa1894b60..f5f338c144d 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -706,7 +706,7 @@ finish: while ( !php_stream_eof(stream) && php_stream_get_line(stream, tmp_line, sizeof(tmp_line) - 1, &tmp_line_len) != NULL - && ( tmp_line_len < 6 || strncasecmp(tmp_line, "HTTP/1", 6) ) + && ( tmp_line_len < sizeof("HTTP/1") - 1 || strncasecmp(tmp_line, "HTTP/1", sizeof("HTTP/1") - 1) ) ); if (tmp_line_len > 9) { From 0e03003db26769e2585afca669bc2674f656d9cd Mon Sep 17 00:00:00 2001 From: Julien Pauli Date: Thu, 17 Nov 2016 11:48:32 +0100 Subject: [PATCH 5/5] Updated NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index b4c3249efa3..02c8d33e242 100644 --- a/NEWS +++ b/NEWS @@ -34,6 +34,10 @@ PHP NEWS - SQLite3: . Fixed bug #73530 (Unsetting result set may reset other result set). (cmb) +- Standard: + . Fixed bug #73297 (HTTP stream wrapper should ignore HTTP 100 Continue). + (rowan dot collins at gmail dot com) + - XML: . Fixed bug #72135 (malformed XML causes fault) (edgarsandi)