- fixed message chain order in HttpRequest::getHistory()
[m6w6/ext-http] / http_message_api.c
index 16a2c05ec5c0d71b4477aa6d2252f3574a90e08f..915469248187e0119070235d60d6956883545bea 100644 (file)
@@ -6,22 +6,17 @@
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2005, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2006, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
 /* $Id$ */
 
-#ifdef HAVE_CONFIG_H
-#      include "config.h"
-#endif
-
+#define HTTP_WANT_SAPI
 #define HTTP_WANT_CURL
 #define HTTP_WANT_ZLIB
 #include "php_http.h"
 
-#include "SAPI.h"
-
 #include "php_http_api.h"
 #include "php_http_encoding_api.h"
 #include "php_http_headers_api.h"
@@ -42,22 +37,7 @@ static void _http_message_info_callback(http_message **message, HashTable **head
                (*headers) = &((*message)->hdrs);
        }
        
-       (*message)->http.version = info->http.version;
-       
-       switch (info->type)
-       {
-               case IS_HTTP_REQUEST:
-                       (*message)->type = HTTP_MSG_REQUEST;
-                       HTTP_INFO(*message).request.url = estrdup(HTTP_INFO(info).request.url);
-                       HTTP_INFO(*message).request.method = estrdup(HTTP_INFO(info).request.method);
-               break;
-               
-               case IS_HTTP_RESPONSE:
-                       (*message)->type = HTTP_MSG_RESPONSE;
-                       HTTP_INFO(*message).response.code = HTTP_INFO(info).response.code;
-                       HTTP_INFO(*message).response.status = estrdup(HTTP_INFO(info).response.status);
-               break;
-       }
+       http_message_set_info(*message, info);
 }
 
 #define http_message_init_type _http_message_init_type
@@ -124,6 +104,27 @@ PHP_HTTP_API void _http_message_set_type(http_message *message, http_message_typ
        }
 }
 
+PHP_HTTP_API void _http_message_set_info(http_message *message, http_info *info)
+{
+       message->http.version = info->http.version;
+       
+       switch (message->type = info->type)
+       {
+               case IS_HTTP_REQUEST:
+                       HTTP_INFO(message).request.url = estrdup(HTTP_INFO(info).request.url);
+                       STR_SET(HTTP_INFO(message).request.method, estrdup(HTTP_INFO(info).request.method));
+               break;
+               
+               case IS_HTTP_RESPONSE:
+                       HTTP_INFO(message).response.code = HTTP_INFO(info).response.code;
+                       STR_SET(HTTP_INFO(message).response.status, estrdup(HTTP_INFO(info).response.status));
+               break;
+               
+               default:
+               break;
+       }
+}
+
 PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char *message, size_t message_length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC TSRMLS_DC)
 {
        const char *body = NULL;
@@ -233,9 +234,7 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char
 
                        if (    !strcasecmp(Z_STRVAL_P(c), "gzip") || 
                                        !strcasecmp(Z_STRVAL_P(c), "x-gzip") ||
-                                       !strcasecmp(Z_STRVAL_P(c), "deflate") ||
-                                       !strcasecmp(Z_STRVAL_P(c), "compress") ||
-                                       !strcasecmp(Z_STRVAL_P(c), "x-compress")) {
+                                       !strcasecmp(Z_STRVAL_P(c), "deflate")) {
                                http_encoding_inflate(PHPSTR_VAL(msg), PHPSTR_LEN(msg), &decoded, &decoded_len);
                        }
                        
@@ -378,6 +377,57 @@ PHP_HTTP_API void _http_message_serialize(http_message *message, char **string,
        phpstr_dtor(&str);
 }
 
+PHP_HTTP_API http_message *_http_message_reverse(http_message *msg)
+{
+       int i, c;
+       
+       http_message_count(c, msg);
+       
+       if (c > 1) {
+               http_message *tmp = msg, **arr = ecalloc(c, sizeof(http_message *));
+               
+               for (i = 0; i < c; ++i) {
+                       arr[i] = tmp;
+                       tmp = tmp->parent;
+               }
+               arr[0]->parent = NULL;
+               for (i = 0; i < c-1; ++i) {
+                       arr[i+1]->parent = arr[i];
+               }
+               
+               msg = arr[c-1];
+               efree(arr);
+       }
+       
+       return msg;
+}
+
+PHP_HTTP_API http_message *_http_message_interconnect(http_message *m1, http_message *m2)
+{
+       if (m1 && m2) {
+               int i = 0, c1, c2;
+               http_message *t1 = m1, *t2 = m2, *p1, *p2;
+               
+               http_message_count(c1, m1);
+               http_message_count(c2, m2);
+               
+               while (i++ < (c1 - c2)) {
+                       t1 = t1->parent;
+               }
+               while (i++ <= c1) {
+                       p1 = t1->parent;
+                       p2 = t2->parent;
+                       t1->parent = t2;
+                       t2->parent = p1;
+                       t1 = p1;
+                       t2 = p2;
+               }
+       } else if (!m1 && m2) {
+               m1 = m2;
+       }
+       return m1;
+}
+
 PHP_HTTP_API void _http_message_tostruct_recursive(http_message *msg, zval *obj TSRMLS_DC)
 {
        zval strct;
@@ -492,7 +542,7 @@ PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC)
                                        parts.host = estrndup(Z_STRVAL_PP(zhost), Z_STRLEN_PP(zhost));
                                }
                                
-                               http_build_url(url, &parts, NULL, &uri, NULL);
+                               http_build_url(HTTP_URL_REPLACE, url, &parts, NULL, &uri, NULL);
                                php_url_free(url);
                                efree(parts.host);
                        } else {