Browse Source

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.
PEAR_1_4DEV
Sara Golemon 23 years ago
parent
commit
18588497d7
  1. 2
      NEWS
  2. 37
      ext/standard/http_fopen_wrapper.c

2
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)

37
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 */

Loading…
Cancel
Save