37 #define OLD_ZLIB_SUPPORT 1 39 #define DSIZ CURL_MAX_WRITE_SIZE 41 #define GZIP_MAGIC_0 0x1f 42 #define GZIP_MAGIC_1 0x8b 45 #define ASCII_FLAG 0x01 47 #define EXTRA_FIELD 0x04 48 #define ORIG_NAME 0x08 53 zalloc_cb(voidpf opaque,
unsigned int items,
unsigned int size)
57 return (voidpf)
calloc(items, size);
61 zfree_cb(voidpf opaque, voidpf
ptr)
68 process_zlib_error(
struct connectdata *conn, z_stream *z)
72 failf(data,
"Error while processing content unencoding: %s",
75 failf(data,
"Error while processing content unencoding: " 76 "Unknown failure within decompression software.");
85 *zlib_init = ZLIB_UNINIT;
93 int allow_restart = 1;
95 uInt nread = z->avail_in;
96 Bytef *orig_in = z->next_in;
112 z->next_out = (Bytef *)decomp;
115 status = inflate(z, Z_SYNC_FLUSH);
116 if(status == Z_OK || status == Z_STREAM_END) {
118 if((DSIZ - z->avail_out) && (!k->
ignorebody)) {
120 DSIZ - z->avail_out);
124 return exit_zlib(z, &k->zlib_init, result);
129 if(status == Z_STREAM_END) {
131 if(inflateEnd(z) == Z_OK)
132 return exit_zlib(z, &k->zlib_init, result);
133 return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
139 if(z->avail_in == 0) {
144 else if(allow_restart && status == Z_DATA_ERROR) {
148 (void) inflateEnd(z);
149 if(inflateInit2(z, -MAX_WBITS) != Z_OK) {
151 return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
153 z->next_in = orig_in;
160 return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
174 if(k->zlib_init == ZLIB_UNINIT) {
175 memset(z, 0,
sizeof(z_stream));
176 z->zalloc = (alloc_func)zalloc_cb;
177 z->zfree = (free_func)zfree_cb;
179 if(inflateInit(z) != Z_OK)
180 return process_zlib_error(conn, z);
181 k->zlib_init = ZLIB_INIT;
185 z->next_in = (Bytef *)k->
str;
186 z->avail_in = (uInt)nread;
189 return inflate_stream(conn, k);
192 #ifdef OLD_ZLIB_SUPPORT 205 return GZIP_UNDERFLOW;
207 if((data[0] != GZIP_MAGIC_0) || (data[1] != GZIP_MAGIC_1))
213 if(method != Z_DEFLATED || (flags & RESERVED) != 0) {
222 if(flags & EXTRA_FIELD) {
226 return GZIP_UNDERFLOW;
228 extra_len = (data[1] << 8) | data[0];
230 if(len < (extra_len + 2))
231 return GZIP_UNDERFLOW;
233 len -= (extra_len + 2);
234 data += (extra_len + 2);
237 if(flags & ORIG_NAME) {
239 while(len && *data) {
244 return GZIP_UNDERFLOW;
251 if(flags & COMMENT) {
253 while(len && *data) {
258 return GZIP_UNDERFLOW;
264 if(flags & HEAD_CRC) {
266 return GZIP_UNDERFLOW;
271 *headerlen = totallen -
len;
284 if(k->zlib_init == ZLIB_UNINIT) {
285 memset(z, 0,
sizeof(z_stream));
286 z->zalloc = (alloc_func)zalloc_cb;
287 z->zfree = (free_func)zfree_cb;
289 if(strcmp(zlibVersion(),
"1.2.0.4") >= 0) {
291 if(inflateInit2(z, MAX_WBITS + 32) != Z_OK) {
292 return process_zlib_error(conn, z);
294 k->zlib_init = ZLIB_INIT_GZIP;
298 if(inflateInit2(z, -MAX_WBITS) != Z_OK) {
299 return process_zlib_error(conn, z);
301 k->zlib_init = ZLIB_INIT;
305 if(k->zlib_init == ZLIB_INIT_GZIP) {
307 z->next_in = (Bytef *)k->
str;
308 z->avail_in = (uInt)nread;
310 return inflate_stream(conn, k);
313 #ifndef OLD_ZLIB_SUPPORT 329 switch(k->zlib_init) {
336 switch(check_gzip_header((
unsigned char *)k->
str, nread, &hlen)) {
338 z->next_in = (Bytef *)k->
str + hlen;
339 z->avail_in = (uInt)(nread - hlen);
340 k->zlib_init = ZLIB_GZIP_INFLATING;
351 z->avail_in = (uInt)nread;
352 z->next_in =
malloc(z->avail_in);
353 if(z->next_in == NULL) {
357 k->zlib_init = ZLIB_GZIP_HEADER;
363 return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
369 case ZLIB_GZIP_HEADER:
373 z->avail_in += (uInt)nread;
375 if(z->next_in == NULL) {
379 memcpy(z->next_in + z->avail_in - nread, k->
str, nread);
381 switch(check_gzip_header(z->next_in, z->avail_in, &hlen)) {
386 z->next_in = (Bytef *)k->
str + hlen + nread - z->avail_in;
387 z->avail_in = (uInt)(z->avail_in - hlen);
388 k->zlib_init = ZLIB_GZIP_INFLATING;
398 return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
404 case ZLIB_GZIP_INFLATING:
407 z->next_in = (Bytef *)k->
str;
408 z->avail_in = (uInt)nread;
412 if(z->avail_in == 0) {
418 return inflate_stream(conn, k);
427 if(k->zlib_init != ZLIB_UNINIT)
428 (void) exit_zlib(z, &k->zlib_init,
CURLE_OK);
UNITTEST_START char * ptr
UNITTEST_START int result
memcpy(filename, filename1, strlen(filename1))
UNITTEST_START struct Curl_easy data
void * Curl_saferealloc(void *ptr, size_t size)
CURLcode Curl_unencode_gzip_write(struct connectdata *conn, struct SingleRequest *k, ssize_t nread)
CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr, size_t len)
#define Curl_unencode_cleanup(x)
CURLcode Curl_unencode_deflate_write(struct connectdata *conn, struct SingleRequest *req, ssize_t nread)
#define calloc(nbelem, size)