X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=5ff5e33a7eff753d79771b9ade894f1a98c3dde0;hp=364e81fe13c948eb9b6331afd1272a2f8212cb48;hb=266dd631dcb4e0652522ad4884ee8a40b88532ec;hpb=f6a58b4f97105ba3c3177116c18672f1b8ba4179 diff --git a/http_functions.c b/http_functions.c index 364e81f..5ff5e33 100644 --- a/http_functions.c +++ b/http_functions.c @@ -1,16 +1,13 @@ /* - +----------------------------------------------------------------------+ - | PECL :: http | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.0 of the PHP license, that | - | is bundled with this package in the file LICENSE, and is available | - | through the world-wide-web at http://www.php.net/license/3_0.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Copyright (c) 2004-2005 Michael Wallner | - +----------------------------------------------------------------------+ + +--------------------------------------------------------------------+ + | PECL :: http | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met. | + +--------------------------------------------------------------------+ + | Copyright (c) 2004-2005, Michael Wallner | + +--------------------------------------------------------------------+ */ /* $Id$ */ @@ -513,7 +510,7 @@ PHP_FUNCTION(ob_etaghandler) } /* }}} */ -/* {{{ proto void http_throttle(double sec[, int bytes = 2097152]) +/* {{{ proto void http_throttle(double sec[, int bytes = 40960]) * * Sets the throttle delay and send buffer size for use with http_send() API. * Provides a basic throttling mechanism, which will yield the current process @@ -956,7 +953,7 @@ PHP_FUNCTION(http_match_request_header) * - compress: bool, whether to allow gzip/deflate content encoding * (defaults to true) * - port: int, use another port as specified in the url - * - referer: string, the referer to sends + * - referer: string, the referer to send * - useragent: string, the user agent to send * (defaults to PECL::HTTP/version (PHP/version))) * - headers: array, list of custom headers as associative array @@ -1028,6 +1025,7 @@ PHP_FUNCTION(http_get) if (SUCCESS == http_get(URL, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { RETURN_PHPSTR_VAL(&response); } else { + phpstr_dtor(&response); RETURN_FALSE; } } @@ -1061,6 +1059,7 @@ PHP_FUNCTION(http_head) if (SUCCESS == http_head(URL, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { RETURN_PHPSTR_VAL(&response); } else { + phpstr_dtor(&response); RETURN_FALSE; } } @@ -1100,6 +1099,7 @@ PHP_FUNCTION(http_post_data) if (SUCCESS == http_post(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { RETVAL_PHPSTR_VAL(&response); } else { + phpstr_dtor(&response); RETVAL_FALSE; } } @@ -1139,6 +1139,7 @@ PHP_FUNCTION(http_post_fields) if (SUCCESS == http_post(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { RETVAL_PHPSTR_VAL(&response); } else { + phpstr_dtor(&response); RETVAL_FALSE; } http_request_body_dtor(&body); @@ -1189,6 +1190,7 @@ PHP_FUNCTION(http_put_file) if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { RETVAL_PHPSTR_VAL(&response); } else { + phpstr_dtor(&response); RETVAL_FALSE; } http_request_body_dtor(&body); @@ -1237,6 +1239,7 @@ PHP_FUNCTION(http_put_stream) if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { RETURN_PHPSTR_VAL(&response); } else { + phpstr_dtor(&response); RETURN_NULL(); } } @@ -1256,7 +1259,7 @@ PHP_FUNCTION(http_request_method_register) { char *method; int method_len; - unsigned long existing; + ulong existing; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &method, &method_len)) { RETURN_FALSE; @@ -1293,7 +1296,7 @@ PHP_FUNCTION(http_request_method_unregister) if (is_numeric_string(Z_STRVAL_P(method), Z_STRLEN_P(method), NULL, NULL, 1)) { convert_to_long(method); } else { - unsigned long mn; + ulong mn; if (!(mn = http_request_method_exists(1, 0, Z_STRVAL_P(method)))) { RETURN_FALSE; } @@ -1361,7 +1364,7 @@ PHP_FUNCTION(http_request_method_name) RETURN_FALSE; } - RETURN_STRING(estrdup(http_request_method_name((unsigned long) method)), 0); + RETURN_STRING(estrdup(http_request_method_name((ulong) method)), 0); } } /* }}} */ @@ -1408,6 +1411,226 @@ PHP_FUNCTION(http_build_query) #endif /* !ZEND_ENGINE_2 */ /* }}} */ +/* {{{ */ +#ifdef HTTP_HAVE_ZLIB + +/* {{{ proto string http_gzencode(string data[, int level = -1]) + * + * Compress data with the HTTP compatible GZIP encoding. + * + * Expects the first parameter to be a string which contains the data that + * should be encoded. Additionally accepts an optional in paramter specifying + * the compression level, where -1 is default, 0 is no compression and 9 is + * best compression ratio. + * + * Returns the encoded string on success, or NULL on failure. + */ +PHP_FUNCTION(http_gzencode) +{ + char *data; + int data_len; + long level = -1; + + RETVAL_NULL(); + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &level)) { + HTTP_CHECK_GZIP_LEVEL(level, return); + { + char *encoded; + size_t encoded_len; + + if (SUCCESS == http_encoding_gzencode(level, data, data_len, &encoded, &encoded_len)) { + RETURN_STRINGL(encoded, (int) encoded_len, 0); + } + } + } +} +/* }}} */ + +/* {{{ proto string http_gzdecode(string data) + * + * Uncompress data compressed with the HTTP compatible GZIP encoding. + * + * Expects a string as parameter containing the compressed data. + * + * Returns the decoded string on success, or NULL on failure. + */ +PHP_FUNCTION(http_gzdecode) +{ + char *data; + int data_len; + + RETVAL_NULL(); + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len)) { + char *decoded; + size_t decoded_len; + + if (SUCCESS == http_encoding_gzdecode(data, data_len, &decoded, &decoded_len)) { + RETURN_STRINGL(decoded, (int) decoded_len, 0); + } + } +} +/* }}} */ + +/* {{{ proto string http_deflate(string data[, int level = -1]) + * + * Compress data with the HTTP compatible DEFLATE encoding. + * + * Expects the first parameter to be a string containing the data that should + * be encoded. Additionally accepts an optional int parameter specifying the + * compression level, where -1 is default, 0 is no compression and 9 is best + * compression ratio. + * + * Returns the encoded string on success, or NULL on failure. + */ +PHP_FUNCTION(http_deflate) +{ + char *data; + int data_len; + long level = -1; + + RETVAL_NULL(); + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &level)) { + HTTP_CHECK_GZIP_LEVEL(level, return); + { + char *encoded; + size_t encoded_len; + + if (SUCCESS == http_encoding_deflate(level, data, data_len, &encoded, &encoded_len)) { + RETURN_STRINGL(encoded, (int) encoded_len, 0); + } + } + } +} +/* }}} */ + +/* {{{ proto string http_inflate(string data) + * + * Uncompress data compressed with the HTTP compatible DEFLATE encoding. + * + * Expects a string as parameter containing the compressed data. + * + * Returns the decoded string on success, or NULL on failure. + */ +PHP_FUNCTION(http_inflate) +{ + char *data; + int data_len; + + RETVAL_NULL(); + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len)) { + char *decoded; + size_t decoded_len; + + if (SUCCESS == http_encoding_inflate(data, data_len, &decoded, &decoded_len)) { + RETURN_STRINGL(decoded, (int) decoded_len, 0); + } + } +} +/* }}} */ + +/* {{{ proto string http_compress(string data[, int level = -1]) + * + * Compress data with the HTTP compatible COMPRESS encoding. + * + * Expects the first parameter to be a string containing the data which should + * be encoded. Additionally accepts an optional int parameter specifying the + * compression level, where -1 is default, 0 is no compression and 9 is best + * compression ratio. + * + * Returns the encoded string on success, or NULL on failure. + */ +PHP_FUNCTION(http_compress) +{ + char *data; + int data_len; + long level = -1; + + RETVAL_NULL(); + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &level)) { + HTTP_CHECK_GZIP_LEVEL(level, return); + { + char *encoded; + size_t encoded_len; + + if (SUCCESS == http_encoding_compress(level, data, data_len, &encoded, &encoded_len)) { + RETURN_STRINGL(encoded, (int) encoded_len, 0); + } + } + } +} +/* }}} */ + +/* {{{ proto string http_uncompress(string data) + * + * Uncompress data compressed with the HTTP compatible COMPRESS encoding. + * + * Expects a string as parameter containing the compressed data. + * + * Returns the decoded string on success, or NULL on failure. + */ +PHP_FUNCTION(http_uncompress) +{ + char *data; + int data_len; + + RETVAL_NULL(); + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len)) { + char *decoded; + size_t decoded_len; + + if (SUCCESS == http_encoding_uncompress(data, data_len, &decoded, &decoded_len)) { + RETURN_STRINGL(decoded, (int) decoded_len, 0); + } + } +} +/* }}} */ +#endif /* HTTP_HAVE_ZLIB */ +/* }}} */ + +/* {{{ proto int http_support([int feature = 0]) + * + * Check for feature that require external libraries. + * + * Accpepts an optional in parameter specifying which feature to probe for. + * If the parameter is 0 or omitted, the return value contains a bitmask of + * all supported features that depend on external libraries. + * + * Available features to probe for are: + * + * + * Returns int, whether requested feature is supported, or a bitmask with + * all supported features. + */ +PHP_FUNCTION(http_support) +{ + long feature = 0; + + RETVAL_LONG(0L); + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &feature)) { + RETVAL_LONG(http_support(feature)); + } +} +/* }}} */ + PHP_FUNCTION(http_test) { }