X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=afe6f85f6a6ec5f78225f9918feacea486d0d092;hp=9bf3399d72570ba6b6eb3a4abf1caf0eeb0ff9fd;hb=bb6571e22d14c87114eb729145be2e7b87ebea42;hpb=c2b4f0332ead5425b183d2487ab5f25663f1009f diff --git a/http_functions.c b/http_functions.c index 9bf3399..afe6f85 100644 --- a/http_functions.c +++ b/http_functions.c @@ -33,9 +33,9 @@ #include "php_http_std_defs.h" #include "php_http_api.h" #include "php_http_auth_api.h" -#include "php_http_curl_api.h" +#include "php_http_request_api.h" #include "php_http_cache_api.h" -#include "php_http_curl_api.h" +#include "php_http_request_api.h" #include "php_http_date_api.h" #include "php_http_headers_api.h" #include "php_http_message_api.h" @@ -670,6 +670,8 @@ PHP_FUNCTION(http_get_request_headers) * - lastmodified: int, timestamp for If-(Un)Modified-Since header * - timeout: int, seconds the request may take * - connecttimeout: int, seconds the connect may take + * - onprogress: mixed, progress callback + * - ondebug: mixed, debug callback * * * The optional third parameter will be filled with some additional information @@ -773,6 +775,7 @@ PHP_FUNCTION(http_post_data) char *URL, *postdata; int postdata_len, URL_len; phpstr response; + http_request_body body; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|a/!z", &URL, &URL_len, &postdata, &postdata_len, &options, &info) != SUCCESS) { RETURN_FALSE; @@ -783,29 +786,39 @@ PHP_FUNCTION(http_post_data) array_init(info); } + body.type = HTTP_REQUEST_BODY_CSTRING; + body.data = postdata; + body.size = postdata_len; + phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); - if (SUCCESS == http_post_data(URL, postdata, (size_t) postdata_len, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETURN_PHPSTR_VAL(response); + if (SUCCESS == http_post(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { + RETVAL_PHPSTR_VAL(response); } else { - RETURN_FALSE; + RETVAL_FALSE; } + http_request_body_dtor(&body); } /* }}} */ -/* {{{ proto string http_post_array(string url, array data[, array options[, array &info]]) +/* {{{ proto string http_post_fields(string url, array data[, array files[, array options[, array &info]]]) * * Performs an HTTP POST request, posting www-form-urlencoded array data. * Returns the HTTP response as string. * See http_get() for a full list of available options. */ -PHP_FUNCTION(http_post_array) +PHP_FUNCTION(http_post_fields) { - zval *options = NULL, *info = NULL, *postdata; + zval *options = NULL, *info = NULL, *fields, *files = NULL; char *URL; int URL_len; phpstr response; + http_request_body body; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|a/!z", &URL, &URL_len, &postdata, &options, &info) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|aa/!z", &URL, &URL_len, &fields, &files, &options, &info) != SUCCESS) { + RETURN_FALSE; + } + + if (SUCCESS != http_request_body_fill(&body, Z_ARRVAL_P(fields), files ? Z_ARRVAL_P(files) : NULL)) { RETURN_FALSE; } @@ -815,11 +828,96 @@ PHP_FUNCTION(http_post_array) } phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); - if (SUCCESS == http_post_array(URL, Z_ARRVAL_P(postdata), options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETURN_PHPSTR_VAL(response); + if (SUCCESS == http_post(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { + RETVAL_PHPSTR_VAL(response); } else { + RETVAL_FALSE; + } + http_request_body_dtor(&body); +} +/* }}} */ + +/* {{{ proto string http_put_file(string url, string file[, array options[, array &info]]) + * + */ +PHP_FUNCTION(http_put_file) +{ + char *URL, *file; + int URL_len, f_len; + zval *options = NULL, *info = NULL; + phpstr response; + php_stream *stream; + php_stream_statbuf ssb; + http_request_body body; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|a/!z", &URL, &URL_len, &file, &f_len, &options, &info)) { + RETURN_FALSE; + } + + if (!(stream = php_stream_open_wrapper(file, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL))) { + RETURN_FALSE; + } + if (php_stream_stat(stream, &ssb)) { + php_stream_close(stream); RETURN_FALSE; } + + if (info) { + zval_dtor(info); + array_init(info); + } + + body.type = HTTP_REQUEST_BODY_UPLOADFILE; + body.data = stream; + body.size = ssb.sb.st_size; + + phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); + if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { + RETVAL_PHPSTR_VAL(response); + } else { + RETVAL_FALSE; + } + http_request_body_dtor(&body); +} +/* }}} */ + +/* {{{ proto string http_put_stream(string url, resource stream[, array options[, array &info]]) + * + */ +PHP_FUNCTION(http_put_stream) +{ + zval *resource, *options = NULL, *info = NULL; + char *URL; + int URL_len; + phpstr response; + php_stream *stream; + php_stream_statbuf ssb; + http_request_body body; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sr|a/!z", &URL, &URL_len, &resource, &options, &info)) { + RETURN_FALSE; + } + + php_stream_from_zval(stream, &resource); + if (php_stream_stat(stream, &ssb)) { + RETURN_FALSE; + } + + if (info) { + zval_dtor(info); + array_init(info); + } + + body.type = HTTP_REQUEST_BODY_UPLOADFILE; + body.data = stream; + body.size = ssb.sb.st_size; + + phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); + if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { + RETURN_PHPSTR_VAL(response); + } else { + RETURN_NULL(); + } } /* }}} */ @@ -991,4 +1089,3 @@ PHP_FUNCTION(http_test) * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */ -