. 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:
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));
--- /dev/null
+--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