X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_request_object.c;h=45625f0f777ab4dbf1fa0be4d5e229ed5818e591;hb=dd199f9961262ed43fa544240df15a9d6d7d0f08;hp=7791d4c1c1fdf49bd532654b286b0a9d07d1653e;hpb=fc720d489914964ae837d7acbcdf9dc74b5a0f29;p=m6w6%2Fext-http diff --git a/http_request_object.c b/http_request_object.c index 7791d4c..45625f0 100644 --- a/http_request_object.c +++ b/http_request_object.c @@ -72,6 +72,11 @@ HTTP_BEGIN_ARGS(addCookies, 1) HTTP_ARG_VAL(cookies, 0) HTTP_END_ARGS; +HTTP_EMPTY_ARGS(enableCookies); +#if HTTP_CURL_VERSION(7,14,1) +HTTP_EMPTY_ARGS(resetCookies); +#endif + HTTP_EMPTY_ARGS(getUrl); HTTP_BEGIN_ARGS(setUrl, 1) HTTP_ARG_VAL(url, 0) @@ -190,6 +195,13 @@ HTTP_BEGIN_ARGS(postFields, 2) HTTP_ARG_VAL(info, 1) HTTP_END_ARGS; +HTTP_BEGIN_ARGS(putData, 2) + HTTP_ARG_VAL(url, 0) + HTTP_ARG_VAL(data, 0) + HTTP_ARG_VAL(options, 0) + HTTP_ARG_VAL(info, 1) +HTTP_END_ARGS; + HTTP_BEGIN_ARGS(putFile, 2) HTTP_ARG_VAL(url, 0) HTTP_ARG_VAL(file, 0) @@ -220,6 +232,11 @@ HTTP_BEGIN_ARGS(methodExists, 1) HTTP_ARG_VAL(method, 0) HTTP_END_ARGS; +HTTP_BEGIN_ARGS(encodeBody, 2) + HTTP_ARG_VAL(fields, 0) + HTTP_ARG_VAL(files, 0) +HTTP_END_ARGS; + #define OBJ_PROP_CE http_request_object_ce zend_class_entry *http_request_object_ce; zend_function_entry http_request_object_fe[] = { @@ -239,6 +256,11 @@ zend_function_entry http_request_object_fe[] = { HTTP_REQUEST_ME(getCookies, ZEND_ACC_PUBLIC) HTTP_REQUEST_ME(setCookies, ZEND_ACC_PUBLIC) + HTTP_REQUEST_ME(enableCookies, ZEND_ACC_PUBLIC) +#if HTTP_CURL_VERSION(7,14,1) + HTTP_REQUEST_ME(resetCookies, ZEND_ACC_PUBLIC) +#endif + HTTP_REQUEST_ME(setMethod, ZEND_ACC_PUBLIC) HTTP_REQUEST_ME(getMethod, ZEND_ACC_PUBLIC) @@ -291,6 +313,7 @@ zend_function_entry http_request_object_fe[] = { HTTP_REQUEST_ALIAS(head, http_head) HTTP_REQUEST_ALIAS(postData, http_post_data) HTTP_REQUEST_ALIAS(postFields, http_post_fields) + HTTP_REQUEST_ALIAS(putData, http_put_data) HTTP_REQUEST_ALIAS(putFile, http_put_file) HTTP_REQUEST_ALIAS(putStream, http_put_stream) @@ -298,6 +321,8 @@ zend_function_entry http_request_object_fe[] = { HTTP_REQUEST_ALIAS(methodUnregister, http_request_method_unregister) HTTP_REQUEST_ALIAS(methodName, http_request_method_name) HTTP_REQUEST_ALIAS(methodExists, http_request_method_exists) + + HTTP_REQUEST_ALIAS(encodeBody, http_request_body_encode) EMPTY_FUNCTION_ENTRY }; @@ -409,7 +434,7 @@ zend_object_value _http_request_object_new_ex(zend_class_entry *ce, CURL *ch, ht } ALLOC_HASHTABLE(OBJ_PROP(o)); - zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_init(OBJ_PROP(o), zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(OBJ_PROP(o), &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); ov.handle = putObject(http_request_object, o); @@ -459,12 +484,12 @@ static inline void _http_request_object_check_request_content_type(zval *this_pt zval **headers, *opts = GET_PROP(options); if ( (Z_TYPE_P(opts) == IS_ARRAY) && - (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), "headers", sizeof("headers"), (void **) &headers)) && + (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), "headers", sizeof("headers"), (void *) &headers)) && (Z_TYPE_PP(headers) == IS_ARRAY)) { zval **ct_header; /* only override if not already set */ - if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(headers), "Content-Type", sizeof("Content-Type"), (void **) &ct_header))) { + if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(headers), "Content-Type", sizeof("Content-Type"), (void *) &ct_header))) { add_assoc_stringl(*headers, "Content-Type", Z_STRVAL_P(ctype), Z_STRLEN_P(ctype), 1); } else /* or not a string, zero length string or a string of spaces */ @@ -509,7 +534,7 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ { case HTTP_GET: case HTTP_HEAD: - break; + break; case HTTP_PUT: { @@ -529,8 +554,8 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ status = FAILURE; } } + break; } - break; case HTTP_POST: default: @@ -556,8 +581,8 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ } } } + break; } - break; } if (status == SUCCESS) { @@ -580,7 +605,7 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ zval **entry, *pcb; if ( (Z_TYPE_P(options) != IS_ARRAY) - || (SUCCESS != zend_hash_find(Z_ARRVAL_P(options), "onprogress", sizeof("onprogress"), (void **) &entry) + || (SUCCESS != zend_hash_find(Z_ARRVAL_P(options), "onprogress", sizeof("onprogress"), (void *) &entry) || (!zval_is_true(*entry)))) { MAKE_STD_ZVAL(pcb); array_init(pcb); @@ -633,7 +658,7 @@ STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this } UPD_PROP(long, responseCode, msg->http.info.response.code); - UPD_PROP(string, responseStatus, msg->http.info.response.status); + UPD_PROP(string, responseStatus, msg->http.info.response.status ? msg->http.info.response.status : ""); MAKE_STD_ZVAL(resp); array_init(resp); @@ -688,12 +713,14 @@ STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this ret = FAILURE; } - if (zend_hash_exists(&Z_OBJCE_P(getThis())->function_table, "onfinish", sizeof("onfinish"))) { + if (!EG(exception) && zend_hash_exists(&Z_OBJCE_P(getThis())->function_table, "onfinish", sizeof("onfinish"))) { zval *param; MAKE_STD_ZVAL(param); ZVAL_BOOL(param, ret == SUCCESS); - zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "onfinish", NULL, param); + with_error_handling(EH_NORMAL, NULL) { + zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "onfinish", NULL, param); + } end_error_handling(); zval_ptr_dtor(¶m); } @@ -728,7 +755,7 @@ static inline void _http_request_object_set_options_subr(INTERNAL_FUNCTION_PARAM if (prettify_keys && opts) { zend_hash_apply_with_arguments(Z_ARRVAL_P(opts), apply_pretty_key, 0); } - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(new_opts), key, len, (void **) &entry)) { + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(new_opts), key, len, (void *) &entry)) { if (overwrite) { zend_hash_clean(Z_ARRVAL_PP(entry)); } @@ -755,14 +782,14 @@ static inline void _http_request_get_options_subr(INTERNAL_FUNCTION_PARAMETERS, { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { zval *opts, **options; opts = GET_PROP(options); array_init(return_value); if ( (Z_TYPE_P(opts) == IS_ARRAY) && - (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), key, len, (void **) &options))) { + (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), key, len, (void *) &options))) { convert_to_array(*options); array_copy(*options, return_value); } @@ -851,6 +878,11 @@ PHP_METHOD(HttpRequest, setOptions) zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "seturl", NULL, *opt); } else if (!strcmp(key, "method")) { zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "setmethod", NULL, *opt); +#if HTTP_CURL_VERSION(7,14,1) + } else if (!strcmp(key, "resetcookies")) { + getObject(http_request_object, obj); + http_request_reset_cookies(obj->request); +#endif } else { ZVAL_ADDREF(*opt); add_assoc_zval(add_opts, key, *opt); @@ -883,7 +915,7 @@ PHP_METHOD(HttpRequest, getOptions) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(options); } } @@ -1013,6 +1045,35 @@ PHP_METHOD(HttpRequest, getCookies) } /* }}} */ +/* {{{ proto bool HttpRequest::enableCookies() + * + * Enable automatic sending of received cookies. + * Note that cuutomly set cookies will be sent anyway. + */ +PHP_METHOD(HttpRequest, enableCookies) +{ + NO_ARGS { + getObject(http_request_object, obj); + RETURN_SUCCESS(http_request_enable_cookies(obj->request)); + } + +} +/* }}} */ + +/* {{{ proto bool HttpRequest::resetCookies() + * + * Reset all automatically received/sent cookies. + * Note that customly set cookies are not affected. + */ +PHP_METHOD(HttpRequest, resetCookies) +{ + NO_ARGS { + getObject(http_request_object, obj); + RETURN_SUCCESS(http_request_reset_cookies(obj->request)); + } +} +/* }}} */ + /* {{{ proto bool HttpRequest::setUrl(string url) * * Set the request URL. @@ -1045,7 +1106,7 @@ PHP_METHOD(HttpRequest, getUrl) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(url); } } @@ -1083,7 +1144,7 @@ PHP_METHOD(HttpRequest, getMethod) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(method); } } @@ -1126,7 +1187,7 @@ PHP_METHOD(HttpRequest, getContentType) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(contentType); } } @@ -1185,7 +1246,7 @@ PHP_METHOD(HttpRequest, getQueryData) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(queryData); } } @@ -1297,7 +1358,7 @@ PHP_METHOD(HttpRequest, getPostFields) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(postFields); } } @@ -1377,7 +1438,7 @@ PHP_METHOD(HttpRequest, getRawPostData) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(rawPostData); } } @@ -1475,7 +1536,7 @@ PHP_METHOD(HttpRequest, getPostFiles) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(postFiles); } } @@ -1514,7 +1575,7 @@ PHP_METHOD(HttpRequest, getPutFile) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(putFile); } } @@ -1594,7 +1655,7 @@ PHP_METHOD(HttpRequest, getPutData) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(putData); } } @@ -1615,7 +1676,7 @@ PHP_METHOD(HttpRequest, getResponseData) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(responseData); } } @@ -1636,7 +1697,7 @@ PHP_METHOD(HttpRequest, getResponseData) */ PHP_METHOD(HttpRequest, getResponseHeader) { - IF_RETVAL_USED { + if (return_value_used) { zval *data, **headers, **header; char *header_name = NULL; int header_len = 0; @@ -1647,11 +1708,11 @@ PHP_METHOD(HttpRequest, getResponseHeader) data = GET_PROP(responseData); if ( (Z_TYPE_P(data) == IS_ARRAY) && - (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) && + (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void *) &headers)) && (Z_TYPE_PP(headers) == IS_ARRAY)) { if (!header_len || !header_name) { RETVAL_ZVAL(*headers, 1, 0); - } else if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(headers), pretty_key(header_name, header_len, 1, 1), header_len + 1, (void **) &header)) { + } else if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(headers), pretty_key(header_name, header_len, 1, 1), header_len + 1, (void *) &header)) { RETVAL_ZVAL(*header, 1, 0); } else { RETVAL_FALSE; @@ -1674,7 +1735,7 @@ PHP_METHOD(HttpRequest, getResponseHeader) */ PHP_METHOD(HttpRequest, getResponseCookies) { - IF_RETVAL_USED { + if (return_value_used) { long flags = 0; zval *allowed_extras_array = NULL, *data, **headers; @@ -1684,7 +1745,7 @@ PHP_METHOD(HttpRequest, getResponseCookies) data = GET_PROP(responseData); if ( (Z_TYPE_P(data) == IS_ARRAY) && - (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) && + (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void *) &headers)) && (Z_TYPE_PP(headers) == IS_ARRAY)) { int i = 0; ulong idx = 0; @@ -1770,12 +1831,12 @@ PHP_METHOD(HttpRequest, getResponseBody) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { zval **body; zval *data = GET_PROP(responseData); if ( (Z_TYPE_P(data) == IS_ARRAY) && - (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "body", sizeof("body"), (void **) &body))) { + (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "body", sizeof("body"), (void *) &body))) { RETURN_ZVAL(*body, 1, 0); } else { RETURN_FALSE; @@ -1797,7 +1858,7 @@ PHP_METHOD(HttpRequest, getResponseCode) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(responseCode); } } @@ -1813,7 +1874,7 @@ PHP_METHOD(HttpRequest, getResponseStatus) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { RETURN_PROP(responseStatus); } } @@ -1837,7 +1898,7 @@ PHP_METHOD(HttpRequest, getResponseStatus) */ PHP_METHOD(HttpRequest, getResponseInfo) { - IF_RETVAL_USED { + if (return_value_used) { zval *info, **infop; char *info_name = NULL; int info_len = 0; @@ -1853,7 +1914,7 @@ PHP_METHOD(HttpRequest, getResponseInfo) } 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)) { + 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, 0); } else { http_error_ex(HE_NOTICE, HTTP_E_INVALID_PARAM, "Could not find response info named %s", info_name); @@ -1918,7 +1979,7 @@ PHP_METHOD(HttpRequest, getRequestMessage) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { http_message *msg; getObject(http_request_object, obj); @@ -1941,7 +2002,7 @@ PHP_METHOD(HttpRequest, getRawRequestMessage) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_request_object, obj); RETURN_PHPSTR_DUP(&obj->request->conv.request); @@ -1959,7 +2020,7 @@ PHP_METHOD(HttpRequest, getRawResponseMessage) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_request_object, obj); RETURN_PHPSTR_DUP(&obj->request->conv.response); @@ -1986,7 +2047,7 @@ PHP_METHOD(HttpRequest, getHistory) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { zval *hist; SET_EH_THROW_HTTP();