From 87c5ed8beca8ae36da5c38ef3594b56d132e7dde Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 25 Apr 2006 20:49:40 +0000 Subject: Paul Querna fixed libcurl to better deal with deflate content encoding when the stream (wrongly) lacks a proper zlib header. This seems to be the case on too many actual server implementations. --- CHANGES | 5 +++++ RELEASE-NOTES | 3 ++- lib/content_encoding.c | 19 ++++++++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 0f1a1debc..662c40383 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,11 @@ Changelog +Daniel (25 April 2006) +- Paul Querna fixed libcurl to better deal with deflate content encoding + when the stream (wrongly) lacks a proper zlib header. This seems to be the + case on too many actual server implementations. + Daniel (21 April 2006) - Ale Vesely fixed CURLOPT_INTERFACE when using a hostname. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index cb352f53d..179aeff2b 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -18,6 +18,7 @@ This release includes the following changes: This release includes the following bugfixes: + o deflate code survives lack of zlib header o CURLOPT_INTERFACE works with hostname o configure runs fine with ICC o closed control connection with FTP when easy handle was removed from multi @@ -42,6 +43,6 @@ advice from friends like these: Dan Fandrich, Ilja van Sprundel, David McCreedy, Tor Arntsen, Xavier Bouchoux, David Byron, Michele Bini, Ates Goral, Katie Wang, Robson Braga Araujo, - Ale Vesely + Ale Vesely, Paul Querna Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/content_encoding.c b/lib/content_encoding.c index e3e66b140..bcd5b838a 100644 --- a/lib/content_encoding.c +++ b/lib/content_encoding.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -87,7 +87,10 @@ static CURLcode inflate_stream(struct SessionHandle *data, struct Curl_transfer_keeper *k) { + int allow_restart = 1; z_stream *z = &k->z; /* zlib state structure */ + uInt nread = z->avail_in; + Bytef *orig_in = z->next_in; int status; /* zlib status */ CURLcode result = CURLE_OK; /* Curl_client_write status */ char *decomp; /* Put the decompressed data here. */ @@ -108,6 +111,7 @@ inflate_stream(struct SessionHandle *data, status = inflate(z, Z_SYNC_FLUSH); if (status == Z_OK || status == Z_STREAM_END) { + allow_restart = 0; if(DSIZ - z->avail_out) { result = Curl_client_write(data, CLIENTWRITE_BODY, decomp, DSIZ - z->avail_out); @@ -133,6 +137,19 @@ inflate_stream(struct SessionHandle *data, return result; } } + else if (allow_restart && status == Z_DATA_ERROR) { + /* some servers seem to not generate zlib headers, so this is an attempt + to fix and continue anyway */ + + inflateReset(z); + if (inflateInit2(z, -MAX_WBITS) != Z_OK) { + return process_zlib_error(data, z); + } + z->next_in = orig_in; + z->avail_in = nread; + allow_restart = 0; + continue; + } else { /* Error; exit loop, handle below */ free(decomp); return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z)); -- cgit v1.2.3