+PHP_METHOD(HttpClient, request)
+{
+ char *meth_str, *url_str;
+ int meth_len, url_len;
+ zval *zheader, *zbody, *zoptions;
+
+ with_error_handling(EH_THROW, php_http_exception_get_class_entry()) {
+ if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|a!z!a!/", &meth_str, &meth_len, &url_str, &url_len, &zheader, &zbody, &zoptions)) {
+ php_http_client_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
+ php_http_message_object_t *msg_obj;
+ zend_object_value ov;
+ zval *req, *res = NULL;
+
+ php_http_new(&ov, php_http_client_request_get_class_entry(), (php_http_new_t) php_http_message_object_new_ex, NULL, NULL, (void *) &msg_obj TSRMLS_CC);
+ MAKE_STD_ZVAL(req);
+ ZVAL_OBJVAL(req, ov, 0);
+
+ msg_obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST TSRMLS_CC);
+ PHP_HTTP_INFO(msg_obj->message).request.url = estrndup(url_str, url_len);
+ PHP_HTTP_INFO(msg_obj->message).request.method = estrndup(meth_str, meth_len);
+
+ if (zheader) {
+ array_copy(Z_ARRVAL_P(zheader), &msg_obj->message->hdrs);
+ }
+
+ if (zbody) {
+ php_http_message_object_set_body(msg_obj, zbody TSRMLS_CC);
+ }
+
+ if (zoptions) {
+ php_http_client_options_set(req, zoptions TSRMLS_CC);
+ }
+
+ zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "send", &res, req);
+ RETVAL_ZVAL(res, 0, 1);
+ zval_ptr_dtor(&req);
+ }
+ } end_error_handling();
+}
+