X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=ae27b5ea7f213ad46bb174b6a70c060b933c7ff1;hp=1a1c8715c0d2a41a402fbc562644837ac778c67f;hb=1d37eec22d2a073acd8785431621c26c2312a246;hpb=18415c72d3b9f92b74dab623a88d5abf054c7bd0 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) * */