X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_encoding_api.c;h=1d9b9163a31af614fda99c992818fe4ef40ed7a3;hp=2d20908951ce01c37e1b13d9e3b6ba2a4d4a1aeb;hb=refs%2Fheads%2Fv1.7.x;hpb=a694ce0dda4bc1ab0d1f1f3e365529b087c2a18f diff --git a/http_encoding_api.c b/http_encoding_api.c index 2d20908..1d9b916 100644 --- a/http_encoding_api.c +++ b/http_encoding_api.c @@ -6,7 +6,7 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2006, Michael Wallner | + | Copyright (c) 2004-2010, Michael Wallner | +--------------------------------------------------------------------+ */ @@ -46,10 +46,18 @@ PHP_MINIT_FUNCTION(http_encoding) PHP_RINIT_FUNCTION(http_encoding) { if (HTTP_G->send.inflate.start_auto) { +#ifdef PHP_OUTPUT_NEWAPI + php_output_start_internal(ZEND_STRL("http inflate"), _http_ob_inflatehandler, HTTP_INFLATE_BUFFER_SIZE, 0 TSRMLS_CC); +#else php_ob_set_internal_handler(_http_ob_inflatehandler, HTTP_INFLATE_BUFFER_SIZE, "http inflate", 0 TSRMLS_CC); +#endif } if (HTTP_G->send.deflate.start_auto) { +#ifdef PHP_OUTPUT_NEWAPI + php_output_start_internal(ZEND_STRL("http deflate"), _http_ob_deflatehandler, HTTP_DEFLATE_BUFFER_SIZE, 0 TSRMLS_CC); +#else php_ob_set_internal_handler(_http_ob_deflatehandler, HTTP_DEFLATE_BUFFER_SIZE, "http deflate", 0 TSRMLS_CC); +#endif } return SUCCESS; } @@ -161,10 +169,18 @@ PHP_HTTP_API const char *_http_encoding_dechunk(const char *encoded, size_t enco PHP_HTTP_API int _http_encoding_response_start(size_t content_length, zend_bool ignore_http_ohandler TSRMLS_DC) { int response = HTTP_G->send.deflate.response; +#ifdef PHP_OUTPUT_NEWAPI + int ohandler = php_output_handler_started(ZEND_STRL("ob_gzhandler") TSRMLS_CC) || php_output_handler_started(ZEND_STRL("zlib output compression") TSRMLS_CC); +#else int ohandler = php_ob_handler_used("ob_gzhandler" TSRMLS_CC) || php_ob_handler_used("zlib output compression" TSRMLS_CC); +#endif if (!ohandler && !ignore_http_ohandler) { +#ifdef PHP_OUTPUT_NEWAPI + ohandler = php_output_handler_started(ZEND_STRL("ob_defaltehandler") TSRMLS_CC) || php_output_handler_started(ZEND_STRL("http deflate") TSRMLS_CC); +#else ohandler = php_ob_handler_used("ob_deflatehandler" TSRMLS_CC) || php_ob_handler_used("http deflate" TSRMLS_CC); +#endif } if (response && !ohandler) { @@ -211,10 +227,13 @@ PHP_HTTP_API int _http_encoding_response_start(size_t content_length, zend_bool #endif /* HTTP_HAVE_ZLIB */ } else if (content_length && !ohandler) { /* emit a content-length header */ - char cl_header_str[128]; - size_t cl_header_len; - cl_header_len = snprintf(cl_header_str, lenof(cl_header_str), "Content-Length: %zu", content_length); - http_send_header_string_ex(cl_header_str, cl_header_len, 1); + phpstr header; + + phpstr_init(&header); + phpstr_appendf(&header, "Content-Length: %zu", content_length); + phpstr_fix(&header); + http_send_header_string_ex(PHPSTR_VAL(&header), PHPSTR_LEN(&header), 1); + phpstr_dtor(&header); } else { HTTP_G->send.deflate.encoding = 0; } @@ -327,10 +346,13 @@ retry_raw_inflate: Z.avail_in = data_len; switch (status = http_inflate_rounds(&Z, Z_NO_FLUSH, decoded, decoded_len)) { - case Z_OK: case Z_STREAM_END: inflateEnd(&Z); return SUCCESS; + + case Z_OK: + status = Z_DATA_ERROR; + break; case Z_DATA_ERROR: /* raw deflated data? */ @@ -694,7 +716,10 @@ void _http_ob_deflatehandler(char *output, uint output_len, char **handled_outpu if (HTTP_G->send.deflate.stream) { if (output_len) { - http_encoding_deflate_stream_update((http_encoding_stream *) HTTP_G->send.deflate.stream, output, output_len, handled_output, handled_output_len); + size_t tmp_len; + + http_encoding_deflate_stream_update((http_encoding_stream *) HTTP_G->send.deflate.stream, output, output_len, handled_output, &tmp_len); + *handled_output_len = tmp_len; } if (mode & PHP_OUTPUT_HANDLER_END) { @@ -733,7 +758,10 @@ void _http_ob_inflatehandler(char *output, uint output_len, char **handled_outpu if (HTTP_G->send.inflate.stream) { if (output_len) { - http_encoding_inflate_stream_update((http_encoding_stream *) HTTP_G->send.inflate.stream, output, output_len, handled_output, handled_output_len); + size_t tmp_len; + + http_encoding_inflate_stream_update((http_encoding_stream *) HTTP_G->send.inflate.stream, output, output_len, handled_output, &tmp_len); + *handled_output_len = tmp_len; } if (mode & PHP_OUTPUT_HANDLER_END) {