dmitry          Wed Feb 25 09:04:43 2004 EDT

  Modified files:              
    /php-src/ext/soap   TODO php_http.c php_soap.h soap.c 
  Log:
  HTTP compression support (gzip and deflate) 
  
  
http://cvs.php.net/diff.php/php-src/ext/soap/TODO?r1=1.48&r2=1.49&ty=u
Index: php-src/ext/soap/TODO
diff -u php-src/ext/soap/TODO:1.48 php-src/ext/soap/TODO:1.49
--- php-src/ext/soap/TODO:1.48  Tue Feb 24 10:35:53 2004
+++ php-src/ext/soap/TODO       Wed Feb 25 09:04:41 2004
@@ -88,7 +88,7 @@
 ---------
 ? HTTP status codes
 ? HTTP chunked Transfer-Encoding
-- support for HTTP compression (gzip,x-gzip,defalte)
+? support for HTTP compression (gzip,x-gzip,defalte)
 - transport abstraction layer???
 
 Interop Testing
http://cvs.php.net/diff.php/php-src/ext/soap/php_http.c?r1=1.45&r2=1.46&ty=u
Index: php-src/ext/soap/php_http.c
diff -u php-src/ext/soap/php_http.c:1.45 php-src/ext/soap/php_http.c:1.46
--- php-src/ext/soap/php_http.c:1.45    Fri Feb 20 10:38:39 2004
+++ php-src/ext/soap/php_http.c Wed Feb 25 09:04:41 2004
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_http.c,v 1.45 2004/02/20 15:38:39 dmitry Exp $ */
+/* $Id: php_http.c,v 1.46 2004/02/25 14:04:41 dmitry Exp $ */
 
 #include "php_soap.h"
 #include "ext/standard/base64.h"
@@ -173,9 +173,9 @@
 
 int send_http_soap_request(zval *this_ptr, xmlDoc *doc, char *location, char 
*soapaction, int soap_version TSRMLS_DC)
 {
-       xmlChar *buf;
+       xmlChar *buf, *request;
        smart_str soap_headers = {0};
-       int buf_size,err;
+       int buf_size, request_size, err;
        php_url *phpurl = NULL;
        php_stream *stream;
        zval **trace, **tmp;
@@ -305,8 +305,62 @@
                                smart_str_append_const(&soap_headers, "\"\r\n");
                        }
                }
+
+         request = buf;
+         request_size = buf_size;
+               if (zend_hash_find(Z_OBJPROP_P(this_ptr), "compression", 
sizeof("compression"), (void **)&tmp) == SUCCESS && Z_TYPE_PP(tmp) == IS_LONG) {
+                       int level = Z_LVAL_PP(tmp) & 0x0f;
+                       int kind  = Z_LVAL_PP(tmp) & SOAP_COMPRESSION_DEFLATE;
+
+                 if ((Z_LVAL_PP(tmp) & SOAP_COMPRESSION_ACCEPT) != 0) {
+                               smart_str_append_const(&soap_headers,"Accept-Encoding: 
gzip, deflate\r\n");
+                 }
+                 if (level > 0) {
+                               zval func;
+                               zval retval;
+                       zval param1, param2, param3;
+                               zval *params[3];
+                               int n;
+
+
+                               params[0] = &param1;
+                               INIT_PZVAL(params[0]);
+                               params[1] = &param2;
+                               INIT_PZVAL(params[1]);
+                               params[2] = &param3;
+                               INIT_PZVAL(params[2]);
+                               ZVAL_STRINGL(params[0], buf, buf_size, 0);
+                               ZVAL_LONG(params[1], level);
+                   if (kind == SOAP_COMPRESSION_DEFLATE) {
+                       n = 2;
+                                       ZVAL_STRING(&func, "gzcompress", 0);
+                                       
smart_str_append_const(&soap_headers,"Content-Encoding: deflate\r\n");
+                   } else {
+                     n = 3;
+                                       ZVAL_STRING(&func, "gzencode", 0);
+                                       
smart_str_append_const(&soap_headers,"Content-Encoding: gzip\r\n");
+                                       ZVAL_LONG(params[2], 1);
+                     /* (SOAP_COMPRESSION_GZIP */
+                   }
+                               if (call_user_function(CG(function_table), 
(zval**)NULL, &func, &retval, n, params TSRMLS_CC) == SUCCESS &&
+                                   Z_TYPE(retval) == IS_STRING) {
+                                       request = Z_STRVAL(retval);
+                                       request_size = Z_STRLEN(retval);
+                               } else {
+                       php_url_free(phpurl);
+                       if (request != buf) {efree(request);}
+                       xmlFree(buf);
+                       smart_str_free(&soap_headers);
+                       php_stream_close(stream);
+                       zend_hash_del(Z_OBJPROP_P(this_ptr), "httpsocket", 
sizeof("httpsocket"));
+                       zend_hash_del(Z_OBJPROP_P(this_ptr), "_use_proxy", 
sizeof("_use_proxy"));
+                       add_soap_fault(this_ptr, "HTTP", "Compression Failed", NULL, 
NULL TSRMLS_CC);
+                       return FALSE;
+                               }
+                 }
+               }
                smart_str_append_const(&soap_headers,"Content-Length: ");
-               smart_str_append_long(&soap_headers, buf_size);
+               smart_str_append_long(&soap_headers, request_size);
                smart_str_append_const(&soap_headers, "\r\n");
 
                /* HTTP Authentication */
@@ -358,12 +412,13 @@
                        }
                }
                smart_str_append_const(&soap_headers, "\r\n");
