diff options
author | Sara Golemon <pollita@php.net> | 2004-01-30 00:24:18 +0000 |
---|---|---|
committer | Sara Golemon <pollita@php.net> | 2004-01-30 00:24:18 +0000 |
commit | 18588497d7728669fe54160933d83c6c96b0b87c (patch) | |
tree | e30b285ca15f66bf5dba23ff64cfb34bc92c814b | |
parent | 26cb17718c31b9cb9fd9648228bc02f733488884 (diff) | |
download | php-git-18588497d7728669fe54160933d83c6c96b0b87c.tar.gz |
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.
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/standard/http_fopen_wrapper.c | 37 |
2 files changed, 29 insertions, 10 deletions
@@ -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 */ |