- don't trap into any other transfer encoding than chunked
authorMichael Wallner <mike@php.net>
Mon, 10 Oct 2005 07:14:53 +0000 (07:14 +0000)
committerMichael Wallner <mike@php.net>
Mon, 10 Oct 2005 07:14:53 +0000 (07:14 +0000)
http_message_api.c
tests/parse_message_002.phpt [new file with mode: 0644]

index 36b3098737ce0e672137d881b8214bc74d1bd115..be4d0c33d2740b4b6f2a11fe481d9b05ed07f25a 100644 (file)
@@ -151,26 +151,24 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char
                const char *continue_at = NULL;
 
                /* message has chunked transfer encoding */
-               if (c = http_message_header(msg, "Transfer-Encoding")) {
-                       if (!strcasecmp("chunked", Z_STRVAL_P(c))) {
-                               char *decoded;
-                               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)) {
-                                       phpstr_from_string_ex(PHPSTR(msg), decoded, decoded_len);
-                                       efree(decoded);
-                                       {
-                                               zval *len;
-                                               char *tmp;
-
-                                               spprintf(&tmp, 0, "%lu", (ulong) decoded_len);
-                                               MAKE_STD_ZVAL(len);
-                                               ZVAL_STRING(len, tmp, 0);
-
-                                               zend_hash_del(&msg->hdrs, "Transfer-Encoding", sizeof("Transfer-Encoding"));
-                                               zend_hash_add(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL);
-                                       }
+               if ((c = http_message_header(msg, "Transfer-Encoding")) && (!strcasecmp("chunked", Z_STRVAL_P(c)))) {
+                       char *decoded;
+                       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)) {
+                               phpstr_from_string_ex(PHPSTR(msg), decoded, decoded_len);
+                               efree(decoded);
+                               {
+                                       zval *len;
+                                       char *tmp;
+
+                                       spprintf(&tmp, 0, "%lu", (ulong) decoded_len);
+                                       MAKE_STD_ZVAL(len);
+                                       ZVAL_STRING(len, tmp, 0);
+
+                                       zend_hash_del(&msg->hdrs, "Transfer-Encoding", sizeof("Transfer-Encoding"));
+                                       zend_hash_add(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL);
                                }
                        }
                } else
diff --git a/tests/parse_message_002.phpt b/tests/parse_message_002.phpt
new file mode 100644 (file)
index 0000000..d82aac9
--- /dev/null
@@ -0,0 +1,39 @@
+--TEST--
+identity encoding trap
+--SKIPIF--
+<?php
+include 'skip.inc';
+?>
+--FILE--
+<?php
+echo "-TEST\n";
+
+$message =
+"HTTP/1.1 200 Ok\n".
+"Transfer-Encoding: identity\n".
+"Content-Length: 3\n".
+"Content-Type: text/plain\n\n".
+"Hi!foo";
+
+print_r(http_parse_message($message));
+
+echo "Done\n";
+--EXPECTF--
+%sTEST
+stdClass Object
+(
+    [type] => 2
+    [httpVersion] => 1.1
+    [responseCode] => 200
+    [responseStatus] => Ok
+    [headers] => Array
+        (
+            [Transfer-Encoding] => identity
+            [Content-Length] => 3
+            [Content-Type] => text/plain
+        )
+
+    [body] => Hi!
+    [parentMessage] => 
+)
+Done