summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--ext/soap/php_http.c15
2 files changed, 16 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 923f1feb69..3d404cb039 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,7 @@ PHP NEWS
(Pierrick)
- Fixed bug #50632 (filter_input() does not return default value if the
variable does not exist). (Ilia)
+- Fixed bug #48590 (SoapClient does not honor max_redirects). (Sriram)
- Fixed bug #48190 (Content-type parameter "boundary" is not case-insensitive
in HTTP uploads). (Ilia)
- Fixed bug #47409 (extract() problem with array containing word "this").
diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c
index a62c219c99..f14d2309a7 100644
--- a/ext/soap/php_http.c
+++ b/ext/soap/php_http.c
@@ -207,6 +207,7 @@ int make_http_soap_request(zval *this_ptr,
int http_1_1;
int http_status;
int content_type_xml = 0;
+ long redirect_max = 20;
char *content_encoding;
char *http_msg = NULL;
zend_bool old_allow_url_fopen;
@@ -283,6 +284,14 @@ int make_http_soap_request(zval *this_ptr,
context = php_stream_context_from_zval(*tmp, 0);
}
+ if (context &&
+ php_stream_context_get_option(context, "http", "max_redirects", &tmp) == SUCCESS) {
+ if (Z_TYPE_PP(tmp) != IS_STRING || !is_numeric_string(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &redirect_max, NULL, 1)) {
+ if (Z_TYPE_PP(tmp) == IS_LONG)
+ redirect_max = Z_LVAL_PP(tmp);
+ }
+ }
+
try_again:
if (phpurl == NULL || phpurl->host == NULL) {
if (phpurl != NULL) {php_url_free(phpurl);}
@@ -1012,6 +1021,12 @@ try_again:
}
phpurl = new_url;
+ if (--redirect_max < 1) {
+ smart_str_free(&soap_headers_z);
+ add_soap_fault(this_ptr, "HTTP", "Redirection limit reached, aborting", NULL, NULL TSRMLS_CC);
+ return FALSE;
+ }
+
goto try_again;
}
}