X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=fa9cf9ca6a947e4b33df73adbf0d9349dda576ae;hp=afe6f85f6a6ec5f78225f9918feacea486d0d092;hb=a960f6fd6e637ffa03a87985a7df3bc9c98a360b;hpb=bb6571e22d14c87114eb729145be2e7b87ebea42 diff --git a/http_functions.c b/http_functions.c index afe6f85..fa9cf9c 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. @@ -623,6 +652,7 @@ PHP_FUNCTION(http_parse_headers) /* {{{ proto array http_get_request_headers(void) * + * Get a list of incoming HTTP headers. */ PHP_FUNCTION(http_get_request_headers) { @@ -633,6 +663,24 @@ PHP_FUNCTION(http_get_request_headers) } /* }}} */ +/* {{{ proto bool http_match_request_header(string header, string value[, bool match_case = false]) + * + * Match an incoming HTTP header. + */ +PHP_FUNCTION(http_match_request_header) +{ + char *header, *value; + int header_len, value_len; + zend_bool match_case = 0, result = 0; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", &header, &header_len, &value, &value_len, &match_case)) { + RETURN_FALSE; + } + + RETURN_BOOL(http_match_request_header_ex(header, value, match_case)); +} +/* }}} */ + /* {{{ HAVE_CURL */ #ifdef HTTP_HAVE_CURL @@ -796,7 +844,6 @@ PHP_FUNCTION(http_post_data) } else { RETVAL_FALSE; } - http_request_body_dtor(&body); } /* }}} */ @@ -839,6 +886,9 @@ PHP_FUNCTION(http_post_fields) /* {{{ proto string http_put_file(string url, string file[, array options[, array &info]]) * + * Performs an HTTP PUT request, uploading file. + * Returns the HTTP response as string. + * See http_get() for a full list of available options. */ PHP_FUNCTION(http_put_file) { @@ -883,6 +933,9 @@ PHP_FUNCTION(http_put_file) /* {{{ proto string http_put_stream(string url, resource stream[, array options[, array &info]]) * + * Performs an HTTP PUT request, uploading stream. + * Returns the HTTP response as string. + * See http_get() for a full list of available options. */ PHP_FUNCTION(http_put_stream) { @@ -893,25 +946,25 @@ PHP_FUNCTION(http_put_stream) 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); @@ -921,6 +974,112 @@ PHP_FUNCTION(http_put_stream) } /* }}} */ +/* {{{ proto long http_request_method_register(string method) + * + * Register a custom request 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) + * + * Unregister a previously registered custom request method. + */ +PHP_FUNCTION(http_request_method_unregister) +{ + 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: +#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) + * + * Check if a request method is registered (or available by default). + */ +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) + * + * Get the literal string representation of a standard or registered request 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 */