-               smart_str_appendl(&soap_headers, buf, buf_size);
+               smart_str_appendl(&soap_headers, request, request_size);
                smart_str_0(&soap_headers);
 
                err = php_stream_write(stream, soap_headers.c, soap_headers.len);
                if (err != soap_headers.len) {
                        php_url_free(phpurl);
+                       if (request != buf) {efree(request);}
                        xmlFree(buf);
                        smart_str_free(&soap_headers);
                        php_stream_close(stream);
@@ -376,6 +431,7 @@
 
        }
        php_url_free(phpurl);
+       if (request != buf) {efree(request);}
        xmlFree(buf);
        return TRUE;
 }
@@ -386,9 +442,10 @@
        int http_header_size, http_body_size, http_close;
        php_stream *stream;
        zval **trace, **tmp;
-       char* connection;
+       char *connection;
        int http_1_1 = 0;
        int http_status = 0;
+       char *content_encoding;
 
        if (zend_hash_find(Z_OBJPROP_P(this_ptr), "httpsocket", sizeof("httpsocket"), 
(void **)&tmp) == SUCCESS) {
                php_stream_from_zval_no_verify(stream,tmp);
@@ -473,11 +530,6 @@
                return FALSE;
        }
 
-       if (zend_hash_find(Z_OBJPROP_P(this_ptr), "trace", sizeof("trace"), (void **) 
&trace) == SUCCESS &&
-           Z_LVAL_PP(trace) > 0) {
-               add_property_stringl(this_ptr, "__last_response", http_body, 
http_body_size, 1);
-       }
-
        /* See if the server requested a close */
        http_close = TRUE;
        connection = get_http_header_value(http_headers,"Proxy-Connection: ");
@@ -591,8 +643,55 @@
                efree(cookie);
        }
 
-       *buffer = http_body;
-       *buffer_len = http_body_size;
+       content_encoding = get_http_header_value(http_headers,"Content-Encoding: ");
+       if (content_encoding) {
+               zval func;
+               zval retval;
+         zval param;
+               zval *params[1];
+
+               if ((strcmp(content_encoding,"gzip") == 0 ||
+                    strcmp(content_encoding,"x-gzip") == 0) &&
+                    zend_hash_exists(EG(function_table), "gzinflate", 
sizeof("gzinflate"))) {
+                       ZVAL_STRING(&func, "gzinflate", 0);
+                       params[0] = &param;
+                       ZVAL_STRINGL(params[0], http_body+10, http_body_size-10, 0);
+                       INIT_PZVAL(params[0]);
+               } else if (strcmp(content_encoding,"deflate") == 0 &&
+                          zend_hash_exists(EG(function_table), "gzuncompress", 
sizeof("gzuncompress"))) {
+                       ZVAL_STRING(&func, "gzuncompress", 0);
+                       params[0] = &param;
+                       ZVAL_STRINGL(params[0], http_body, http_body_size, 0);
+                       INIT_PZVAL(params[0]);
+               } else {
+                       efree(content_encoding);
+                       efree(http_headers);
+                       efree(http_body);
+                       add_soap_fault(this_ptr, "HTTP", "Unknown Content-Encoding", 
NULL, NULL TSRMLS_CC);
+                       return FALSE;
+               }
+               if (call_user_function(CG(function_table), (zval**)NULL, &func, 
&retval, 1, params TSRMLS_CC) == SUCCESS &&
+                   Z_TYPE(retval) == IS_STRING) {
+                       efree(http_body);
+                       *buffer = Z_STRVAL(retval);
+                       *buffer_len = Z_STRLEN(retval);
+               } else {
+                       efree(content_encoding);
+                       efree(http_headers);
+                       efree(http_body);
+                       add_soap_fault(this_ptr, "HTTP", "Can't uncompress compressed 
response", NULL, NULL TSRMLS_CC);
+                       return FALSE;
+               }
+               efree(content_encoding);
+       } else {
+               *buffer = http_body;
+               *buffer_len = http_body_size;
+       }
+       if (zend_hash_find(Z_OBJPROP_P(this_ptr), "trace", sizeof("trace"), (void **) 
&trace) == SUCCESS &&
+           Z_LVAL_PP(trace) > 0) {
+               add_property_stringl(this_ptr, "__last_response", *buffer, 
*buffer_len, 1);
+       }
+
        efree(http_headers);
        return TRUE;
 }
