- add flag parameter to http_build_url(); slightly breaks parameter order
[m6w6/ext-http] / http_message_api.c
index fee445b12042405e160a4c312df9869631029bfc..0b5908ecab8d5ea4598241fe440ad62929457af5 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"
@@ -30,8 +25,6 @@
 #include "php_http_send_api.h"
 #include "php_http_url_api.h"
 
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
 #define http_message_info_callback _http_message_info_callback
 static void _http_message_info_callback(http_message **message, HashTable **headers, http_info *info TSRMLS_DC)
 {
@@ -44,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.URI = estrdup(HTTP_INFO(info).request.URI);
-                       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
@@ -76,7 +54,7 @@ static inline void _http_message_init_type(http_message *message, http_message_t
 
                case HTTP_MSG_REQUEST:
                        message->http.info.request.method = NULL;
-                       message->http.info.request.URI = NULL;
+                       message->http.info.request.url = NULL;
                break;
 
                case HTTP_MSG_NONE:
@@ -110,7 +88,7 @@ PHP_HTTP_API void _http_message_set_type(http_message *message, http_message_typ
                {
                        case HTTP_MSG_REQUEST:
                                STR_FREE(message->http.info.request.method);
-                               STR_FREE(message->http.info.request.URI);
+                               STR_FREE(message->http.info.request.url);
                        break;
                        
                        case HTTP_MSG_RESPONSE:
@@ -126,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;
@@ -227,37 +226,16 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char
                        continue_at = body;
                }
                
-#if defined(HTTP_HAVE_ZLIB) || defined(HAVE_ZLIB)
+#ifdef HTTP_HAVE_ZLIB
                /* check for compressed data */
                if (http_message_header(msg, "Vary") && (c = http_message_header(msg, "Content-Encoding"))) {
                        char *decoded = NULL;
                        size_t decoded_len = 0;
-#      if !defined(HTTP_HAVE_ZLIB)
-                       zval func, retval, arg, *args[1];
-                       INIT_PZVAL(&func);
-                       INIT_PZVAL(&retval);
-                       INIT_PZVAL(&arg);
-                       args[0] = &arg;
-#      endif /* !HTTP_HAVE_ZLIB */
-
-#      define DECODE_WITH_EXT_ZLIB(function, S, L) \
-                               ZVAL_STRINGL(&func, function, lenof(function), 0); \
-                               ZVAL_STRINGL(&arg, (S), (L), 0); \
-                               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") || !strcasecmp(Z_STRVAL_P(c), "x-gzip")) {
-#      ifndef HTTP_HAVE_ZLIB
-                               DECODE_WITH_EXT_ZLIB("gzinflate", PHPSTR_VAL(msg) + 10, PHPSTR_LEN(msg) - 18);
-#      else
-                               http_encoding_gzdecode(PHPSTR_VAL(msg), PHPSTR_LEN(msg), &decoded, &decoded_len);
-                       } else if (!strcasecmp(Z_STRVAL_P(c), "deflate") || !strcasecmp(Z_STRVAL_P(c), "compress") || !strcasecmp(Z_STRVAL_P(c), "x-compress")) {
+                       if (    !strcasecmp(Z_STRVAL_P(c), "gzip") || 
+                                       !strcasecmp(Z_STRVAL_P(c), "x-gzip") ||
+                                       !strcasecmp(Z_STRVAL_P(c), "deflate")) {
                                http_encoding_inflate(PHPSTR_VAL(msg), PHPSTR_LEN(msg), &decoded, &decoded_len);
-#      endif /* HTTP_HAVE_ZLIB */
                        }
                        
                        if (decoded) {
@@ -286,7 +264,7 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char
                                PHPSTR(msg)->free = 1;
                        }
                }
-#endif /* HTTP_HAVE_ZLIB || HAVE_ZLIB */
+#endif /* HTTP_HAVE_ZLIB */
 
                /* check for following messages */
                if (continue_at && (continue_at < (message + message_length))) {
@@ -322,7 +300,7 @@ PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_
                case HTTP_MSG_REQUEST:
                        phpstr_appendf(&str, "%s %s HTTP/%1.1f" HTTP_CRLF,
                                msg->http.info.request.method,
-                               msg->http.info.request.URI,
+                               msg->http.info.request.url,
                                msg->http.version);
                break;
 
@@ -417,7 +395,7 @@ PHP_HTTP_API void _http_message_tostruct_recursive(http_message *msg, zval *obj
                
                case HTTP_MSG_REQUEST:
                        add_assoc_string(&strct, "requestMethod", msg->http.info.request.method, 1);
-                       add_assoc_string(&strct, "requestUri", msg->http.info.request.URI, 1);
+                       add_assoc_string(&strct, "requestUrl", msg->http.info.request.url, 1);
                break;
                
                case HTTP_MSG_NONE:
@@ -501,7 +479,7 @@ PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC)
                        /* check host header */
                        if (SUCCESS == zend_hash_find(&message->hdrs, "Host", sizeof("Host"), (void **) &zhost)) {
                                char *colon = NULL;
-                               php_url parts, *url = php_url_parse(message->http.info.request.URI);
+                               php_url parts, *url = php_url_parse(message->http.info.request.url);
                                
                                memset(&parts, 0, sizeof(php_url));
 
@@ -513,11 +491,11 @@ 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 {
-                               uri = http_absolute_url(message->http.info.request.URI);
+                               uri = http_absolute_url(message->http.info.request.url);
                        }
 
                        if ((request.meth = http_request_method_exists(1, 0, message->http.info.request.method))) {
@@ -575,7 +553,7 @@ PHP_HTTP_API void _http_message_dtor(http_message *message)
                {
                        case HTTP_MSG_REQUEST:
                                STR_SET(message->http.info.request.method, NULL);
-                               STR_SET(message->http.info.request.URI, NULL);
+                               STR_SET(message->http.info.request.url, NULL);
                        break;
                        
                        case HTTP_MSG_RESPONSE: