From: Dmitry Stogov Date: Fri, 28 Nov 2008 14:20:58 +0000 (+0000) Subject: Fixed bug #41534 (SoapClient over HTTPS fails to reestablish connection) X-Git-Tag: php-5.3.0alpha2~51 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=91907961203fe72e55500fd6a758f90b9ad03406;p=php Fixed bug #41534 (SoapClient over HTTPS fails to reestablish connection) --- diff --git a/NEWS b/NEWS index a900f14170..f178fc7b31 100644 --- a/NEWS +++ b/NEWS @@ -93,6 +93,8 @@ PHP NEWS (David C.) - Fixed bug #44154 (pdo->errorInfo() always have three elements in the returned array). (David C.) +- Fixed bug #41534 (SoapClient over HTTPS fails to reestablish connection). + (Dmitry) 02 Sep 2008, PHP 5.3.0 Alpha 2 diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c index 4f886a8ee5..9bbb06b39b 100644 --- a/ext/soap/php_http.c +++ b/ext/soap/php_http.c @@ -31,30 +31,6 @@ static int get_http_headers(php_stream *socketd,char **response, int *out_size T #define smart_str_append_const(str, const) \ smart_str_appendl(str,const,sizeof(const)-1) -static int stream_alive(php_stream *stream TSRMLS_DC) -{ - int socket; - char buf; - - /* maybe better to use: - * php_stream_set_option(stream, PHP_STREAM_OPTION_CHECK_LIVENESS, 0, NULL) - * here instead */ - - if (stream == NULL || stream->eof || php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT, (void**)&socket, 0) != SUCCESS) { - return FALSE; - } - if (socket == -1) { - return FALSE; - } else { - if (php_pollfd_for_ms(socket, PHP_POLLREADABLE, 0) > 0) { - if (0 == recv(socket, &buf, sizeof(buf), MSG_PEEK) && php_socket_errno() != EAGAIN) { - return FALSE; - } - } - } - return TRUE; -} - /* Proxy HTTP Authentication */ void proxy_authentication(zval* this_ptr, smart_str* soap_headers TSRMLS_DC) { @@ -364,7 +340,7 @@ try_again: } /* Check if keep-alive connection is still opened */ - if (stream != NULL && !stream_alive(stream TSRMLS_CC)) { + if (stream != NULL && php_stream_eof(stream)) { php_stream_close(stream); zend_hash_del(Z_OBJPROP_P(this_ptr), "httpurl", sizeof("httpurl")); zend_hash_del(Z_OBJPROP_P(this_ptr), "httpsocket", sizeof("httpsocket")); @@ -909,6 +885,7 @@ try_again: efree(cookie); } + /* See if the server requested a close */ if (http_1_1) { http_close = FALSE; if (use_proxy && !use_ssl) { @@ -920,8 +897,35 @@ try_again: efree(connection); } } + if (http_close == FALSE) { + connection = get_http_header_value(http_headers,"Connection: "); + if (connection) { + if (strncasecmp(connection, "close", sizeof("close")-1) == 0) { + http_close = TRUE; + } + efree(connection); + } + } } else { http_close = TRUE; + if (use_proxy && !use_ssl) { + connection = get_http_header_value(http_headers,"Proxy-Connection: "); + if (connection) { + if (strncasecmp(connection, "Keep-Alive", sizeof("Keep-Alive")-1) == 0) { + http_close = FALSE; + } + efree(connection); + } + } + if (http_close == TRUE) { + connection = get_http_header_value(http_headers,"Connection: "); + if (connection) { + if (strncasecmp(connection, "Keep-Alive", sizeof("Keep-Alive")-1) == 0) { + http_close = FALSE; + } + efree(connection); + } + } } if (!get_http_body(stream, http_close, http_headers, &http_body, &http_body_size TSRMLS_CC)) { @@ -940,31 +944,6 @@ try_again: if (request != buf) {efree(request);} - /* See if the server requested a close */ - http_close = TRUE; - connection = get_http_header_value(http_headers,"Proxy-Connection: "); - if (connection) { - if (strncasecmp(connection, "Keep-Alive", sizeof("Keep-Alive")-1) == 0) { - http_close = FALSE; - } - efree(connection); -/* - } else if (http_1_1) { - http_close = FALSE; -*/ - } - connection = get_http_header_value(http_headers,"Connection: "); - if (connection) { - if (strncasecmp(connection, "Keep-Alive", sizeof("Keep-Alive")-1) == 0) { - http_close = FALSE; - } - efree(connection); -/* - } else if (http_1_1) { - http_close = FALSE; -*/ - } - if (http_close) { php_stream_close(stream); zend_hash_del(Z_OBJPROP_P(this_ptr), "httpsocket", sizeof("httpsocket"));