summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSara Golemon <pollita@php.net>2004-01-30 00:24:18 +0000
committerSara Golemon <pollita@php.net>2004-01-30 00:24:18 +0000
commit18588497d7728669fe54160933d83c6c96b0b87c (patch)
treee30b285ca15f66bf5dba23ff64cfb34bc92c814b
parent26cb17718c31b9cb9fd9648228bc02f733488884 (diff)
downloadphp-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--NEWS2
-rw-r--r--ext/standard/http_fopen_wrapper.c37
2 files changed, 29 insertions, 10 deletions
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 */