X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_methods.c;h=1365fcf4c6a15c7630908ecc1e6f91094e3cc6b1;hp=93d6454230d52ba094fb115b395f62cc95491206;hb=d226b8581f49234f6769a123173b268aa9b2bb60;hpb=a268ede6ed45dc674906efd6fc8710012841e75e diff --git a/http_methods.c b/http_methods.c index 93d6454..1365fcf 100644 --- a/http_methods.c +++ b/http_methods.c @@ -15,9 +15,6 @@ /* $Id$ */ -#define _WINSOCKAPI_ -#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS - #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -439,7 +436,7 @@ PHP_METHOD(HTTPi_Response, send) getObject(httpi_response_object, obj); NO_ARGS; - + do_cache = GET_PROP(obj, cache); do_gzip = GET_PROP(obj, gzip); @@ -668,7 +665,7 @@ PHP_METHOD(HTTPi_Request, getURL) /* {{{ proto bool HTTPi_Request::setMethod(long request_method) * - * Set the request methods; one of the HTTP_HEAD, HTTP_GET or + * Set the request methods; one of the HTTP_HEAD, HTTP_GET or * HTTP_POST constants. */ PHP_METHOD(HTTPi_Request, setMethod) @@ -989,7 +986,7 @@ PHP_METHOD(HTTPi_Request, unsetPostFiles) /* {{{ proto array HTTPi_Request::getResponseData() * - * Get all resposonse data after sending the request. + * Get all response data after the request has been sent. */ PHP_METHOD(HTTPi_Request, getResponseData) { @@ -1004,28 +1001,39 @@ PHP_METHOD(HTTPi_Request, getResponseData) } /* }}} */ -/* {{{ proto array HTTPi_Request::getResponseHeaders() +/* {{{ proto string HTTPi_Request::getResponseHeader([string name]) * - * Get the response headers after sending the request. + * Get response header(s) after the request has been sent. */ -PHP_METHOD(HTTPi_Request, getResponseHeaders) +PHP_METHOD(HTTPi_Request, getResponseHeader) { - zval *data, **headers; - getObject(httpi_request_object, obj); + zval *data, **headers, **header; + char *header_name = NULL; + int header_len = 0; + getObject(httpi_response_object, obj); - NO_ARGS; + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &header_name, &header_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)) { + if (SUCCESS != zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) { + RETURN_FALSE; + } + + if (!header_len || !header_name) { + array_init(return_value); array_copy(*headers, return_value); + } else if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(headers), pretty_key(header_name, header_len, 1, 1), header_len + 1, (void **) &header)) { + RETURN_STRINGL(Z_STRVAL_PP(header), Z_STRLEN_PP(header), 1); + } else { + RETURN_FALSE; } } -/* }}} */ /* {{{ proto string HTTPi_Request::getResponseBody() * - * Get the response body after sending the request. + * Get the response body after the request has been sent. */ PHP_METHOD(HTTPi_Request, getResponseBody) { @@ -1038,32 +1046,93 @@ PHP_METHOD(HTTPi_Request, getResponseBody) if (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "body", sizeof("body"), (void **) &body)) { RETURN_STRINGL(Z_STRVAL_PP(body), Z_STRLEN_PP(body), 1); } else { - Z_TYPE_P(return_value) = IS_NULL; + RETURN_FALSE; } } /* }}} */ -/* {{{ proto array HTTPi_Request::getResponseInfo() +/* {{{ proto int HTTPi_Request::getResponseCode() * - * Get response info after sending the request. + * Get the response code after the request has been sent. + */ +PHP_METHOD(HTTPi_Request, getResponseCode) +{ + zval **code, **hdrs, *data; + getObject(httpi_request_object, obj); + + NO_ARGS; + + data = GET_PROP(obj, responseData); + if ( (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &hdrs)) && + (SUCCESS == zend_hash_find(Z_ARRVAL_PP(hdrs), "Status", sizeof("Status"), (void **) &code))) { + RETVAL_STRINGL(Z_STRVAL_PP(code), Z_STRLEN_PP(code), 1); + convert_to_long(return_value); + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto array HTTPi_Request::getResponseInfo([string name]) + * + * Get response info after the request has been sent. * See http_get() for a full list of returned info. */ PHP_METHOD(HTTPi_Request, getResponseInfo) { - zval *info; + zval *info, **infop; + char *info_name = NULL; + int info_len = 0; getObject(httpi_request_object, obj); - NO_ARGS; + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &info_name, &info_len)) { + RETURN_FALSE; + } info = GET_PROP(obj, responseInfo); - array_init(return_value); - array_copy(info, return_value); + + if (info_len && info_name) { + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(info), pretty_key(info_name, info_len, 0, 0), info_len + 1, (void **) &infop)) { + RETURN_ZVAL(*infop, 1, ZVAL_PTR_DTOR); + } else { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Could not find response info named %s", info_name); + RETURN_FALSE; + } + } else { + array_init(return_value); + array_copy(info, return_value); + } } /* }}}*/ /* {{{ proto bool HTTPi_Request::send() * * Send the HTTP request. + * + * GET example: + *
+ * setOptions(array('lastmodified' => filemtime('local.rss')));
+ * $r->addQueryData(array('category' => 3));
+ * if ($r->send() && $r->getResponseCode() == 200) {
+ *     file_put_contents('local.rss', $r->getResponseBody());
+ * }
+ * ?>
+ * 
+ * + * POST example: + *
+ * setOptions(array('cookies' => array('lang' => 'de')));
+ * $r->addPostData(array('user' => 'mike', 'pass' => 's3c|r3t'));
+ * $r->addPostFile('image', 'profile.jpg', 'image/jpeg');
+ * if ($r->send()) {
+ *     echo $r->getResponseBody();
+ * }
+ * ?>
+ * 
*/ PHP_METHOD(HTTPi_Request, send) { @@ -1087,8 +1156,8 @@ PHP_METHOD(HTTPi_Request, send) info = GET_PROP(obj, responseInfo); resp = GET_PROP(obj, responseData); - // HTTP_URI_MAXLEN+1 big char * - request_uri = http_absolute_uri(Z_STRVAL_P(URL), NULL); + // HTTP_URI_MAXLEN+1 long char * + request_uri = http_absolute_uri_ex(Z_STRVAL_P(URL), Z_STRLEN_P(URL), NULL, 0, NULL, 0, 0); if (Z_STRLEN_P(qdata) && (strlen(request_uri) < HTTP_URI_MAXLEN)) { if (!strchr(request_uri, '?')) {