- add PHP_FUNCTION(http_parse_message) -- http_get() etc would be pretty useless...
authorMichael Wallner <mike@php.net>
Tue, 9 Aug 2005 11:32:25 +0000 (11:32 +0000)
committerMichael Wallner <mike@php.net>
Tue, 9 Aug 2005 11:32:25 +0000 (11:32 +0000)
http.c
http_functions.c
missing.c
php_http.h

diff --git a/http.c b/http.c
index 1516aa7ce753f600fb1249cdea70a71b639338c2..dfac09e70e166f66b6274947895d4c4ddd0e86a6 100644 (file)
--- a/http.c
+++ b/http.c
@@ -83,6 +83,7 @@ function_entry http_functions[] = {
        PHP_FE(http_send_file, NULL)
        PHP_FE(http_send_stream, NULL)
        PHP_FE(http_chunked_decode, NULL)
+       PHP_FE(http_parse_message, NULL)
        PHP_FE(http_split_response, NULL)
        PHP_FE(http_parse_headers, NULL)
        PHP_FE(http_get_request_headers, NULL)
index 1a1c8715c0d2a41a402fbc562644837ac778c67f..ae27b5ea7f213ad46bb174b6a70c060b933c7ff1 100644 (file)
@@ -675,6 +675,104 @@ PHP_FUNCTION(http_split_response)
 }
 /* }}} */
 
+static void http_message_toobject_recursive(http_message *msg, zval *obj TSRMLS_DC)
+{
+       zval *headers;
+       
+       add_property_long(obj, "type", msg->type);
+       switch (msg->type)
+       {
+               case HTTP_MSG_RESPONSE:
+                       add_property_double(obj, "httpVersion", msg->info.response.http_version);
+                       add_property_long(obj, "responseCode", msg->info.response.code);
+               break;
+               
+               case HTTP_MSG_REQUEST:
+                       add_property_double(obj, "httpVersion", msg->info.request.http_version);
+                       add_property_string(obj, "requestMethod", msg->info.request.method, 1);
+                       add_property_string(obj, "requestUri", msg->info.request.URI, 1);
+               break;
+       }
+       
+       MAKE_STD_ZVAL(headers);
+       array_init(headers);
+       zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+       add_property_zval(obj, "headers", headers);
+       zval_ptr_dtor(&headers);
+       
+       add_property_stringl(obj, "body", PHPSTR_VAL(msg), PHPSTR_LEN(msg), 1);
+       
+       if (msg->parent) {
+               zval *parent;
+               
+               MAKE_STD_ZVAL(parent);
+               object_init(parent);
+               add_property_zval(obj, "parentMessage", parent);
+               http_message_toobject_recursive(msg->parent, parent TSRMLS_CC);
+               zval_ptr_dtor(&parent);
+       } else {
+               add_property_null(obj, "parentMessage");
+       }
+       http_message_dtor(msg);
+       efree(msg);
+}
+
+/* {{{ proto object http_parse_message(string message)
+ *
+ * Parses (a) http_message(s) into a simple recursive object structure:
+ * 
+ * <pre>
+ * <?php
+ * print_r(http_parse_message(http_get(URL, array('redirect' => 3)));
+ * 
+ * stdClass object
+ * (
+ *     [type] => 2
+ *     [httpVersion] => 1.1
+ *     [responseCode] => 200
+ *     [headers] => Array 
+ *         (
+ *             [Content-Length] => 3
+ *             [Server] => Apache
+ *         )
+ *     [body]  => Hi!
+ *     [parentMessage] => stdClass object
+ *     (
+ *         [type] => 2
+ *         [httpVersion] => 1.1
+ *         [responseCode] => 302
+ *         [headers] => Array 
+ *             (
+ *                 [Content-Length] => 0
+ *                 [Location] => ...
+ *             )
+ *         [body]  => 
+ *         [parentMessage] => ...
+ *     )
+ * )
+ * ?>
+ * </pre>
+ */
+PHP_FUNCTION(http_parse_message)
+{
+       char *message;
+       int message_len;
+       http_message *msg = NULL;
+       
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &message, &message_len)) {
+               RETURN_NULL();
+       }
+       
+       
+       if (msg = http_message_parse(message, message_len)) {
+               object_init(return_value);
+               http_message_toobject_recursive(msg, return_value TSRMLS_CC);
+       } else {
+               RETURN_NULL();
+       }
+}
+/* }}} */
+
 /* {{{ proto array http_parse_headers(string header)
  *
  */
index 31d2b468ad699cfc24b6bf6b843eb0baf839bb4d..99ec620c095c4b6877046e3b511a6a1129c0d9d6 100644 (file)
--- a/missing.c
+++ b/missing.c
@@ -225,7 +225,7 @@ int zend_update_static_property(zend_class_entry *scope, char *name, size_t name
                                SEPARATE_ZVAL(&value);
                        }
                        
-                       retval = zend_hash_update(scope->static_members, name, name_len+1, &value, sizeof(zval *), NULL);
+                       retval = zend_hash_update(scope->static_members, name, name_len, &value, sizeof(zval *), NULL);
                }
        }
        
index 2cc6d5867f5aa4cfe510507ae1dc7aaf204711eb..1b0f21329b27fdf32f3b1717f789180fc9dd4132 100644 (file)
@@ -108,6 +108,7 @@ PHP_FUNCTION(http_send_file);
 PHP_FUNCTION(http_send_stream);
 PHP_FUNCTION(http_chunked_decode);
 PHP_FUNCTION(http_split_response);
+PHP_FUNCTION(http_parse_message);
 PHP_FUNCTION(http_parse_headers);
 PHP_FUNCTION(http_get_request_headers);
 PHP_FUNCTION(http_get_request_body);