summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Harvey <aharvey@php.net>2014-06-12 18:17:18 -0700
committerAdam Harvey <aharvey@php.net>2014-06-12 18:17:18 -0700
commit84f339546a623346e59ec5ba62fdc98fb7d7ecb2 (patch)
treec583a1124a21cd73a7e2e5d164bed2fd6852b56e
parente082199d8ed1fec9ea69e2129ae08584ee3b66dd (diff)
parent25464340087e0e6a2ff663b349630f4423fea033 (diff)
downloadphp-git-84f339546a623346e59ec5ba62fdc98fb7d7ecb2.tar.gz
Merge branch 'PHP-5.5' into PHP-5.6
* PHP-5.5: Follow 308 Permanent Redirect responses.
-rw-r--r--NEWS3
-rw-r--r--ext/standard/http_fopen_wrapper.c5
-rw-r--r--ext/standard/tests/http/bug67430.phpt49
3 files changed, 55 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 1adc56b15f..490ccea7a6 100644
--- a/NEWS
+++ b/NEWS
@@ -42,6 +42,9 @@ PHP NEWS
- SPL:
. Fixed bug #66127 (Segmentation fault with ArrayObject unset). (Stas)
+- Streams:
+ . Fixed bug #67430 (http:// wrapper doesn't follow 308 redirects). (Adam)
+
- Tokenizer:
. Fixed bug #67395 (token_name() does not return name for T_POW and T_POW_EQUAL
token). (Ferenc)
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index 73776ff0b9..1b8d505a4b 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -752,10 +752,11 @@ finish:
SEPARATE_ZVAL(tmpzval);
convert_to_long_ex(tmpzval);
follow_location = Z_LVAL_PP(tmpzval);
- } else if (!(response_code >= 300 && response_code < 304 || 307 == response_code)) {
+ } else if (!(response_code >= 300 && response_code < 304 || 307 == response_code || 308 == response_code)) {
/* we shouldn't redirect automatically
if follow_location isn't set and response_code not in (300, 301, 302, 303 and 307)
- see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.1 */
+ see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.1
+ RFC 7238 defines 308: http://tools.ietf.org/html/rfc7238 */
follow_location = 0;
}
strlcpy(location, http_header_line + 10, sizeof(location));
diff --git a/ext/standard/tests/http/bug67430.phpt b/ext/standard/tests/http/bug67430.phpt
new file mode 100644
index 0000000000..d4474fdf5d
--- /dev/null
+++ b/ext/standard/tests/http/bug67430.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Bug #67430 (http:// wrapper doesn't follow 308 redirects)
+--INI--
+allow_url_fopen=1
+--SKIPIF--
+<?php require 'server.inc'; http_server_skipif('tcp://127.0.0.1:12342'); ?>
+--FILE--
+<?php
+require 'server.inc';
+
+function do_test($follow) {
+ $options = [
+ 'http' => [
+ 'method' => 'POST',
+ 'follow_location' => $follow,
+ ],
+ ];
+
+ $ctx = stream_context_create($options);
+
+ $responses = [
+ "data://text/plain,HTTP/1.1 308\r\nLocation: /foo\r\n\r\n",
+ "data://text/plain,HTTP/1.1 200\r\nConnection: close\r\n\r\n",
+ ];
+ $pid = http_server('tcp://127.0.0.1:12342', $responses, $output);
+
+ $fd = fopen('http://127.0.0.1:12342/', 'rb', false, $ctx);
+ fseek($output, 0, SEEK_SET);
+ echo stream_get_contents($output);
+
+ http_server_kill($pid);
+}
+
+do_test(true);
+do_test(false);
+
+?>
+Done
+--EXPECT--
+POST / HTTP/1.0
+Host: 127.0.0.1:12342
+
+GET /foo HTTP/1.0
+Host: 127.0.0.1:12342
+
+POST / HTTP/1.0
+Host: 127.0.0.1:12342
+
+Done