X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_methods.c;h=85d029e675359d70717b8df34de1072c6bac419e;hp=2f7a429fc9db51556245b7fdd7fba41d6846b3c4;hb=a12e8ddfaa5a94e76261f165b0c0299c87b886b1;hpb=a19a05825d04d634834f7898ec1a5247fdd6095c diff --git a/http_methods.c b/http_methods.c index 2f7a429..85d029e 100644 --- a/http_methods.c +++ b/http_methods.c @@ -15,6 +15,9 @@ /* $Id$ */ +#define _WINSOCKAPI_ +#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -23,6 +26,8 @@ #include "php_http.h" #include "php_http_api.h" #include "php_http_curl_api.h" +#include "php_http_std_defs.h" + #include "ext/standard/php_smart_str.h" #ifdef ZEND_ENGINE_2 @@ -272,7 +277,6 @@ PHP_METHOD(HTTPi_Response, getETag) PHP_METHOD(HTTPi_Response, setData) { zval *the_data; - char *etag; getObject(httpi_response_object, obj); if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &the_data)) { @@ -309,7 +313,6 @@ PHP_METHOD(HTTPi_Response, setStream) { zval *the_stream; php_stream *the_real_stream; - char *etag; getObject(httpi_response_object, obj); if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &the_stream)) { @@ -435,7 +438,8 @@ PHP_METHOD(HTTPi_Response, send) { case SEND_DATA: { - RETURN_SUCCESS(http_send_data(GET_PROP(obj, data))); + zval *zdata = GET_PROP(obj, data); + RETURN_SUCCESS(http_send_data(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata))); } case SEND_RSRC: @@ -448,7 +452,8 @@ PHP_METHOD(HTTPi_Response, send) default: { - RETURN_SUCCESS(http_send_file(GET_PROP(obj, file))); + zval *zfile = GET_PROP(obj, file); + RETURN_SUCCESS(http_send_file(Z_STRVAL_P(zfile))); } } } @@ -467,7 +472,6 @@ PHP_METHOD(HTTPi_Request, __construct) char *URL = NULL; int URL_len; long meth = -1; - zval *info, *opts, *resp; getObject(httpi_request_object, obj); if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sl", &URL, &URL_len, &meth)) { @@ -511,6 +515,8 @@ PHP_METHOD(HTTPi_Request, __destruct) */ PHP_METHOD(HTTPi_Request, setOptions) { + char *key = NULL; + long idx = 0; zval *opts, *old_opts, **opt; getObject(httpi_request_object, obj); @@ -520,13 +526,9 @@ PHP_METHOD(HTTPi_Request, setOptions) old_opts = GET_PROP(obj, options); - /* headers and cookies need extra attention -- thus cannot use zend_hash_merge() or php_array_merge() directly */ - for ( zend_hash_internal_pointer_reset(Z_ARRVAL_P(opts)); - zend_hash_get_current_data(Z_ARRVAL_P(opts), (void **) &opt) == SUCCESS; - zend_hash_move_forward(Z_ARRVAL_P(opts))) { - char *key; - long idx; - if (HASH_KEY_IS_STRING == zend_hash_get_current_key(Z_ARRVAL_P(opts), &key, &idx, 0)) { + /* headers and cookies need extra attention -- thus cannot use array_merge() directly */ + FOREACH_KEYVAL(opts, key, idx, opt) { + if (key) { if (!strcmp(key, "headers")) { zval **headers; if (SUCCESS == zend_hash_find(Z_ARRVAL_P(old_opts), "headers", sizeof("headers"), (void **) &headers)) { @@ -542,8 +544,12 @@ PHP_METHOD(HTTPi_Request, setOptions) } zval_add_ref(opt); add_assoc_zval(old_opts, key, *opt); + + /* reset */ + key = NULL; } } + RETURN_TRUE; } /* }}} */ @@ -675,6 +681,7 @@ PHP_METHOD(HTTPi_Request, getContentType) PHP_METHOD(HTTPi_Request, setQueryData) { zval *qdata; + char *query_data = NULL; getObject(httpi_request_object, obj); if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &qdata)) { @@ -682,20 +689,11 @@ PHP_METHOD(HTTPi_Request, setQueryData) } if ((Z_TYPE_P(qdata) == IS_ARRAY) || (Z_TYPE_P(qdata) == IS_OBJECT)) { - smart_str qstr = {0}; - HTTP_URL_ARGSEP_OVERRIDE; - if (SUCCESS != php_url_encode_hash_ex(HASH_OF(qdata), &qstr, NULL, 0, NULL, 0, NULL, 0, NULL TSRMLS_CC)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't encode query data"); - if (qstr.c) { - efree(qstr.c); - } - HTTP_URL_ARGSEP_RESTORE; + if (SUCCESS != http_urlencode_hash(HASH_OF(qdata), &query_data)) { RETURN_FALSE; } - HTTP_URL_ARGSEP_RESTORE; - smart_str_0(&qstr); - UPD_PROP(obj, string, queryData, qstr.c); - efree(qstr.c); + UPD_PROP(obj, string, queryData, query_data); + efree(query_data); RETURN_TRUE; } @@ -726,8 +724,7 @@ PHP_METHOD(HTTPi_Request, getQueryData) PHP_METHOD(HTTPi_Request, addQueryData) { zval *qdata, *old_qdata; - smart_str qstr = {0}; - char *separator; + char *query_data = NULL; getObject(httpi_request_object, obj); if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &qdata)) { @@ -735,25 +732,14 @@ PHP_METHOD(HTTPi_Request, addQueryData) } old_qdata = GET_PROP(obj, queryData); - if (Z_STRLEN_P(old_qdata)) { - smart_str_appendl(&qstr, Z_STRVAL_P(old_qdata), Z_STRLEN_P(old_qdata)); - } - HTTP_URL_ARGSEP_OVERRIDE; - if (SUCCESS != php_url_encode_hash_ex(HASH_OF(qdata), &qstr, NULL, 0, NULL, 0, NULL, 0, NULL TSRMLS_CC)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't encode query data"); - if (qstr.c) { - efree(qstr.c); - } - HTTP_URL_ARGSEP_RESTORE; + if (SUCCESS != http_urlencode_hash_ex(HASH_OF(qdata), 1, Z_STRVAL_P(old_qdata), Z_STRLEN_P(old_qdata), &query_data, NULL)) { RETURN_FALSE; } - HTTP_URL_ARGSEP_RESTORE; - smart_str_0(&qstr); + UPD_PROP(obj, string, queryData, query_data); + efree(query_data); - UPD_PROP(obj, string, queryData, qstr.c); - efree(qstr.c); RETURN_TRUE; } /* }}} */ @@ -1029,7 +1015,7 @@ PHP_METHOD(HTTPi_Request, send) case HTTP_POST: { - zval *post_files, *post_data, **data; + zval *post_files, *post_data; post_files = GET_PROP(obj, postFiles); post_data = GET_PROP(obj, postData); @@ -1040,21 +1026,18 @@ PHP_METHOD(HTTPi_Request, send) status = http_post_array_ex(obj->ch, request_uri, Z_ARRVAL_P(post_data), Z_ARRVAL_P(opts), Z_ARRVAL_P(info), &response_data, &response_len); } else { - + /* * multipart post */ + char *key = NULL; + long idx; + zval **data; struct curl_httppost *http_post_data[2] = {NULL, NULL}; /* normal data */ - for ( zend_hash_internal_pointer_reset(Z_ARRVAL_P(post_data)); - zend_hash_get_current_data(Z_ARRVAL_P(post_data), (void **) &data) == SUCCESS; - zend_hash_move_forward(Z_ARRVAL_P(post_data))) { - - char *key; - long idx; - - if (HASH_KEY_IS_STRING == zend_hash_get_current_key(Z_ARRVAL_P(post_data), &key, &idx, 0)) { + FOREACH_KEYVAL(post_data, key, idx, data) { + if (key) { convert_to_string_ex(data); curl_formadd(&http_post_data[0], &http_post_data[1], CURLFORM_COPYNAME, key, @@ -1062,25 +1045,22 @@ PHP_METHOD(HTTPi_Request, send) CURLFORM_CONTENTSLENGTH, Z_STRLEN_PP(data), CURLFORM_END ); + + /* reset */ + key = NULL; } } /* file data */ - for ( zend_hash_internal_pointer_reset(Z_ARRVAL_P(post_files)); - zend_hash_get_current_data(Z_ARRVAL_P(post_files), (void **) &data) == SUCCESS; - zend_hash_move_forward(Z_ARRVAL_P(post_files))) { - + FOREACH_VAL(post_files, data) { zval **file, **type, **name; - if ( - SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "name", sizeof("name"), (void **) &name) && - SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &type) && - SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "file", sizeof("file"), (void **) &file) - ) { + if ( SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "name", sizeof("name"), (void **) &name) && + SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &type) && + SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "file", sizeof("file"), (void **) &file)) { curl_formadd(&http_post_data[0], &http_post_data[1], CURLFORM_COPYNAME, Z_STRVAL_PP(name), - CURLFORM_FILENAME, Z_STRVAL_PP(name), CURLFORM_FILE, Z_STRVAL_PP(file), CURLFORM_CONTENTTYPE, Z_STRVAL_PP(type), CURLFORM_END @@ -1141,3 +1121,4 @@ PHP_METHOD(HTTPi_Request, send) * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */ +