X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_encoding_api.c;h=5d1a908b5bfae52bab857d5b3c67e33695cfae5d;hb=3706c9ddb362d54d409506010952a0129e78e5e9;hp=6c0d4157b2115ca6b917ffa443c2dc1c675e1186;hpb=eabc03de1d511ce49640322859c6175f27a413e5;p=m6w6%2Fext-http diff --git a/http_encoding_api.c b/http_encoding_api.c index 6c0d415..5d1a908 100644 --- a/http_encoding_api.c +++ b/http_encoding_api.c @@ -140,9 +140,10 @@ PHP_HTTP_API STATUS _http_encoding_gzencode(int level, int mtime, const char *da return FAILURE; } - Z.zalloc = Z_NULL; - Z.zfree = Z_NULL; - Z.opaque = Z_NULL; + *encoded = NULL; + *encoded_len = 0; + memset(&Z, 0, sizeof(z_stream)); + Z.next_in = (Bytef *) data; Z.avail_in = data_len; Z.avail_out = HTTP_ENCODING_BUFLEN(data_len) + HTTP_ENCODING_SAFPAD - 1; @@ -188,7 +189,7 @@ PHP_HTTP_API STATUS _http_encoding_gzencode(int level, int mtime, const char *da } } - efree(*encoded); + STR_SET(*encoded, NULL); http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Could not gzencode data: %s", zError(status)); return FAILURE; } @@ -213,9 +214,10 @@ PHP_HTTP_API STATUS _http_encoding_deflate(int level, int zhdr, const char *data z_stream Z; STATUS status = Z_OK; - Z.zalloc = Z_NULL; - Z.zfree = Z_NULL; - Z.opaque = Z_NULL; + *encoded = NULL; + *encoded_len = 0; + memset(&Z, 0, sizeof(z_stream)); + Z.data_type = Z_UNKNOWN; Z.next_in = (Bytef *) data; Z.avail_in = data_len; @@ -234,7 +236,7 @@ PHP_HTTP_API STATUS _http_encoding_deflate(int level, int zhdr, const char *data } } - efree(encoded); + STR_SET(*encoded, NULL); http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Could not deflate data: %s", zError(status)); return FAILURE; } @@ -247,17 +249,12 @@ PHP_HTTP_API STATUS _http_encoding_inflate(const char *data, size_t data_len, ch *decoded = NULL; *decoded_len = 0; + memset(&Z, 0, sizeof(z_stream)); -retry_inflate: do { - Z.zalloc = Z_NULL; - Z.zfree = Z_NULL; - if (!max) { - if (!*decoded) { - *decoded_len = data_len * 2; - *decoded = emalloc(*decoded_len + 1); - } + *decoded_len = data_len * 2; + *decoded = emalloc(*decoded_len + 1); } else { size_t new_len = *decoded_len << 2; char *new_ptr = erealloc_recoverable(*decoded, new_len + 1); @@ -270,6 +267,7 @@ retry_inflate: } } +retry_inflate: Z.next_in = (Bytef *) data; Z.avail_in = data_len; Z.next_out = (Bytef *) *decoded; @@ -292,7 +290,7 @@ retry_inflate: } } while (status == Z_BUF_ERROR && ++max < HTTP_ENCODING_MAXTRY); - efree(*decoded); + STR_SET(*decoded, NULL); http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Could not inflate data: %s", zError(status)); return FAILURE; } @@ -520,6 +518,7 @@ PHP_HTTP_API zend_bool _http_encoding_response_start(size_t content_length TSRML INIT_PZVAL(&zsupported); array_init(&zsupported); add_next_index_stringl(&zsupported, "gzip", lenof("gzip"), 1); + add_next_index_stringl(&zsupported, "x-gzip", lenof("x-gzip"), 1); add_next_index_stringl(&zsupported, "deflate", lenof("deflate"), 1); HTTP_G(send).gzip_encoding = 0; @@ -530,7 +529,7 @@ PHP_HTTP_API zend_bool _http_encoding_response_start(size_t content_length TSRML ulong idx; if (HASH_KEY_IS_STRING == zend_hash_get_current_key(selected, &encoding, &idx, 0) && encoding) { - if (!strcmp(encoding, "gzip")) { + if (!strcmp(encoding, "gzip") || !strcmp(encoding, "x-gzip")) { if (SUCCESS == (hs = http_send_header_string("Content-Encoding: gzip"))) { HTTP_G(send).gzip_encoding = HTTP_ENCODING_GZIP; }