From f0b91eef34357ee6146faa2a2f88d4fac7c0d66c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 9 Aug 2005 11:32:25 +0000 Subject: [PATCH] - add PHP_FUNCTION(http_parse_message) -- http_get() etc would be pretty useless without that in many cases --- http.c | 1 + http_functions.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++ missing.c | 2 +- php_http.h | 1 + 4 files changed, 101 insertions(+), 1 deletion(-) diff --git a/http.c b/http.c index 1516aa7..dfac09e 100644 --- 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) diff --git a/http_functions.c b/http_functions.c index 1a1c871..ae27b5e 100644 --- a/http_functions.c +++ b/http_functions.c @@ -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: + * + *
+ *  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] => ...
+ *     )
+ * )
+ * ?>
+ * 
+ */ +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) * */ diff --git a/missing.c b/missing.c index 31d2b46..99ec620 100644 --- 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); } } diff --git a/php_http.h b/php_http.h index 2cc6d58..1b0f213 100644 --- a/php_http.h +++ b/php_http.h @@ -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); -- 2.30.2