X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_methods.c;h=e10923b2b473a2e30d09c6cd9b1e0829c4eb37cb;hp=980245c6f3bca12fa4d0659d25368a16fe1ebf73;hb=2269e8e11a6837fc165ae85406ea6db84c1995cc;hpb=7df1235b7cd60b2f0bd8154bc0985e042a110495 diff --git a/http_methods.c b/http_methods.c index 980245c..e10923b 100644 --- a/http_methods.c +++ b/http_methods.c @@ -36,6 +36,7 @@ #include "php_http_message_object.h" #include "php_http_response_object.h" #include "php_http_request_object.h" +#include "php_http_requestpool_object.h" #include "php_http_exception_object.h" #ifdef ZEND_ENGINE_2 @@ -1726,6 +1727,29 @@ PHP_METHOD(HttpRequest, addPostFile) } /* }}} */ +/* {{{ proto bool HttpRequest::setPostFiles() + * + * Set files to post. + * Overwrites previously set post files. + * Affects only POST requests. + */ +PHP_METHOD(HttpRequest, setPostFiles) +{ + zval *files, *pFiles; + getObject(http_request_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &files)) { + RETURN_FALSE; + } + + pFiles = GET_PROP(obj, postFiles); + zend_hash_clean(Z_ARRVAL_P(pFiles)); + array_copy(files, pFiles); + + RETURN_TRUE; +} +/* }}} */ + /* {{{ proto array HttpRequest::getPostFiles() * * Get all previously added POST files. @@ -1763,6 +1787,59 @@ PHP_METHOD(HttpRequest, unsetPostFiles) } /* }}} */ +/* {{{ proto bool HttpRequest::SetPutFile(string file) + * + * Set file to put. + * Affects only PUT requests. + */ +PHP_METHOD(HttpRequest, setPutFile) +{ + char *file; + int file_len; + getObject(http_request_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_len)) { + RETURN_FALSE; + } + + UPD_PROP(obj, string, putFile, file); + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto string HttpRequest::getPutFile() + * + * Get previously set put file. + */ +PHP_METHOD(HttpRequest, getPutFile) +{ + NO_ARGS; + + IF_RETVAL_USED { + zval *putfile; + getObject(http_request_object, obj); + + putfile = GET_PROP(obj, putFile); + RETVAL_STRINGL(Z_STRVAL_P(putfile), Z_STRLEN_P(putfile), 1); + } +} +/* }}} */ + +/* {{{ proto void HttpRequest::unsetPutFile() + * + * Unset file to put. + * Affects only PUT requests. + */ +PHP_METHOD(HttpRequest, unsetPutFile) +{ + getObject(http_request_object, obj); + + NO_ARGS; + + UPD_PROP(obj, string, putFile, ""); +} +/* }}} */ + /* {{{ proto array HttpRequest::getResponseData() * * Get all response data after the request has been sent. @@ -2035,130 +2112,129 @@ PHP_METHOD(HttpRequest, getResponseMessage) PHP_METHOD(HttpRequest, send) { STATUS status = FAILURE; - zval *meth, *URL, *qdata, *opts, *info, *resp; - char *request_uri; + http_request_body body = {0}; getObject(http_request_object, obj); NO_ARGS; SET_EH_THROW_HTTP(); - if ((!obj->ch) && (!(obj->ch = curl_easy_init()))) { - http_error(E_WARNING, HTTP_E_CURL, "Could not initilaize curl"); + if (obj->pool) { + http_error(E_WARNING, HTTP_E_CURL, "You cannot call HttpRequest::send() while attached to an HttpRequestPool"); RETURN_FALSE; } - meth = GET_PROP(obj, method); - URL = GET_PROP(obj, url); - qdata = GET_PROP(obj, queryData); - opts = GET_PROP(obj, options); - info = GET_PROP(obj, responseInfo); - resp = GET_PROP(obj, responseData); - - // HTTP_URI_MAXLEN+1 long char * - if (!(request_uri = http_absolute_uri_ex(Z_STRVAL_P(URL), Z_STRLEN_P(URL), NULL, 0, NULL, 0, 0))) { - RETURN_FALSE; + if (SUCCESS == (status = http_request_object_requesthandler(obj, getThis(), &body))) { + zval *info = GET_PROP(obj, responseInfo); + status = http_request_exec(obj->ch, Z_ARRVAL_P(info)); + SET_PROP(obj, responseInfo, info); } + http_request_body_dtor(&body); - if (Z_STRLEN_P(qdata) && (strlen(request_uri) < HTTP_URI_MAXLEN)) { - if (!strchr(request_uri, '?')) { - strcat(request_uri, "?"); - } else { - strcat(request_uri, "&"); - } - strncat(request_uri, Z_STRVAL_P(qdata), HTTP_URI_MAXLEN - strlen(request_uri)); + /* final data handling */ + if (SUCCESS == status) { + status = http_request_object_responsehandler(obj, getThis(), NULL); } - switch (Z_LVAL_P(meth)) - { - case HTTP_GET: - case HTTP_HEAD: - status = http_request_ex(obj->ch, Z_LVAL_P(meth), request_uri, NULL, Z_ARRVAL_P(opts), Z_ARRVAL_P(info), &obj->response); - break; - - case HTTP_PUT: - { - http_request_body body; - php_stream *stream; - php_stream_statbuf ssb; - zval *file = GET_PROP(obj, putFile); - - if ( (stream = php_stream_open_wrapper(Z_STRVAL_P(file), "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL)) && - !php_stream_stat(stream, &ssb)) { - body.type = HTTP_REQUEST_BODY_UPLOADFILE; - body.data = stream; - body.size = ssb.sb.st_size; - - status = http_put_ex(obj->ch, request_uri, &body, Z_ARRVAL_P(opts), Z_ARRVAL_P(info), &obj->response); - http_request_body_dtor(&body); - } else { - status = FAILURE; - } - } - break; - - case HTTP_POST: - { - http_request_body body; - zval *fields = GET_PROP(obj, postFields), *files = GET_PROP(obj, postFiles); + SET_EH_NORMAL(); + RETURN_SUCCESS(status); +} +/* }}} */ - if (SUCCESS == (status = http_request_body_fill(&body, Z_ARRVAL_P(fields), Z_ARRVAL_P(files)))) { - status = http_post_ex(obj->ch, request_uri, &body, Z_ARRVAL_P(opts), Z_ARRVAL_P(info), &obj->response); - http_request_body_dtor(&body); - } - } - break; +/* {{{ HttpRequestPool */ - default: - { - http_request_body body; - zval *post = GET_PROP(obj, postData); +/* {{{ proto void HttpRequestPool::__construct() + * + * Instantiate a new HttpRequestPool object. + */ +PHP_METHOD(HttpRequestPool, __construct) +{ + NO_ARGS; +} +/* }}} */ - body.type = HTTP_REQUEST_BODY_CSTRING; - body.data = Z_STRVAL_P(post); - body.size = Z_STRLEN_P(post); +/* {{{ proto void HttpRequestPool::__destruct() + * + * Clean up HttpRequestPool object. + */ +PHP_METHOD(HttpRequestPool, __destruct) +{ + getObject(http_requestpool_object, obj); - status = http_request_ex(obj->ch, Z_LVAL_P(meth), request_uri, &body, Z_ARRVAL_P(opts), Z_ARRVAL_P(info), &obj->response); - } - break; - } + NO_ARGS; - efree(request_uri); + http_request_pool_detach_all(&obj->pool); +} +/* }}} */ - /* final data handling */ - if (status == SUCCESS) { - http_message *msg; +/* {{{ proto void HttpRequestPool::reset() + * + * Detach all attached HttpRequest objects. + */ +PHP_METHOD(HttpRequestPool, reset) +{ + getObject(http_requestpool_object, obj); - if (msg = http_message_parse(PHPSTR_VAL(&obj->response), PHPSTR_LEN(&obj->response))) { - zval *headers, *message; - char *body; - size_t body_len; + NO_ARGS; - UPD_PROP(obj, long, responseCode, msg->info.response.code); + http_request_pool_detach_all(&obj->pool); +} - MAKE_STD_ZVAL(headers) - array_init(headers); +/* {{{ proto bool HttpRequestPool::attach(HttpRequest request) + * + * Attach an HttpRequest object to this HttpRequestPool. + * NOTE: set all options prior attaching! + */ +PHP_METHOD(HttpRequestPool, attach) +{ + zval *request; + STATUS status = FAILURE; + getObject(http_requestpool_object, obj); - zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); - phpstr_data(PHPSTR(msg), &body, &body_len); + SET_EH_THROW_HTTP(); + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) { + status = http_request_pool_attach(&obj->pool, request); + } + SET_EH_NORMAL(); + RETURN_SUCCESS(status); +} +/* }}} */ - add_assoc_zval(resp, "headers", headers); - add_assoc_stringl(resp, "body", body, body_len, 0); +/* {{{ proto bool HttpRequestPool::detach(HttpRequest request) + * + * Detach an HttpRequest object from this HttpRequestPool. + */ +PHP_METHOD(HttpRequestPool, detach) +{ + zval *request; + STATUS status = FAILURE; + getObject(http_requestpool_object, obj); - message = GET_PROP(obj, responseMessage); - zval_dtor(message); - Z_TYPE_P(message) = IS_OBJECT; - message->value.obj = http_message_object_from_msg(msg); - SET_PROP(obj, responseMessage, message); - } else { - status = FAILURE; - } + SET_EH_THROW_HTTP(); + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) { + status = http_request_pool_detach(&obj->pool, request); } - SET_EH_NORMAL(); RETURN_SUCCESS(status); } /* }}} */ + +/* {{{ proto bool HttpRequestPool::send() + * + * Send all attached HttpRequest objects in parallel. + */ +PHP_METHOD(HttpRequestPool, send) +{ + getObject(http_requestpool_object, obj); + + NO_ARGS; + + RETURN_SUCCESS(http_request_pool_send(&obj->pool)); +} +/* }}} */ + +/* }}} */ + /* }}} */ #endif /* HTTP_HAVE_CURL */