From: Sara Golemon Date: Fri, 30 Jan 2004 00:24:18 +0000 (+0000) Subject: Fix potential bug in http:// proxy support. X-Git-Tag: php-5.0.0b4RC1~228 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=18588497d7728669fe54160933d83c6c96b0b87c;p=php Fix potential bug in http:// proxy support. Some proxy servers require entire URI be sent in request string. Add context option "http"/"request_fulluri" to allow this behavior. --- diff --git a/NEWS b/NEWS index 122b4af4f6..ab6bd2fae9 100644 --- a/NEWS +++ b/NEWS @@ -54,6 +54,8 @@ PHP NEWS - Fixed bug #24608 (__set not triggered when overloading with array). (Stanislav) - Fixed bug #24243 (enabling browscap causes segfault). (Wez) +- Added context option "http"/"request_fulluri" to send entire URI in request. + Required format for some proxies. (Sara) - Added third optional parameter 'strict' to array_keys(). Works like the 'strict' parameter of in_array(). Feature request #24258. (Andrey) diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index 00cd658570..8d21d2485e 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -105,7 +105,7 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, size_t chunk_size = 0, file_size = 0; int eol_detect = 0; char *transport_string, *errstr = NULL; - int transport_len, have_header = 0; + int transport_len, have_header = 0, request_fulluri = 0; if (redirect_max < 1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Circular redirect, aborting."); @@ -189,16 +189,33 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, strcpy(scratch, "GET "); } - /* file */ - if (resource->path && *resource->path) - strlcat(scratch, resource->path, scratch_len); - else - strlcat(scratch, "/", scratch_len); + /* Should we send the entire path in the request line, default to no. */ + if (context && + php_stream_context_get_option(context, "http", "request_fulluri", &tmpzval) == SUCCESS) { + SEPARATE_ZVAL(tmpzval); + convert_to_boolean_ex(tmpzval); + request_fulluri = Z_BVAL_PP(tmpzval) ? 1 : 0; + zval_ptr_dtor(tmpzval); + } + + if (request_fulluri) { + /* Ask for everything */ + strcat(scratch, path); + } else { + /* Send the traditional /path/to/file?query_string */ - /* query string */ - if (resource->query) { - strlcat(scratch, "?", scratch_len); - strlcat(scratch, resource->query, scratch_len); + /* file */ + if (resource->path && *resource->path) { + strlcat(scratch, resource->path, scratch_len); + } else { + strlcat(scratch, "/", scratch_len); + } + + /* query string */ + if (resource->query) { + strlcat(scratch, "?", scratch_len); + strlcat(scratch, resource->query, scratch_len); + } } /* protocol version we are speaking */