X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_methods.c;h=1b2d80b786dc9c1a701fbcb66f33338e4b522d3e;hp=d22ae96e912c00c050ef0cc7f3c55492e9805ab9;hb=0ac32c9b8590e88a5f110cc8b3154001d5c0c089;hpb=af674f03c32f0f56b7f8c67e61c7e86b3ea23be5 diff --git a/http_methods.c b/http_methods.c index d22ae96..1b2d80b 100644 --- a/http_methods.c +++ b/http_methods.c @@ -21,9 +21,14 @@ #include "php.h" #include "php_http.h" +#include "php_http_std_defs.h" #include "php_http_api.h" +#include "php_http_cache_api.h" #include "php_http_curl_api.h" -#include "php_http_std_defs.h" +#include "php_http_date_api.h" +#include "php_http_headers_api.h" +#include "php_http_send_api.h" +#include "php_http_url_api.h" #ifdef ZEND_ENGINE_2 @@ -438,6 +443,11 @@ PHP_METHOD(HttpResponse, send) do_cache = GET_PROP(obj, cache); do_gzip = GET_PROP(obj, gzip); + /* gzip */ + if (Z_LVAL_P(do_gzip)) { + php_start_ob_buffer_named("ob_gzhandler", 0, 1 TSRMLS_CC); + } + /* caching */ if (Z_LVAL_P(do_cache)) { zval *cctrl, *etag, *lmod, *ccraw; @@ -458,11 +468,6 @@ PHP_METHOD(HttpResponse, send) } } - /* gzip */ - if (Z_LVAL_P(do_gzip)) { - /* ... */ - } - /* content type */ { zval *ctype = GET_PROP(obj, contentType); @@ -641,11 +646,74 @@ PHP_METHOD(HttpRequest, unsetOptions) } /* }}} */ -/* {{{ proto bool HttpRequest::addHeader(array header) +/* {{{ proto bool HttpRequest::setSslOptions(array options) * - * Add (a) request header name/value pair(s). + * Set additional SSL options. */ -PHP_METHOD(HttpRequest, addHeader) +PHP_METHOD(HttpRequest, setSslOptions) +{ + zval *opts, *old_opts, **ssl_options; + getObject(http_request_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &opts)) { + RETURN_FALSE; + } + + old_opts = GET_PROP(obj, options); + + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(old_opts), "ssl", sizeof("ssl"), (void **) &ssl_options)) { + array_merge(opts, *ssl_options); + } else { + zval_add_ref(&opts); + add_assoc_zval(old_opts, "ssl", opts); + } + + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto array HttpRequest::getSslOtpions() + * + * Get previously set SSL options. + */ +PHP_METHOD(HttpRequest, getSslOptions) +{ + zval *opts, **ssl_options; + getObject(http_request_object, obj); + + NO_ARGS; + + opts = GET_PROP(obj, options); + + array_init(return_value); + + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), "ssl", sizeof("ssl"), (void **) &ssl_options)) { + array_copy(*ssl_options, return_value); + } +} +/* }}} */ + +/* {{{ proto void HttpRequest::unsetSslOptions() + * + * Unset previously set SSL options. + */ +PHP_METHOD(HttpRequest, unsetSslOptions) +{ + zval *opts; + getObject(http_request_object, obj); + + NO_ARGS; + + opts = GET_PROP(obj, options); + zend_hash_del(Z_ARRVAL_P(opts), "ssl", sizeof("ssl")); +} +/* }}} */ + +/* {{{ proto bool HttpRequest::addHeaders(array headers) + * + * Add request header name/value pairs. + */ +PHP_METHOD(HttpRequest, addHeaders) { zval *opts, **headers, *new_headers; getObject(http_request_object, obj); @@ -667,11 +735,48 @@ PHP_METHOD(HttpRequest, addHeader) } /* }}} */ -/* {{{ proto bool HttpRequest::addCookie(array cookie) +/* {{{ proto array HttpRequest::getHeaders() * - * Add (a) cookie(s). + * Get previously set request headers. */ -PHP_METHOD(HttpRequest, addCookie) +PHP_METHOD(HttpRequest, getHeaders) +{ + zval *opts, **headers; + getObject(http_request_object, obj); + + NO_ARGS; + + opts = GET_PROP(obj, options); + + array_init(return_value); + + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), "headers", sizeof("headers"), (void **) &headers)) { + array_copy(*headers, return_value); + } +} +/* }}} */ + +/* {{{ proto void HttpRequest::unsetHeaders() + * + * Unset previously set request headers. + */ +PHP_METHOD(HttpRequest, unsetHeaders) +{ + zval *opts; + getObject(http_request_object, obj); + + NO_ARGS; + + opts = GET_PROP(obj, options); + zend_hash_del(Z_ARRVAL_P(opts), "headers", sizeof("headers")); +} +/* }}} */ + +/* {{{ proto bool HttpRequest::addCookies(array cookies) + * + * Add cookies. + */ +PHP_METHOD(HttpRequest, addCookies) { zval *opts, **cookies, *new_cookies; getObject(http_request_object, obj); @@ -693,6 +798,42 @@ PHP_METHOD(HttpRequest, addCookie) } /* }}} */ +/* {{{ proto array HttpRequest::getCookies() + * + * Get previously set cookies. + */ +PHP_METHOD(HttpRequest, getCookies) +{ + zval *opts, **cookies; + getObject(http_request_object, obj); + + NO_ARGS; + + opts = GET_PROP(obj, options); + + array_init(return_value); + + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), "cookies", sizeof("cookies"), (void **) &cookies)) { + array_copy(*cookies, return_value); + } +} +/* }}} */ + +/* {{{ proto void HttpRequest::unsetCookies() + * + */ +PHP_METHOD(HttpRequest, unsetCookies) +{ + zval *opts; + getObject(http_request_object, obj); + + NO_ARGS; + + opts = GET_PROP(obj, options); + zend_hash_del(Z_ARRVAL_P(opts), "cookies", sizeof("cookies")); +} +/* }}} */ + /* {{{ proto bool HttpRequest::setURL(string url) * * Set the request URL. @@ -1066,7 +1207,7 @@ PHP_METHOD(HttpRequest, getResponseData) } /* }}} */ -/* {{{ proto string HttpRequest::getResponseHeader([string name]) +/* {{{ proto mixed HttpRequest::getResponseHeader([string name]) * * Get response header(s) after the request has been sent. */ @@ -1095,6 +1236,94 @@ PHP_METHOD(HttpRequest, getResponseHeader) RETURN_FALSE; } } +/* }}} */ + +/* {{{ proto array HttpRequest::getResponseCookie([string name]) + * + * Get response cookie(s) after the request has been sent. + */ +PHP_METHOD(HttpRequest, getResponseCookie) +{ + zval *data, **headers; + char *cookie_name = NULL; + int cookie_len = 0; + getObject(http_request_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &cookie_name, &cookie_len)) { + RETURN_FALSE; + } + + array_init(return_value); + + data = GET_PROP(obj, responseData); + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) { + ulong idx = 0; + char *key = NULL; + zval **header = NULL; + + FOREACH_HASH_KEYVAL(Z_ARRVAL_PP(headers), key, idx, header) { + if (key && !strcasecmp(key, "Set-Cookie")) { + /* several cookies? */ + if (Z_TYPE_PP(header) == IS_ARRAY) { + zval **cookie; + + FOREACH_HASH_VAL(Z_ARRVAL_PP(header), cookie) { + zval *cookie_hash; + MAKE_STD_ZVAL(cookie_hash); + array_init(cookie_hash); + + if (SUCCESS == http_parse_cookie(Z_STRVAL_PP(cookie), Z_ARRVAL_P(cookie_hash))) { + if (!cookie_len) { + add_next_index_zval(return_value, cookie_hash); + } else { + zval **name; + + if ( (SUCCESS == zend_hash_find(Z_ARRVAL_P(cookie_hash), "name", sizeof("name"), (void **) &name)) && + (!strcmp(Z_STRVAL_PP(name), cookie_name))) { + add_next_index_zval(return_value, cookie_hash); + return; /* <<< FOUND >>> */ + } else { + zval_dtor(cookie_hash); + efree(cookie_hash); + } + } + } else { + zval_dtor(cookie_hash); + efree(cookie_hash); + } + } + } else { + zval *cookie_hash; + MAKE_STD_ZVAL(cookie_hash); + array_init(cookie_hash); + + if (SUCCESS == http_parse_cookie(Z_STRVAL_PP(header), Z_ARRVAL_P(cookie_hash))) { + if (!cookie_len) { + add_next_index_zval(return_value, cookie_hash); + } else { + zval **name; + + if ( (SUCCESS == zend_hash_find(Z_ARRVAL_P(cookie_hash), "name", sizeof("name"), (void **) &name)) && + (!strcmp(Z_STRVAL_PP(name), cookie_name))) { + add_next_index_zval(return_value, cookie_hash); + } else { + zval_dtor(cookie_hash); + efree(cookie_hash); + } + } + } else { + zval_dtor(cookie_hash); + efree(cookie_hash); + } + } + break; + } + /* reset key */ + key = NULL; + } + } +} +/* }}} */ /* {{{ proto string HttpRequest::getResponseBody() *