summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/soap/TODO1
-rw-r--r--ext/soap/php_http.c187
2 files changed, 92 insertions, 96 deletions
diff --git a/ext/soap/TODO b/ext/soap/TODO
index bb680920e1..3da3773d6b 100644
--- a/ext/soap/TODO
+++ b/ext/soap/TODO
@@ -98,7 +98,6 @@ Transport
---------
? HTTP status codes
? HTTP chunked Transfer-Encoding
-- support fo https:// through proxy
- support for HTTP compression (gzip,x-gzip,defalte)
- transport abstraction layer???
diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c
index 0a801462e2..f2f8da2fbd 100644
--- a/ext/soap/php_http.c
+++ b/ext/soap/php_http.c
@@ -79,6 +79,97 @@ static void proxy_authentication(zval* this_ptr, smart_str* soap_headers)
}
}
+static php_stream* http_connect(zval* this_ptr, php_url *phpurl, int use_ssl, int *use_proxy TSRMLS_DC)
+{
+ php_stream *stream;
+ zval **proxy_host, **proxy_port;
+ char *host;
+#ifdef ZEND_ENGINE_2
+ char *name;
+ long namelen;
+#endif
+ int port;
+ int old_error_reporting;
+
+ if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_proxy_host", sizeof("_proxy_host"), (void **) &proxy_host) == SUCCESS &&
+ Z_TYPE_PP(proxy_host) == IS_STRING &&
+ zend_hash_find(Z_OBJPROP_P(this_ptr), "_proxy_port", sizeof("_proxy_port"), (void **) &proxy_port) == SUCCESS &&
+ Z_TYPE_PP(proxy_port) == IS_LONG) {
+ host = Z_STRVAL_PP(proxy_host);
+ port = Z_LVAL_PP(proxy_port);
+ *use_proxy = 1;
+ } else {
+ host = phpurl->host;
+ port = phpurl->port;
+ }
+
+ old_error_reporting = EG(error_reporting);
+ EG(error_reporting) &= ~(E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE);
+
+#ifdef ZEND_ENGINE_2
+ namelen = spprintf(&name, 0, "%s://%s:%d", (use_ssl && !*use_proxy)? "ssl" : "tcp", host, port);
+ stream = php_stream_xport_create(name, namelen,
+ ENFORCE_SAFE_MODE | REPORT_ERRORS,
+ STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT,
+ NULL /*persistent_id*/,
+ NULL /*timeout*/,
+ NULL, NULL, NULL);
+ efree(name);
+#else
+ stream = php_stream_sock_open_host(host, port, SOCK_STREAM, NULL, NULL);
+#endif
+
+ /* SSL & proxy */
+ if (stream && *use_proxy && use_ssl) {
+ smart_str soap_headers = {0};
+ char *http_headers;
+ int http_header_size;
+
+ smart_str_append_const(&soap_headers, "CONNECT ");
+ smart_str_appends(&soap_headers, phpurl->host);
+ smart_str_appendc(&soap_headers, ':');
+ smart_str_append_unsigned(&soap_headers, phpurl->port);
+ smart_str_append_const(&soap_headers, " HTTP/1.1\r\n");
+ proxy_authentication(this_ptr, &soap_headers);
+ smart_str_append_const(&soap_headers, "\r\n");
+ if (php_stream_write(stream, soap_headers.c, soap_headers.len) != soap_headers.len) {
+ php_stream_close(stream);
+ stream = NULL;
+ }
+ smart_str_free(&soap_headers);
+
+ if (stream) {
+ if (!get_http_headers(stream, &http_headers, &http_header_size TSRMLS_CC) || http_headers == NULL) {
+ php_stream_close(stream);
+ stream = NULL;
+ }
+ efree(http_headers);
+ }
+#ifdef ZEND_ENGINE_2
+ /* enable SSL transport layer */
+ if (stream) {
+ if (php_stream_xport_crypto_setup(stream, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, NULL TSRMLS_CC) < 0 ||
+ php_stream_xport_crypto_enable(stream, 1 TSRMLS_CC) < 0) {
+ php_stream_close(stream);
+ stream = NULL;
+ }
+ }
+#endif
+ }
+
+#if !defined(ZEND_ENGINE_2) && defined(HAVE_OPENSSL_EXT)
+ if (stream && use_ssl) {
+ /* enable SSL transport layer */
+ if (FAILURE == php_stream_sock_ssl_activate(stream, 1)) {
+ php_stream_close(stream);
+ stream = NULL;
+ }
+ }
+#endif
+ EG(error_reporting) = old_error_reporting;
+ return stream;
+}
+
int send_http_soap_request(zval *this_ptr, xmlDoc *doc, char *location, char *soapaction, int soap_version TSRMLS_DC)
{
xmlChar *buf;
@@ -87,7 +178,6 @@ int send_http_soap_request(zval *this_ptr, xmlDoc *doc, char *location, char *so
php_url *phpurl = NULL;
php_stream *stream;
zval **trace, **tmp;
- int old_error_reporting;
int use_proxy = 0;
int use_ssl;
@@ -156,75 +246,7 @@ int send_http_soap_request(zval *this_ptr, xmlDoc *doc, char *location, char *so
}
if (!stream) {
-#ifdef ZEND_ENGINE_2
- {
- char *res;
- long reslen;
- zval **proxy_host, **proxy_port;
-
- if (!use_ssl &&
- zend_hash_find(Z_OBJPROP_P(this_ptr), "_proxy_host", sizeof("_proxy_host"), (void **) &proxy_host) == SUCCESS &&
- Z_TYPE_PP(proxy_host) == IS_STRING &&
- zend_hash_find(Z_OBJPROP_P(this_ptr), "_proxy_port", sizeof("_proxy_port"), (void **) &proxy_port) == SUCCESS &&
- Z_TYPE_PP(proxy_port) == IS_LONG) {
- use_proxy = 1;
- reslen = spprintf(&res, 0, "tcp://%s:%ld", Z_STRVAL_PP(proxy_host), Z_LVAL_PP(proxy_port));
- } else {
- reslen = spprintf(&res, 0, "%s://%s:%d", use_ssl ? "ssl" : "tcp", phpurl->host, phpurl->port);
- }
-
- old_error_reporting = EG(error_reporting);
- EG(error_reporting) &= ~(E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE);
- stream = php_stream_xport_create(res, reslen,
- ENFORCE_SAFE_MODE | REPORT_ERRORS,
- STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT,
- NULL /*persistent_id*/,
- NULL /*timeout*/,
- NULL, NULL, NULL);
- EG(error_reporting) = old_error_reporting;
-
- efree(res);
- }
-#else
- {
- char *res;
- zval **proxy_host, **proxy_port;
-
- old_error_reporting = EG(error_reporting);
- EG(error_reporting) &= ~(E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE);
- if (!use_ssl &&
- zend_hash_find(Z_OBJPROP_P(this_ptr), "_proxy_host", sizeof("_proxy_host"), (void **) &proxy_host) == SUCCESS &&
- Z_TYPE_PP(proxy_host) == IS_STRING &&
- zend_hash_find(Z_OBJPROP_P(this_ptr), "_proxy_port", sizeof("_proxy_port"), (void **) &proxy_port) == SUCCESS &&
- Z_TYPE_PP(proxy_port) == IS_LONG) {
- use_proxy = 1;
- stream = php_stream_sock_open_host(Z_STRVAL_PP(proxy_host), Z_LVAL_PP(proxy_port), SOCK_STREAM, NULL, NULL);
- } else {
-#ifdef ZTS
- stream = php_stream_sock_open_host(phpurl->host, (unsigned short)phpurl->port, SOCK_STREAM, NULL, NULL);
-#else
- spprintf(&res, 0, "%s://%s:%d", use_ssl ? "ssl" : "tcp", phpurl->host, phpurl->port);
- stream = php_stream_sock_open_host(phpurl->host, (unsigned short)phpurl->port, SOCK_STREAM, NULL, res);
- efree(res);
-#endif
- }
- EG(error_reporting) = old_error_reporting;
- if (stream && use_ssl) {
-#ifdef HAVE_OPENSSL_EXT
- if (FAILURE == php_stream_sock_ssl_activate(stream, 1)) {
-#endif
- php_stream_close(stream);
- xmlFree(buf);
- php_url_free(phpurl);
- add_soap_fault(this_ptr, "HTTP", "SSL Connection attempt failed", NULL, NULL TSRMLS_CC);
- return FALSE;
-#ifdef HAVE_OPENSSL_EXT
- }
-#endif
- }
- }
-#endif
-
+ stream = http_connect(this_ptr, phpurl, use_ssl, &use_proxy TSRMLS_CC);
if (stream) {
php_stream_auto_cleanup(stream);
add_property_resource(this_ptr, "httpsocket", php_stream_get_resource_id(stream));
@@ -237,31 +259,6 @@ int send_http_soap_request(zval *this_ptr, xmlDoc *doc, char *location, char *so
}
}
- /* TODO: SSL & proxy */
-/*
- if (stream && use_proxy && use_ssl) {
- char *http_headers;
- int http_header_size;
-
- smart_str_append_const(&soap_headers, "CONNECT ");
- smart_str_appends(&soap_headers, phpurl->host);
- smart_str_appendc(&soap_headers, ':');
- smart_str_append_unsigned(&soap_headers, phpurl->port);
- smart_str_append_const(&soap_headers, " HTTP/1.1\r\n");
- proxy_authentication(this_ptr, &soap_headers);
- smart_str_append_const(&soap_headers, "\r\n");
- err = php_stream_write(stream, soap_headers.c, soap_headers.len);
- if (err != soap_headers.len) {
- }
- smart_str_free(&soap_headers);
-
- if (!get_http_headers(stream, &http_headers, &http_header_size TSRMLS_CC) || http_headers == NULL) {
- }
- efree(http_headers);
- FIXME: How to enbale SSL here???
- }
-*/
-
if (stream) {
zval **cookies, **login, **password;