HTTP info test & fixes
authorMichael Wallner <mike@php.net>
Wed, 1 Feb 2012 09:21:21 +0000 (09:21 +0000)
committerMichael Wallner <mike@php.net>
Wed, 1 Feb 2012 09:21:21 +0000 (09:21 +0000)
php_http_header_parser.c
php_http_info.c
php_http_info.h
tests/info_001.phpt [new file with mode: 0644]

index 975df24..0dbaf84 100644 (file)
@@ -120,8 +120,8 @@ PHP_HTTP_API STATUS php_http_header_parser_parse(php_http_header_parser_t *parse
                        }
 
                        case PHP_HTTP_HEADER_PARSER_STATE_KEY: {
-                               const char *colon, *eol_str;
-                               int eol_len;
+                               const char *colon, *eol_str = NULL;
+                               int eol_len = 0;
 
                                if (buffer->data == (eol_str = php_http_locate_bin_eol(buffer->data, buffer->used, &eol_len))) {
                                        /* end of headers */
index 3bde791..cc015a8 100644 (file)
 
 #include "php_http_api.h"
 
-PHP_HTTP_API void php_http_info_default_callback(void **nothing, HashTable **headers, php_http_info_t *info TSRMLS_DC)
-{
-       zval array;
-       (void) nothing;
-       
-       INIT_PZVAL_ARRAY(&array, *headers);
-       
-       switch (info->type) {
-               case PHP_HTTP_REQUEST:
-                       add_assoc_string(&array, "Request Method", PHP_HTTP_INFO(info).request.method, 1);
-                       add_assoc_string(&array, "Request Url", PHP_HTTP_INFO(info).request.url, 1);
-                       break;
-               
-               case PHP_HTTP_RESPONSE:
-                       add_assoc_long(&array, "Response Code", (long) PHP_HTTP_INFO(info).response.code);
-                       add_assoc_string(&array, "Response Status", PHP_HTTP_INFO(info).response.status, 1);
-                       break;
-
-               case PHP_HTTP_NONE:
-                       break;
-       }
-}
-
 PHP_HTTP_API php_http_info_t *php_http_info_init(php_http_info_t *i TSRMLS_DC)
 {
        if (!i) {
@@ -134,7 +111,7 @@ PHP_HTTP_API php_http_info_t *php_http_info_parse(php_http_info_t *info, const c
        }
        
        /* is request */
-       else if (!http[lenof("HTTP/1.x")] || http[lenof("HTTP/1.x")] == '\r' || http[lenof("HTTP/1.x")] == '\n') {
+       else if (*(http - 1) == ' ' && !http[lenof("HTTP/1.x")] || http[lenof("HTTP/1.x")] == '\r' || http[lenof("HTTP/1.x")] == '\n') {
                const char *url = strchr(pre_header, ' ');
                
                info->type = PHP_HTTP_REQUEST;
@@ -145,7 +122,7 @@ PHP_HTTP_API php_http_info_t *php_http_info_parse(php_http_info_t *info, const c
                        if (http > url) {
                                PHP_HTTP_INFO(info).request.url = estrndup(url, http - url);
                        } else {
-                               efree(PHP_HTTP_INFO(info).request.method);
+                               STR_SET(PHP_HTTP_INFO(info).request.method, NULL);
                                return NULL;
                        }
                } else {
index ce65fd0..92a3f33 100644 (file)
@@ -55,8 +55,6 @@ typedef struct php_http_info {
 
 typedef zend_bool (*php_http_info_callback_t)(void **callback_data, HashTable **headers, php_http_info_t *info TSRMLS_DC);
 
-PHP_HTTP_API void php_http_info_default_callback(void **nothing, HashTable **headers, php_http_info_t *info TSRMLS_DC);
-
 PHP_HTTP_API php_http_info_t *php_http_info_init(php_http_info_t *info TSRMLS_DC);
 PHP_HTTP_API php_http_info_t *php_http_info_parse(php_http_info_t *info, const char *pre_header TSRMLS_DC);
 PHP_HTTP_API void php_http_info_dtor(php_http_info_t *info);
diff --git a/tests/info_001.phpt b/tests/info_001.phpt
new file mode 100644 (file)
index 0000000..e79abd4
--- /dev/null
@@ -0,0 +1,65 @@
+--TEST--
+invalid HTTP info
+--SKIPIF--
+<?php include "skipif.inc"; ?>
+--FILE--
+<?php
+
+try { 
+    var_dump(new http\Message("GET HTTP/1.1"));
+} catch (Exception $e) {
+    echo $e, "\n";
+}
+try { 
+    var_dump(new http\Message("GET HTTP/1.123"));
+} catch (Exception $e) {
+    echo $e, "\n";
+}
+try { 
+    var_dump(new http\Message("GETHTTP/1.1"));
+} catch (Exception $e) {
+    echo $e, "\n";
+}
+var_dump(new http\Message("GET / HTTP/1.1"));
+?>
+DONE
+--EXPECTF--
+exception 'http\Exception' with message 'could not parse message: GET HTTP/1.1' in %s
+Stack trace:
+#0 %s: http\Message->__construct('GET HTTP/1.1')
+#1 {main}
+exception 'http\Exception' with message 'could not parse message: GET HTTP/1.123' in %s
+Stack trace:
+#0 %s: http\Message->__construct('GET HTTP/1.123')
+#1 {main}
+exception 'http\Exception' with message 'could not parse message: GETHTTP/1.1' in %s
+Stack trace:
+#0 %s: http\Message->__construct('GETHTTP/1.1')
+#1 {main}
+object(http\Message)#%d (10) {
+  ["errorHandling":protected]=>
+  NULL
+  ["type":protected]=>
+  int(1)
+  ["body":protected]=>
+  object(http\Message\Body)#%d (1) {
+    ["errorHandling":protected]=>
+    NULL
+  }
+  ["requestMethod":protected]=>
+  string(3) "GET"
+  ["requestUrl":protected]=>
+  string(1) "/"
+  ["responseStatus":protected]=>
+  string(0) ""
+  ["responseCode":protected]=>
+  int(0)
+  ["httpVersion":protected]=>
+  string(3) "1.1"
+  ["headers":protected]=>
+  array(0) {
+  }
+  ["parentMessage":protected]=>
+  NULL
+}
+DONE