From add8166df3235a7680703eddc36edee7dcc20b20 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 24 Mar 2005 16:32:48 +0000 Subject: [PATCH] * renamed HttpRequest::addHeader() to ::addHeaders() and addCookie() to ::addCookies() * added ::(set|get|unset)SslOptions() * added ::(get|unstet)(Headers|Cookies)() --- http.c | 12 ++- http_methods.c | 238 +++++++++++++++++++++++++++++++++++++++++++++++-- php_http.h | 12 ++- 3 files changed, 251 insertions(+), 11 deletions(-) diff --git a/http.c b/http.c index e0f61fc..fe5d66e 100644 --- a/http.c +++ b/http.c @@ -308,9 +308,16 @@ zend_function_entry http_request_class_methods[] = { PHP_ME(HttpRequest, setOptions, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequest, getOptions, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequest, unsetOptions, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, setSslOptions, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, getSslOptions, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, unsetSslOptions, NULL, ZEND_ACC_PUBLIC) - PHP_ME(HttpRequest, addHeader, NULL, ZEND_ACC_PUBLIC) - PHP_ME(HttpRequest, addCookie, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, addHeaders, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, getHeaders, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, unsetHeaders, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, addCookies, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, getCookies, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, unsetCookies, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequest, setMethod, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequest, getMethod, NULL, ZEND_ACC_PUBLIC) @@ -339,6 +346,7 @@ zend_function_entry http_request_class_methods[] = { PHP_ME(HttpRequest, getResponseData, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequest, getResponseHeader, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpRequest, getResponseCookie, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequest, getResponseCode, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequest, getResponseBody, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpRequest, getResponseInfo, NULL, ZEND_ACC_PUBLIC) diff --git a/http_methods.c b/http_methods.c index d22ae96..1c3b99c 100644 --- a/http_methods.c +++ b/http_methods.c @@ -641,11 +641,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 +730,48 @@ PHP_METHOD(HttpRequest, addHeader) } /* }}} */ -/* {{{ proto bool HttpRequest::addCookie(array cookie) +/* {{{ proto array HttpRequest::getHeaders() + * + * Get previously set request headers. + */ +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() * - * Add (a) cookie(s). + * Unset previously set request headers. */ -PHP_METHOD(HttpRequest, addCookie) +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 +793,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 +1202,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 +1231,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() * diff --git a/php_http.h b/php_http.h index 95624e5..d16652d 100644 --- a/php_http.h +++ b/php_http.h @@ -118,8 +118,15 @@ PHP_METHOD(HttpRequest, __destruct); PHP_METHOD(HttpRequest, setOptions); PHP_METHOD(HttpRequest, getOptions); PHP_METHOD(HttpRequest, unsetOptions); -PHP_METHOD(HttpRequest, addHeader); -PHP_METHOD(HttpRequest, addCookie); +PHP_METHOD(HttpRequest, setSslOptions); +PHP_METHOD(HttpRequest, getSslOptions); +PHP_METHOD(HttpRequest, unsetSslOptions); +PHP_METHOD(HttpRequest, addHeaders); +PHP_METHOD(HttpRequest, getHeaders); +PHP_METHOD(HttpRequest, unsetHeaders); +PHP_METHOD(HttpRequest, addCookies); +PHP_METHOD(HttpRequest, getCookies); +PHP_METHOD(HttpRequest, unsetCookies); PHP_METHOD(HttpRequest, setMethod); PHP_METHOD(HttpRequest, getMethod); PHP_METHOD(HttpRequest, setURL); @@ -140,6 +147,7 @@ PHP_METHOD(HttpRequest, unsetPostFiles); PHP_METHOD(HttpRequest, send); PHP_METHOD(HttpRequest, getResponseData); PHP_METHOD(HttpRequest, getResponseHeader); +PHP_METHOD(HttpRequest, getResponseCookie); PHP_METHOD(HttpRequest, getResponseCode); PHP_METHOD(HttpRequest, getResponseBody); PHP_METHOD(HttpRequest, getResponseInfo); -- 2.30.2