- char *meth_str = NULL, *url_str = NULL;
- int meth_len = 0, url_len = 0;
- zval *zheaders = NULL, *zbody = NULL;
-
- with_error_handling(EH_THROW, php_http_exception_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_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->zv = 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, body_obj ? body_obj->body : NULL TSRMLS_CC);
- }
-
- if (meth_str && meth_len) {
- PHP_HTTP_INFO(obj->message).request.method = estrndup(meth_str, meth_len);
- }
- if (url_str && url_len) {
- PHP_HTTP_INFO(obj->message).request.url = estrndup(url_str, url_len);
- }
- if (zheaders) {
- array_copy(Z_ARRVAL_P(zheaders), &obj->message->hdrs);
- }
- }
- } end_error_handling();
+ char *meth_str = NULL;
+ size_t meth_len = 0;
+ zval *zheaders = NULL, *zbody = NULL, *zurl = NULL;
+ php_http_message_object_t *obj;
+
+ php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS(), "|s!z!a!O!", &meth_str, &meth_len, &zurl, &zheaders, &zbody, php_http_message_body_class_entry), invalid_arg, return);
+
+ obj = PHP_HTTP_OBJ(NULL, getThis());
+
+ if (obj->message) {
+ php_http_message_set_type(obj->message, PHP_HTTP_REQUEST);
+ } else {
+ obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST, NULL);
+ }
+
+ if (zbody) {
+ php_http_expect(SUCCESS == php_http_message_object_set_body(obj, zbody), unexpected_val, return);
+ }
+ if (meth_str && meth_len) {
+ PHP_HTTP_INFO(obj->message).request.method = estrndup(meth_str, meth_len);
+ }
+ if (zurl) {
+ PHP_HTTP_INFO(obj->message).request.url = php_http_url_from_zval(zurl, ~0);
+ }
+ if (zheaders) {
+ array_copy(Z_ARRVAL_P(zheaders), &obj->message->hdrs);
+ }