]> granicus.if.org Git - php/commitdiff
Follow 308 Permanent Redirect responses.
authorAdam Harvey <aharvey@php.net>
Fri, 13 Jun 2014 01:12:53 +0000 (18:12 -0700)
committerAdam Harvey <aharvey@php.net>
Fri, 13 Jun 2014 01:12:53 +0000 (18:12 -0700)
Fixes bug #67430 (http:// wrapper doesn't follow 308 redirects).

NEWS
ext/standard/http_fopen_wrapper.c
ext/standard/tests/http/bug67430.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 83428f0f3a007f61b06eb7f65447fb0c4efcc440..24253a877c568496773e4bea7f08f95d504b7555 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,9 @@ PHP                                                                        NEWS
   . Implemented FR #67429 (CLI server is missing some new HTTP response codes).
     (Adam)
 
+- Streams:
+  . Fixed bug #67430 (http:// wrapper doesn't follow 308 redirects). (Adam)
+
 ?? ??? 2014, PHP 5.4.30
 
 - Core:
index 7e4fdb43cbec10be9ebf648758d2c4912c3003b6..13614ae3b77dcc1a946eae2c71944e2a2b791010 100644 (file)
@@ -736,10 +736,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 (file)
index 0000000..d4474fd
--- /dev/null
@@ -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