X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_filter.c;h=52d2b03f584774f931369028cba53d00de8c3987;hp=654edffa113cd1bb1868006053bbaa64375b4043;hb=82923890d9ce44a0642ac2f5ea0cb343aaf50fe3;hpb=899f3ef36d0f68d47a88b91ad53392b1e0f968f3 diff --git a/src/php_http_filter.c b/src/php_http_filter.c index 654edff..52d2b03 100644 --- a/src/php_http_filter.c +++ b/src/php_http_filter.c @@ -72,10 +72,10 @@ PHP_MINIT_FUNCTION(http_filter) typedef struct _http_chunked_decode_filter_buffer_t { php_http_buffer_t buffer; - ulong hexlen; + unsigned long hexlen; } PHP_HTTP_FILTER_BUFFER(chunked_decode); -typedef php_http_encoding_stream_t PHP_HTTP_FILTER_BUFFER(zlib); +typedef php_http_encoding_stream_t PHP_HTTP_FILTER_BUFFER(stream); static PHP_HTTP_FILTER_FUNCTION(chunked_decode) { @@ -266,22 +266,10 @@ static PHP_HTTP_FILTER_FUNCTION(chunked_encode) return PSFS_PASS_ON; } -static PHP_HTTP_FILTER_OPS(chunked_decode) = { - PHP_HTTP_FILTER_FUNC(chunked_decode), - PHP_HTTP_FILTER_DTOR(chunked_decode), - "http.chunked_decode" -}; - -static PHP_HTTP_FILTER_OPS(chunked_encode) = { - PHP_HTTP_FILTER_FUNC(chunked_encode), - NULL, - "http.chunked_encode" -}; - -static PHP_HTTP_FILTER_FUNCTION(zlib) +static PHP_HTTP_FILTER_FUNCTION(stream) { php_stream_bucket *ptr, *nxt; - PHP_HTTP_FILTER_BUFFER(zlib) *buffer = Z_PTR(this->abstract); + PHP_HTTP_FILTER_BUFFER(stream) *buffer = Z_PTR(this->abstract); if (bytes_consumed) { *bytes_consumed = 0; @@ -307,7 +295,7 @@ static PHP_HTTP_FILTER_FUNCTION(zlib) } #if DBG_FILTER - fprintf(stderr, "update: deflate (-> %zu) (w: %zu, r: %zu)\n", encoded_len, stream->writepos, stream->readpos); + fprintf(stderr, "update: compress (-> %zu) (w: %zu, r: %zu)\n", encoded_len, stream->writepos, stream->readpos); #endif if (encoded) { @@ -329,7 +317,7 @@ static PHP_HTTP_FILTER_FUNCTION(zlib) } #if DBG_FILTER - fprintf(stderr, "flush: deflate (-> %zu)\n", encoded_len); + fprintf(stderr, "flush: compress (-> %zu)\n", encoded_len); #endif if (encoded) { @@ -349,7 +337,7 @@ static PHP_HTTP_FILTER_FUNCTION(zlib) } #if DBG_FILTER - fprintf(stderr, "finish: deflate (-> %zu)\n", encoded_len); + fprintf(stderr, "finish: compress (-> %zu)\n", encoded_len); #endif if (encoded) { @@ -362,24 +350,51 @@ static PHP_HTTP_FILTER_FUNCTION(zlib) return PSFS_PASS_ON; } -static PHP_HTTP_FILTER_DESTRUCTOR(zlib) + +static PHP_HTTP_FILTER_DESTRUCTOR(stream) { - PHP_HTTP_FILTER_BUFFER(zlib) *buffer = Z_PTR(this->abstract); + PHP_HTTP_FILTER_BUFFER(stream) *buffer = Z_PTR(this->abstract); php_http_encoding_stream_free(&buffer); } +static PHP_HTTP_FILTER_OPS(chunked_decode) = { + PHP_HTTP_FILTER_FUNC(chunked_decode), + PHP_HTTP_FILTER_DTOR(chunked_decode), + "http.chunked_decode" +}; + +static PHP_HTTP_FILTER_OPS(chunked_encode) = { + PHP_HTTP_FILTER_FUNC(chunked_encode), + NULL, + "http.chunked_encode" +}; + static PHP_HTTP_FILTER_OPS(deflate) = { - PHP_HTTP_FILTER_FUNC(zlib), - PHP_HTTP_FILTER_DTOR(zlib), + PHP_HTTP_FILTER_FUNC(stream), + PHP_HTTP_FILTER_DTOR(stream), "http.deflate" }; static PHP_HTTP_FILTER_OPS(inflate) = { - PHP_HTTP_FILTER_FUNC(zlib), - PHP_HTTP_FILTER_DTOR(zlib), + PHP_HTTP_FILTER_FUNC(stream), + PHP_HTTP_FILTER_DTOR(stream), "http.inflate" }; +#if PHP_HTTP_HAVE_LIBBROTLI +static PHP_HTTP_FILTER_OPS(brotli_encode) = { + PHP_HTTP_FILTER_FUNC(stream), + PHP_HTTP_FILTER_DTOR(stream), + "http.brotli_encode" +}; + +static PHP_HTTP_FILTER_OPS(brotli_decode) = { + PHP_HTTP_FILTER_FUNC(stream), + PHP_HTTP_FILTER_DTOR(stream), + "http.brotli_decode" +}; +#endif + #if PHP_VERSION_ID >= 70200 static php_stream_filter *http_filter_create(const char *name, zval *params, uint8_t p) #else @@ -420,7 +435,7 @@ static php_stream_filter *http_filter_create(const char *name, zval *params, int } else if (!strcasecmp(name, "http.inflate")) { - PHP_HTTP_FILTER_BUFFER(zlib) *b = NULL; + PHP_HTTP_FILTER_BUFFER(stream) *b = NULL; if ((b = php_http_encoding_stream_init(NULL, php_http_encoding_stream_get_inflate_ops(), flags))) { if (!(f = php_stream_filter_alloc(&PHP_HTTP_FILTER_OP(inflate), b, p))) { @@ -430,13 +445,35 @@ static php_stream_filter *http_filter_create(const char *name, zval *params, int } else if (!strcasecmp(name, "http.deflate")) { - PHP_HTTP_FILTER_BUFFER(zlib) *b = NULL; + PHP_HTTP_FILTER_BUFFER(stream) *b = NULL; if ((b = php_http_encoding_stream_init(NULL, php_http_encoding_stream_get_deflate_ops(), flags))) { if (!(f = php_stream_filter_alloc(&PHP_HTTP_FILTER_OP(deflate), b, p))) { php_http_encoding_stream_free(&b); } } +#if PHP_HTTP_HAVE_LIBBROTLI + } else + + if (!strcasecmp(name, "http.brotli_encode")) { + PHP_HTTP_FILTER_BUFFER(stream) *b = NULL; + + if ((b = php_http_encoding_stream_init(NULL, php_http_encoding_stream_get_enbrotli_ops(), flags))) { + if (!(f = php_stream_filter_alloc(&PHP_HTTP_FILTER_OP(brotli_encode), b, p))) { + php_http_encoding_stream_free(&b); + } + } + } else + + if (!strcasecmp(name, "http.brotli_decode")) { + PHP_HTTP_FILTER_BUFFER(stream) *b = NULL; + + if ((b = php_http_encoding_stream_init(NULL, php_http_encoding_stream_get_debrotli_ops(), flags))) { + if (!(f = php_stream_filter_alloc(&PHP_HTTP_FILTER_OP(brotli_decode), b, p))) { + php_http_encoding_stream_free(&b); + } + } +#endif } return f;