http://cvs.php.net/diff.php/php-src/ext/soap/php_soap.h?r1=1.30&r2=1.31&ty=u
Index: php-src/ext/soap/php_soap.h
diff -u php-src/ext/soap/php_soap.h:1.30 php-src/ext/soap/php_soap.h:1.31
--- php-src/ext/soap/php_soap.h:1.30    Fri Feb 13 06:03:58 2004
+++ php-src/ext/soap/php_soap.h Wed Feb 25 09:04:41 2004
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_soap.h,v 1.30 2004/02/13 11:03:58 dmitry Exp $ */
+/* $Id: php_soap.h,v 1.31 2004/02/25 14:04:41 dmitry Exp $ */
 
 #ifndef PHP_SOAP_H
 #define PHP_SOAP_H
@@ -138,6 +138,10 @@
 #define SOAP_1_2_ACTOR_NONE             
"http://www.w3.org/2003/05/soap-envelope/role/none";
 #define SOAP_1_2_ACTOR_UNLIMATERECEIVER 
"http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver";
 
+#define SOAP_COMPRESSION_ACCEPT  0x20
+#define SOAP_COMPRESSION_GZIP    0x00
+#define SOAP_COMPRESSION_DEFLATE 0x10
+
 ZEND_BEGIN_MODULE_GLOBALS(soap)
        HashTable  defEncNs;     /* mapping of default namespaces to prefixes */
        HashTable  defEnc;
http://cvs.php.net/diff.php/php-src/ext/soap/soap.c?r1=1.91&r2=1.92&ty=u
Index: php-src/ext/soap/soap.c
diff -u php-src/ext/soap/soap.c:1.91 php-src/ext/soap/soap.c:1.92
--- php-src/ext/soap/soap.c:1.91        Tue Feb 24 10:06:41 2004
+++ php-src/ext/soap/soap.c     Wed Feb 25 09:04:41 2004
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: soap.c,v 1.91 2004/02/24 15:06:41 dmitry Exp $ */
+/* $Id: soap.c,v 1.92 2004/02/25 14:04:41 dmitry Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -505,6 +505,10 @@
        REGISTER_LONG_CONSTANT("SOAP_ACTOR_NONE", SOAP_ACTOR_NONE, CONST_CS | 
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("SOAP_ACTOR_UNLIMATERECEIVER", 
SOAP_ACTOR_UNLIMATERECEIVER, CONST_CS | CONST_PERSISTENT);
 
+       REGISTER_LONG_CONSTANT("SOAP_COMPRESSION_ACCEPT", SOAP_COMPRESSION_ACCEPT, 
CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("SOAP_COMPRESSION_GZIP", SOAP_COMPRESSION_GZIP, 
CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("SOAP_COMPRESSION_DEFLATE", SOAP_COMPRESSION_DEFLATE, 
CONST_CS | CONST_PERSISTENT);
+
        REGISTER_LONG_CONSTANT("UNKNOWN_TYPE", UNKNOWN_TYPE, CONST_CS | 
CONST_PERSISTENT);
 
        REGISTER_LONG_CONSTANT("XSD_STRING", XSD_STRING, CONST_CS | CONST_PERSISTENT);
@@ -1251,7 +1255,42 @@
        if (ZEND_NUM_ARGS() == 0) {
                if (zend_hash_find(&EG(symbol_table), HTTP_RAW_POST_DATA, 
sizeof(HTTP_RAW_POST_DATA), (void **) &raw_post)!=FAILURE
                        && ((*raw_post)->type==IS_STRING)) {
-                       doc_request = 
soap_xmlParseMemory(Z_STRVAL_PP(raw_post),Z_STRLEN_PP(raw_post));
+                       zval **server_vars, **encoding;
+
+                       if (zend_hash_find(&EG(symbol_table), "_SERVER", 
sizeof("_SERVER"), (void **) &server_vars) == SUCCESS &&
+                           Z_TYPE_PP(server_vars) == IS_ARRAY &&
+                           zend_hash_find(Z_ARRVAL_PP(server_vars), 
"HTTP_CONTENT_ENCODING", sizeof("HTTP_CONTENT_ENCODING"), (void **) 
&encoding)==SUCCESS &&
+                           Z_TYPE_PP(encoding) == IS_STRING) {
+                               zval func;
+                               zval retval;
+                         zval param;
+                               zval *params[1];
+
+                               if ((strcmp(Z_STRVAL_PP(encoding),"gzip") == 0 ||
+                                    strcmp(Z_STRVAL_PP(encoding),"x-gzip") == 0) &&
+                                   zend_hash_exists(EG(function_table), "gzinflate", 
sizeof("gzinflate"))) {
+                                       ZVAL_STRING(&func, "gzinflate", 0);
+                                       params[0] = &param;
+                                       ZVAL_STRINGL(params[0], 
Z_STRVAL_PP(raw_post)+10, Z_STRLEN_PP(raw_post)-10, 0);
+                                       INIT_PZVAL(params[0]);
+                               } else if (strcmp(Z_STRVAL_PP(encoding),"deflate") == 
0 &&
+                          zend_hash_exists(EG(function_table), "gzuncompress", 
sizeof("gzuncompress"))) {
+                                       ZVAL_STRING(&func, "gzuncompress", 0);
+                                       params[0] = &param;
+                                       ZVAL_STRINGL(params[0], Z_STRVAL_PP(raw_post), 
Z_STRLEN_PP(raw_post), 0);
+                                       INIT_PZVAL(params[0]);
+                               } else {
+                                       php_error(E_ERROR,"Request is compressed with 
unknown compression '%s'",Z_STRVAL_PP(encoding));
+                               }
+                               if (call_user_function(CG(function_table), 
(zval**)NULL, &func, &retval, 1, params TSRMLS_CC) == SUCCESS &&
+                                   Z_TYPE(retval) == IS_STRING) {
+                                       doc_request = 
soap_xmlParseMemory(Z_STRVAL(retval),Z_STRLEN(retval));
+                               } else {
+                                       php_error(E_ERROR,"Can't uncompress compressed 
request");
+                               }
+                       } else {
+                               doc_request = 
soap_xmlParseMemory(Z_STRVAL_PP(raw_post),Z_STRLEN_PP(raw_post));
+                       }
                } else {
                        if (!zend_ini_long("always_populate_raw_post_data", 
sizeof("always_populate_raw_post_data"), 0)) {
                                php_error(E_ERROR, "PHP-SOAP requires 
'always_populate_raw_post_data' to be on please check your php.ini file");
@@ -1774,6 +1813,15 @@
                        add_property_bool(this_ptr, "_exceptions", 0);
                }
 #endif
+               if (zend_hash_find(ht, "compression", sizeof("compression"), 
(void**)&tmp) == SUCCESS &&
+                   Z_TYPE_PP(tmp) == IS_LONG &&
+             zend_hash_exists(EG(function_table), "gzinflate", sizeof("gzinflate")) &&
+             zend_hash_exists(EG(function_table), "gzdeflate", sizeof("gzdeflate")) &&
+             zend_hash_exists(EG(function_table), "gzuncompress", 
sizeof("gzuncompress")) &&
+             zend_hash_exists(EG(function_table), "gzcompress", sizeof("gzcompress")) 
&&
+             zend_hash_exists(EG(function_table), "gzencode", sizeof("gzencode"))) {
+                       add_property_long(this_ptr, "compression", Z_LVAL_PP(tmp));
+               }
        } else if (wsdl == NULL) {
                php_error(E_ERROR, "Can't create SoapClient. 'location' and 'uri' 
options are requred in nonWSDL mode.");
                return;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to