fix message parser content length
[m6w6/ext-http] / php_http_message_parser.c
index ba43f08f74f9b9b0d8efda5e333098243a4d6f9d..e4eab11f94addea20d0f8ba1a69812ee641036b5 100644 (file)
@@ -249,14 +249,17 @@ php_http_message_parser_state_t php_http_message_parser_parse(php_http_message_p
                        {
                                zval h, *h_loc = NULL, *h_con = NULL, *h_cl, *h_cr, *h_te, *h_ce;
 
-                               if ((h_te = php_http_message_header(*message, ZEND_STRL("Transfer-Encoding"), 1))) {
+                               if ((h_te = php_http_message_header(*message, ZEND_STRL("Transfer-Encoding")))) {
+                                       Z_TRY_ADDREF_P(h_te);
                                        zend_hash_str_update(&(*message)->hdrs, "X-Original-Transfer-Encoding", lenof("X-Original-Transfer-Encoding"), h_te);
                                        zend_hash_str_del(&(*message)->hdrs, "Transfer-Encoding", lenof("Transfer-Encoding"));
                                }
-                               if ((h_cl = php_http_message_header(*message, ZEND_STRL("Content-Length"), 1))) {
-                                       zend_hash_str_update(&(*message)->hdrs, "X-Original-Content-Length", lenof("X-Original-Content-Length"), h_cl);
+                               if ((h_cl = php_http_message_header(*message, ZEND_STRL("Content-Length")))) {
+                                       Z_TRY_ADDREF_P(h_cl);
+                                       h_cl = zend_hash_str_update(&(*message)->hdrs, "X-Original-Content-Length", lenof("X-Original-Content-Length"), h_cl);
                                }
-                               if ((h_cr = php_http_message_header(*message, ZEND_STRL("Content-Range"), 1))) {
+                               if ((h_cr = php_http_message_header(*message, ZEND_STRL("Content-Range")))) {
+                                       Z_TRY_ADDREF_P(h_cr);
                                        zend_hash_str_update(&(*message)->hdrs, "X-Original-Content-Range", sizeof("X-Original-Content-Range"), h_cr);
                                        zend_hash_str_del(&(*message)->hdrs, "Content-Range", lenof("Content-Range"));
                                }
@@ -271,8 +274,8 @@ php_http_message_parser_state_t php_http_message_parser_parse(php_http_message_p
                                if ((flags & PHP_HTTP_MESSAGE_PARSER_EMPTY_REDIRECTS)
                                &&      (*message)->type == PHP_HTTP_RESPONSE
                                &&      (*message)->http.info.response.code/100 == 3
-                               &&      (h_loc = php_http_message_header(*message, ZEND_STRL("Location"), 1))
-                               &&      (h_con = php_http_message_header(*message, ZEND_STRL("Connection"), 1))
+                               &&      (h_loc = php_http_message_header(*message, ZEND_STRL("Location")))
+                               &&      (h_con = php_http_message_header(*message, ZEND_STRL("Connection")))
                                ) {
                                        if (php_http_match(Z_STRVAL_P(h_con), "close", PHP_HTTP_MATCH_WORD)) {
                                                php_http_message_parser_state_push(parser, 1, PHP_HTTP_MESSAGE_PARSER_STATE_DONE);
@@ -288,7 +291,7 @@ php_http_message_parser_state_t php_http_message_parser_parse(php_http_message_p
                                        zval_ptr_dtor(h_con);
                                }
 
-                               if ((h_ce = php_http_message_header(*message, ZEND_STRL("Content-Encoding"), 1))) {
+                               if ((h_ce = php_http_message_header(*message, ZEND_STRL("Content-Encoding")))) {
                                        if (php_http_match(Z_STRVAL_P(h_ce), "gzip", PHP_HTTP_MATCH_WORD)
                                        ||      php_http_match(Z_STRVAL_P(h_ce), "x-gzip", PHP_HTTP_MATCH_WORD)
                                        ||      php_http_match(Z_STRVAL_P(h_ce), "deflate", PHP_HTTP_MATCH_WORD)
@@ -298,10 +301,9 @@ php_http_message_parser_state_t php_http_message_parser_parse(php_http_message_p
                                                } else {
                                                        parser->inflate = php_http_encoding_stream_init(NULL, php_http_encoding_stream_get_inflate_ops(), 0);
                                                }
+                                               Z_TRY_ADDREF_P(h_ce);
                                                zend_hash_str_update(&(*message)->hdrs, "X-Original-Content-Encoding", lenof("X-Original-Content-Encoding"), h_ce);
                                                zend_hash_str_del(&(*message)->hdrs, "Content-Encoding", lenof("Content-Encoding"));
-                                       } else {
-                                               zval_ptr_dtor(h_ce);
                                        }
                                }
 
@@ -576,7 +578,9 @@ static PHP_METHOD(HttpMessageParser, parse)
        php_http_buffer_append(&parser_obj->buffer, data_str, data_len);
        RETVAL_LONG(php_http_message_parser_parse(parser_obj->parser, &parser_obj->buffer, flags, &parser_obj->parser->message));
 
+       ZVAL_DEREF(zmsg);
        zval_dtor(zmsg);
+       ZVAL_NULL(zmsg);
        if (parser_obj->parser->message) {
                php_http_message_t *msg_cpy = php_http_message_copy(parser_obj->parser->message, NULL);
                php_http_message_object_t *msg_obj = php_http_message_object_new_ex(php_http_message_class_entry, msg_cpy);
@@ -606,7 +610,9 @@ static PHP_METHOD(HttpMessageParser, stream)
        parser_obj = PHP_HTTP_OBJ(NULL, getThis());
        RETVAL_LONG(php_http_message_parser_parse_stream(parser_obj->parser, &parser_obj->buffer, s, flags, &parser_obj->parser->message));
 
+       ZVAL_DEREF(zmsg);
        zval_dtor(zmsg);
+       ZVAL_NULL(zmsg);
        if (parser_obj->parser->message) {
                php_http_message_t *msg_cpy = php_http_message_copy(parser_obj->parser->message, NULL);
                php_http_message_object_t *msg_obj = php_http_message_object_new_ex(php_http_message_class_entry, msg_cpy);
@@ -630,7 +636,7 @@ PHP_MINIT_FUNCTION(http_message_parser)
        memcpy(&php_http_message_parser_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
        php_http_message_parser_class_entry->create_object = php_http_message_parser_object_new;
        php_http_message_parser_object_handlers.clone_obj = NULL;
-       php_http_message_parser_object_handlers.dtor_obj = php_http_message_parser_object_free;
+       php_http_message_parser_object_handlers.free_obj = php_http_message_parser_object_free;
        php_http_message_parser_object_handlers.offset = XtOffsetOf(php_http_message_parser_object_t, zo);
 
        zend_declare_class_constant_long(php_http_message_parser_class_entry, ZEND_STRL("CLEANUP"), PHP_HTTP_MESSAGE_PARSER_CLEANUP);