- fix shared build witin the php src tree
[m6w6/ext-http] / http_message_api.c
index 89f67e0bd942bec7ab0375167e4c9b530dd1079f..675cb48fec0edac06bc5103dbaa23110a00e1147 100644 (file)
@@ -1,16 +1,13 @@
 /*
-   +----------------------------------------------------------------------+
-   | PECL :: http                                                         |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.0 of the PHP license, that  |
-   | is bundled with this package in the file LICENSE, and is available   |
-   | through the world-wide-web at http://www.php.net/license/3_0.txt.    |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Copyright (c) 2004-2005 Michael Wallner <mike@php.net>               |
-   +----------------------------------------------------------------------+
+    +--------------------------------------------------------------------+
+    | PECL :: http                                                       |
+    +--------------------------------------------------------------------+
+    | Redistribution and use in source and binary forms, with or without |
+    | modification, are permitted provided that the conditions mentioned |
+    | in the accompanying LICENSE file are met.                          |
+    +--------------------------------------------------------------------+
+    | Copyright (c) 2004-2005, Michael Wallner <mike@php.net>            |
+    +--------------------------------------------------------------------+
 */
 
 /* $Id$ */
@@ -157,7 +154,7 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char
                        size_t decoded_len;
 
                        /* decode and replace Transfer-Encoding with Content-Length header */
-                       if (continue_at = http_chunked_decode(body, message + message_length - body, &decoded, &decoded_len)) {
+                       if (continue_at = http_encoding_dechunk(body, message + message_length - body, &decoded, &decoded_len)) {
                                zval *len;
                                char *tmp;
                                int tmp_len;
@@ -216,20 +213,42 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char
                        continue_at = body;
                }
                
-#ifdef HTTP_HAVE_ZLIB
+#if defined(HTTP_HAVE_ZLIB) || defined(HAVE_ZLIB)
                /* check for compressed data */
                if (c = http_message_header(msg, "Content-Encoding")) {
                        char *decoded = NULL;
                        size_t decoded_len = 0;
+#      ifdef HAVE_ZLIB
+                       zval func, retval, arg, *args[1];
+                       INIT_PZVAL(&func);
+                       INIT_PZVAL(&retval);
+                       INIT_PZVAL(&arg);
+                       ZVAL_STRINGL(&func, "gzinflate", lenof("gzinflate"), 0);
+                       args[0] = &arg;
+#      endif /* HAVE_ZLIB */
+
+#      define DECODE_WITH_EXT_ZLIB() \
+                               if (SUCCESS == call_user_function(EG(function_table), NULL, &func, &retval, 1, args TSRMLS_CC)) { \
+                                       if (Z_TYPE(retval) == IS_STRING) { \
+                                               decoded = Z_STRVAL(retval); \
+                                               decoded_len = Z_STRLEN(retval); \
+                                       } \
+                               }
                        
-                       if (!strcasecmp(Z_STRVAL_P(c), "gzip")) {
+                       if (!strcasecmp(Z_STRVAL_P(c), "gzip") || !strcasecmp(Z_STRVAL_P(c), "x-gzip")) {
+#      ifdef HTTP_HAVE_ZLIB
                                http_encoding_gzdecode(PHPSTR_VAL(msg), PHPSTR_LEN(msg), &decoded, &decoded_len);
-                       } else
-                       if (!strcasecmp(Z_STRVAL_P(c), "deflate")) {
+#      else
+                               ZVAL_STRINGL(&arg, PHPSTR_VAL(msg) + 10, PHPSTR_LEN(msg) - 18, 0);
+                               DECODE_WITH_EXT_ZLIB();
+#      endif /* HTTP_HAVE_ZLIB */
+                       } else if (!strcasecmp(Z_STRVAL_P(c), "deflate")) {
+#      ifdef HTTP_HAVE_ZLIB
                                http_encoding_inflate(PHPSTR_VAL(msg), PHPSTR_LEN(msg), &decoded, &decoded_len);
-                       } else
-                       if (!strcasecmp(Z_STRVAL_P(c), "compress")) {
-                               http_encoding_uncompress(PHPSTR_VAL(msg), PHPSTR_LEN(msg), &decoded, &decoded_len);
+#      else
+                               ZVAL_STRINGL(&arg, PHPSTR_VAL(msg), PHPSTR_LEN(msg), 0);
+                               DECODE_WITH_EXT_ZLIB();
+#      endif /* HTTP_HAVE_ZLIB */
                        }
                        
                        if (decoded && decoded_len) {
@@ -251,7 +270,7 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char
                                PHPSTR(msg)->free = 1;
                        }
                }
-#endif
+#endif /* HTTP_HAVE_ZLIB || HAVE_ZLIB */
 
                /* check for following messages */
                if (continue_at) {
@@ -400,7 +419,6 @@ PHP_HTTP_API void _http_message_tostruct_recursive(http_message *msg, zval *obj
                }
                add_assoc_zval(&strct, "parentMessage", parent);
                http_message_tostruct_recursive(msg->parent, parent);
-               zval_ptr_dtor(&parent);
        } else {
                add_assoc_null(&strct, "parentMessage");
        }