X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=4b611e037d964ee7122aaa970de514073b5418c9;hp=5dc49b5c4dc64e64bdeaa8fe787af1322108f907;hb=02d7d3888013b1def5167154974342bc7facaae5;hpb=16ea91ddd08d15dd9b7206229fec6158f212adaf diff --git a/http_functions.c b/http_functions.c index 5dc49b5..4b611e0 100644 --- a/http_functions.c +++ b/http_functions.c @@ -411,6 +411,35 @@ PHP_FUNCTION(ob_etaghandler) } /* }}} */ +/* {{{ proto void http_throttle(double sec[, long bytes = 2097152]) + * + * Use with http_send() API. + * + * Example: + * + * + * + */ +PHP_FUNCTION(http_throttle) +{ + long chunk_size; + double interval; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dl", &interval, &chunk_size)) { + return; + } + + HTTP_G(send).throttle_delay = interval; + HTTP_G(send).buffer_size = chunk_size; +} +/* }}} */ + /* {{{ proto void http_redirect([string url[, array params[, bool session,[ bool permanent]]]]) * * Redirect to a given url. @@ -837,6 +866,198 @@ PHP_FUNCTION(http_post_fields) } /* }}} */ +/* {{{ 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(); + } +} +/* }}} */ + +/* {{{ proto bool http_request() + */ +/* }}} */ + +/* {{{ proto long http_request_method_register(string method) + * + */ +PHP_FUNCTION(http_request_method_register) +{ + char *method; + int *method_len; + unsigned long existing; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &method, &method_len)) { + RETURN_FALSE; + } + if (existing = http_request_method_exists(1, 0, method)) { + RETURN_LONG((long) existing); + } + + RETVAL_LONG((long) http_request_method_register(method)); +} +/* }}} */ + +/* {{{ proto bool http_request_method_unregister(mixed method) + * + */ +PHP_FUNCTION(http_request_method_unregister) +{ + zval *method; + zend_bool numeric; + unsigned long existing; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &method)) { + RETURN_FALSE; + } + + switch (Z_TYPE_P(method)) + { + case IS_OBJECT: + convert_to_string(method); + case IS_STRING: +#include "zend_operators.h" + if (is_numeric_string(Z_STRVAL_P(method), Z_STRLEN_P(method), NULL, NULL, 1)) { + convert_to_long(method); + } else { + unsigned long mn; + if (!(mn = http_request_method_exists(1, 0, Z_STRVAL_P(method)))) { + RETURN_FALSE; + } + zval_dtor(method); + ZVAL_LONG(method, (long)mn); + } + case IS_LONG: + RETURN_SUCCESS(http_request_method_unregister(Z_LVAL_P(method))); + default: + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto long http_request_method_exists(mixed method) + * + */ +PHP_FUNCTION(http_request_method_exists) +{ + IF_RETVAL_USED { + zval *method; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &method)) { + RETURN_FALSE; + } + + switch (Z_TYPE_P(method)) + { + case IS_OBJECT: + convert_to_string(method); + case IS_STRING: + if (is_numeric_string(Z_STRVAL_P(method), Z_STRLEN_P(method), NULL, NULL, 1)) { + convert_to_long(method); + } else { + RETURN_LONG((long) http_request_method_exists(1, 0, Z_STRVAL_P(method))); + } + case IS_LONG: + RETURN_LONG((long) http_request_method_exists(0, Z_LVAL_P(method), NULL)); + default: + RETURN_FALSE; + } + } +} +/* }}} */ + +/* {{{ proto string http_request_method_name(long method) + * + */ +PHP_FUNCTION(http_request_method_name) +{ + IF_RETVAL_USED { + long method; + + if ((SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &method)) || (method < 0)) { + RETURN_FALSE; + } + + RETURN_STRING(estrdup(http_request_method_name((unsigned long) method)), 0); + } +} +/* }}} */ #endif /* }}} HAVE_CURL */