diff options
Diffstat (limited to 'ext/standard/http_fopen_wrapper.c')
| -rw-r--r-- | ext/standard/http_fopen_wrapper.c | 6 | 
1 files changed, 4 insertions, 2 deletions
| diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index 85a61167aa..870f904e9c 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -113,6 +113,7 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path,  	int redirected = ((flags & HTTP_WRAPPER_REDIRECTED) != 0);  	int follow_location = 1;  	php_stream_filter *transfer_encoding = NULL; +	int response_code;  	tmp_line[0] = '\0'; @@ -657,7 +658,6 @@ finish:  		if (php_stream_get_line(stream, tmp_line, sizeof(tmp_line) - 1, &tmp_line_len) != NULL) {  			zval *http_response; -			int response_code;  			if (tmp_line_len > 9) {  				response_code = atoi(tmp_line + 9); @@ -731,7 +731,9 @@ finish:  			http_header_line[http_header_line_length] = '\0';  			if (!strncasecmp(http_header_line, "Location: ", 10)) { -				if (context && php_stream_context_get_option(context, "http", "follow_location", &tmpzval) == SUCCESS) { +				/* we only care about Location for 300, 301, 302, 303 and 307 */ +				/* see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.1 */ +				if ((response_code >= 300 && response_code < 304 || 307 == response_code) && context && php_stream_context_get_option(context, "http", "follow_location", &tmpzval) == SUCCESS) {  					SEPARATE_ZVAL(tmpzval);  					convert_to_long_ex(tmpzval);  					follow_location = Z_LVAL_PP(tmpzval); | 
