- a header may have an array of values
[m6w6/ext-http] / http_message_api.c
index b89e0a89a5ec0d4c72ae7036710069defbc9d8ea..e9eccbff55fde8f22cdc3cbd5285d878ccb43a64 100644 (file)
@@ -32,8 +32,8 @@ PHP_HTTP_API void _http_message_dtor(http_message *message)
        if (message) {
                zend_hash_destroy(&message->hdrs);
                phpstr_dtor(PHPSTR(message));
-               if (message->dup && message->raw.dup) {
-                       efree(message->raw.dup);
+               if (message->raw) {
+                       efree(message->raw);
                }
                if (message->type == HTTP_MSG_REQUEST) {
                        if (message->info.request.method) {
@@ -71,9 +71,9 @@ PHP_HTTP_API http_message *_http_message_init_ex(http_message *message, http_mes
        return message;
 }
 
-PHP_HTTP_API http_message *_http_message_parse_ex(const char *message, size_t length, zend_bool dup TSRMLS_DC)
+PHP_HTTP_API http_message *_http_message_parse_ex(char *message, size_t length, zend_bool dup TSRMLS_DC)
 {
-       const char *message_start = message, *body = NULL;
+       char *message_start = message, *body = NULL;
        size_t message_length = length, header_length = 0;
        http_message *msg;
 
@@ -90,6 +90,9 @@ PHP_HTTP_API http_message *_http_message_parse_ex(const char *message, size_t le
 
        msg = http_message_init();
 
+       msg->len = length;
+       msg->raw = dup ? estrndup(message, length) : message;
+
        // response
        if (!strncmp(message, "HTTP/1.", lenof("HTTP/1."))) {
                msg->type = HTTP_MSG_RESPONSE;
@@ -112,14 +115,6 @@ PHP_HTTP_API http_message *_http_message_parse_ex(const char *message, size_t le
        message_start += lenof(HTTP_CRLF);
        message_length -= message_start - message;
 
-       if (msg->dup = dup) {
-               msg->len = length;
-               msg->raw.dup = estrndup(message, length);
-       } else {
-               msg->len = length;
-               msg->raw.ptr = message;
-       }
-
        if (body = strstr(message_start, HTTP_CRLF HTTP_CRLF)) {
                body += lenof(HTTP_CRLF HTTP_CRLF);
                header_length = body - message_start;
@@ -143,6 +138,7 @@ PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_
        zval **header;
 
        phpstr_init_ex(&str, msg->len, 1);
+       str.size = 4096;
 
        switch (msg->type)
        {
@@ -162,13 +158,29 @@ PHP_HTTP_API void _http_message_tostring(http_message *msg, char **string, size_
 
        FOREACH_HASH_KEYVAL(&msg->hdrs, key, idx, header) {
                if (key) {
-                       phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(header));
+                       switch (Z_TYPE_PP(header))
+                       {
+                               case IS_STRING:
+                                       phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(header));
+                               break;
+                               
+                               case IS_ARRAY:
+                               {
+                                       zval **single_header;
+                                       
+                                       FOREACH_VAL(*header, single_header) {
+                                               phpstr_appendf(&str, "%s: %s" HTTP_CRLF, key, Z_STRVAL_PP(single_header));
+                                       }
+                               }
+                               break;
+                       }
+                       
                        key = NULL;
                }
        }
 
        phpstr_appends(&str, HTTP_CRLF);
-       phpstr_append(&str, msg->body.data, msg->body.used);
+       phpstr_append(&str, PHPSTR_VAL(msg), PHPSTR_LEN(msg));
        phpstr_fix(&str);
 
        data = phpstr_data(&str, string, length);