diff options
Diffstat (limited to 'src/http_content_decompress.cpp')
| -rw-r--r-- | src/http_content_decompress.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/http_content_decompress.cpp b/src/http_content_decompress.cpp index 0ecd9ca..ff386c2 100644 --- a/src/http_content_decompress.cpp +++ b/src/http_content_decompress.cpp @@ -13,7 +13,7 @@ #include <brotli/decode.h> #include "http_decoder_inc.h" -#define BUFFER_SIZE (16 * 1024) +#define HTTP_DECOMPRESS_BUFFER_SIZE (4096) struct http_content_decompress { enum http_content_encoding encoding; @@ -64,10 +64,6 @@ http_content_decompress_create(enum http_content_encoding encoding) decompress->z_stream_ptr = NULL; decompress->br_state = NULL; - decompress->buffer = CALLOC(char, BUFFER_SIZE); - assert(decompress->buffer); - decompress->buffer_size = BUFFER_SIZE; - if (encoding == HTTP_CONTENT_ENCODING_GZIP || encoding == HTTP_CONTENT_ENCODING_DEFLATE) { decompress->z_stream_ptr = CALLOC(z_stream, 1); @@ -147,6 +143,7 @@ http_content_decompress_write_zlib(struct http_content_decompress *decompress, size_t have = decompress->buffer_size - z_stream_ptr->avail_out; if (have > 0) { if (0 == z_stream_ptr->avail_out) { + fprintf(stderr, "realloc outbuffer,before: %zu bytes, after :%zu B\n", decompress->buffer_size , decompress->buffer_size + have); ; decompress->buffer_size += have; decompress->buffer = REALLOC(char, decompress->buffer, decompress->buffer_size); @@ -167,6 +164,8 @@ http_content_decompress_write_zlib(struct http_content_decompress *decompress, break; } } while (z_stream_ptr->avail_in != 0); + decompress->buffer = NULL; + decompress->buffer_size = 0; return 0; } @@ -205,15 +204,16 @@ http_content_decompress_write_br(struct http_content_decompress *decompress, if (ret == BROTLI_DECODER_RESULT_SUCCESS || ret == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT) { + decompress->buffer =NULL; + decompress->buffer_size = 0; return 0; } if (ret == BROTLI_DECODER_RESULT_ERROR) { BrotliDecoderErrorCode errcode = BrotliDecoderGetErrorCode(decompress->br_state); - // http_decoder_log(ERROR, - // "BrotliDecoderDecompressStream() failed: errno = %d, %s", - // errcode, BrotliDecoderErrorString(errcode)); + *outdata = NULL; + *outdata_len = 0; return -1; } @@ -234,6 +234,12 @@ int http_content_decompress_write(struct http_content_decompress *decompress, *outdata = NULL; *outdata_len = 0; + if(NULL == decompress->buffer ){ + decompress->buffer = CALLOC(char, HTTP_DECOMPRESS_BUFFER_SIZE); + assert(decompress->buffer); + decompress->buffer_size = HTTP_DECOMPRESS_BUFFER_SIZE; + } + if (decompress->encoding == HTTP_CONTENT_ENCODING_GZIP || decompress->encoding == HTTP_CONTENT_ENCODING_DEFLATE) { return http_content_decompress_write_zlib(decompress, indata, indata_len, |
