codename: client meltdown
[m6w6/ext-http] / php_http_client_request.c
index c073512ed5f02871e4054bb9b1cec20e4dc1ef86..42117f95cce513688058cb1155c4d838947f4607 100644 (file)
 
 #include "php_http_api.h"
 
+void php_http_client_options_set_subr(zval *this_ptr, char *key, size_t len, zval *opts, int overwrite TSRMLS_DC);
+void php_http_client_options_set(zval *this_ptr, zval *opts TSRMLS_DC);
+void php_http_client_options_get_subr(zval *this_ptr, char *key, size_t len, zval *return_value TSRMLS_DC);
+
 #define PHP_HTTP_BEGIN_ARGS(method, req_args)                  PHP_HTTP_BEGIN_ARGS_EX(HttpClientRequest, method, 0, req_args)
 #define PHP_HTTP_EMPTY_ARGS(method)                                            PHP_HTTP_EMPTY_ARGS_EX(HttpClientRequest, method, 0)
 #define PHP_HTTP_CLIENT_REQUEST_ME(method, visibility) PHP_ME(HttpClientRequest, method, PHP_HTTP_ARGS(HttpClientRequest, method), visibility)
@@ -86,11 +90,23 @@ PHP_METHOD(HttpClientRequest, __construct)
        with_error_handling(EH_THROW, php_http_exception_get_class_entry()) {
                if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!a!O!", &meth_str, &meth_len, &url_str, &url_len, &zheaders, &zbody, php_http_message_body_get_class_entry())) {
                        php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
+                       php_http_message_body_object_t *body_obj = NULL;
+
+                       if (zbody) {
+                               body_obj = zend_object_store_get_object(zbody TSRMLS_CC);
+                               Z_OBJ_ADDREF_P(zbody);
+                               obj->body = Z_OBJVAL_P(zbody);
+                               php_http_message_body_addref(body_obj->body);
+                       }
 
                        if (obj->message) {
                                php_http_message_set_type(obj->message, PHP_HTTP_REQUEST);
+                               if (body_obj) {
+                                       php_http_message_body_free(&obj->message->body);
+                                       obj->message->body = body_obj->body;
+                               }
                        } else {
-                               obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST TSRMLS_CC);
+                               obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST, body_obj ? body_obj->body : NULL TSRMLS_CC);
                        }
 
                        if (meth_str && meth_len) {
@@ -102,14 +118,6 @@ PHP_METHOD(HttpClientRequest, __construct)
                        if (zheaders) {
                                array_copy(Z_ARRVAL_P(zheaders), &obj->message->hdrs);
                        }
-                       if (zbody) {
-                               php_http_message_body_object_t *body_obj = zend_object_store_get_object(zbody TSRMLS_CC);
-
-                               php_http_message_body_dtor(&obj->message->body);
-                               php_http_message_body_copy(body_obj->body, &obj->message->body, 0);
-                               Z_OBJ_ADDREF_P(zbody);
-                               obj->body = Z_OBJVAL_P(zbody);
-                       }
                }
        } end_error_handling();
 }
@@ -145,7 +153,7 @@ PHP_METHOD(HttpClientRequest, getContentType)
                php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
                zval *zct = php_http_message_header(obj->message, ZEND_STRL("Content-Type"), 1);
 
-               RETURN_ZVAL(zct, 0, 0);
+               RETURN_ZVAL(zct, 0, 1);
        }
        RETURN_FALSE;
 }