X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=cbb487f132798457507f130277d8882b743d01dc;hp=b0916b9af403373bda564d06fd5b410bc30659db;hb=8b5eb376ae8f5e53cfb66752327043be2669498a;hpb=693aff1dce7d26388ff36794fe4b90a26b7f2ccd diff --git a/http_functions.c b/http_functions.c index b0916b9..cbb487f 100644 --- a/http_functions.c +++ b/http_functions.c @@ -42,6 +42,7 @@ #include "php_http_message_api.h" #include "php_http_send_api.h" #include "php_http_url_api.h" +#include "php_http_encoding_api.h" #include "phpstr/phpstr.h" @@ -87,11 +88,11 @@ PHP_FUNCTION(http_date) * Returns the absolute URI as string. * * Examples: - * + *
  * 
- * 
+ * 
*/ PHP_FUNCTION(http_build_uri) { @@ -754,7 +755,7 @@ PHP_FUNCTION(http_chunked_decode) RETURN_FALSE; } - if (NULL != http_chunked_decode(encoded, encoded_len, &decoded, &decoded_len)) { + if (NULL != http_encoding_dechunk(encoded, encoded_len, &decoded, &decoded_len)) { RETURN_STRINGL(decoded, (int) decoded_len, 0); } else { RETURN_FALSE; @@ -1254,7 +1255,7 @@ PHP_FUNCTION(http_put_stream) PHP_FUNCTION(http_request_method_register) { char *method; - int *method_len; + int method_len; unsigned long existing; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &method, &method_len)) { @@ -1264,7 +1265,7 @@ PHP_FUNCTION(http_request_method_register) RETURN_LONG((long) existing); } - RETVAL_LONG((long) http_request_method_register(method)); + RETVAL_LONG((long) http_request_method_register(method, method_len)); } /* }}} */ @@ -1307,7 +1308,7 @@ PHP_FUNCTION(http_request_method_unregister) } /* }}} */ -/* {{{ proto long http_request_method_exists(mixed method) +/* {{{ proto int http_request_method_exists(mixed method) * * Check if a request method is registered (or available by default). * @@ -1407,6 +1408,224 @@ 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 featuers that depend on external libraries. + * + * Available features to probe for are: + * - HTTP_SUPPORT: always set + * - HTTP_SUPPORT_REQUESTS: whether ext/http was linked against libcurl, + * and HTTP requests can be issued + * - HTTP_SUPPORT_SSLREQUESTS: whether libcurl was linked against openssl, + * and SSL requests can be issued + * - HTTP_SUPPORT_ENCODINGS: whether ext/http was linked against zlib, + * and compressed HTTP responses can be decoded + * - HTTP_SUPPORT_MHASHETAGS: whether ext/http was linked against libmhash, + * and ETags can be generated with the available mhash algorithms + * - HTTP_SUPPORT_MAGICMIME: whether ext/http was linked against libmagic, + * and the HttpResponse::guessContentType() method is usable + * + * 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) { }