- (non-)ZTS fixes
[m6w6/ext-http] / http_encoding_api.c
index 89865a2bd543c437e4de80b24f1e3f29c17046bf..06a175ff6a1e11478631f1ee6b13e69ca7fbf49e 100644 (file)
@@ -238,24 +238,21 @@ static inline int http_inflate_rounds(z_stream *Z, int flush, char **buf, size_t
                if (PHPSTR_NOMEM == phpstr_resize_ex(&buffer, buffer.size, 0, 1)) {
                        status = Z_MEM_ERROR;
                } else {
-                       do {
-                               Z->avail_out = buffer.free;
-                               Z->next_out = (Bytef *) buffer.data + buffer.used;
+                       Z->avail_out = buffer.free;
+                       Z->next_out = (Bytef *) buffer.data + buffer.used;
 #if 0
-                               fprintf(stderr, "PRIOR: size=%lu, avail=%lu, used=%lu, (%d/%d)\n", buffer.size, Z->avail_out, buffer.used, status, round);
+                       fprintf(stderr, "\n%3d: %3d PRIOR: size=%7lu,\tfree=%7lu,\tused=%7lu,\tavail_in=%7lu,\tavail_out=%7lu\n", round, status, buffer.size, buffer.free, buffer.used, Z->avail_in, Z->avail_out);
 #endif
-                               status = inflate(Z, flush);
+                       status = inflate(Z, flush);
                        
-                               buffer.used += buffer.free - Z->avail_out;
-                               buffer.free = Z->avail_out;
+                       buffer.used += buffer.free - Z->avail_out;
+                       buffer.free = Z->avail_out;
 #if 0
-                               fprintf(stderr, "AFTER: size=%lu, avail=%lu, used=%lu, (%d/%d)\n", buffer.size, Z->avail_out, buffer.used, status, round);
+                       fprintf(stderr, "%3d: %3d AFTER: size=%7lu,\tfree=%7lu,\tused=%7lu,\tavail_in=%7lu,\tavail_out=%7lu\n", round, status, buffer.size, buffer.free, buffer.used, Z->avail_in, Z->avail_out);
 #endif
-                       } while (Z_OK == status && Z->avail_in);
-                       
                        HTTP_INFLATE_BUFFER_SIZE_ALIGN(buffer.size);
                }
-       } while (Z_BUF_ERROR == status && ++round < HTTP_INFLATE_ROUNDS);
+       } while ((Z_BUF_ERROR == status || (Z_OK == status && Z->avail_in)) && ++round < HTTP_INFLATE_ROUNDS);
        
        if (status == Z_OK || status == Z_STREAM_END) {
                phpstr_shrink(&buffer);
@@ -327,12 +324,11 @@ retry_raw_inflate:
                Z.next_in = (Bytef *) data;
                Z.avail_in = data_len;
                
-               switch (status = http_inflate_rounds(&Z, Z_NO_FLUSH, decoded, decoded_len))
-               {
+               switch (status = http_inflate_rounds(&Z, Z_NO_FLUSH, decoded, decoded_len)) {
                        case Z_OK:
                        case Z_STREAM_END:
+                               inflateEnd(&Z);
                                return SUCCESS;
-                       break;
                        
                        case Z_DATA_ERROR:
                                /* raw deflated data? */
@@ -341,7 +337,6 @@ retry_raw_inflate:
                                        wbits = HTTP_WINDOW_BITS_RAW;
                                        goto retry_raw_inflate;
                                }
-                       break;
                }
                inflateEnd(&Z);
        }
@@ -432,8 +427,7 @@ PHP_HTTP_API STATUS _http_encoding_deflate_stream_update(http_encoding_stream *s
        s->stream.avail_out = *encoded_len;
        s->stream.next_out = (Bytef *) *encoded;
        
-       switch (status = deflate(&s->stream, HTTP_ENCODING_STREAM_FLUSH_FLAG(s->flags)))
-       {
+       switch (status = deflate(&s->stream, HTTP_ENCODING_STREAM_FLUSH_FLAG(s->flags))) {
                case Z_OK:
                case Z_STREAM_END:
                        /* cut processed chunk off the buffer */
@@ -448,7 +442,6 @@ PHP_HTTP_API STATUS _http_encoding_deflate_stream_update(http_encoding_stream *s
                        *encoded = erealloc_rel(*encoded, *encoded_len + 1);
                        (*encoded)[*encoded_len] = '\0';
                        return SUCCESS;
-               break;
        }
        
        STR_SET(*encoded, NULL);
@@ -470,8 +463,7 @@ retry_raw_inflate:
        s->stream.next_in = (Bytef *) PHPSTR_VAL(s->stream.opaque);
        s->stream.avail_in = PHPSTR_LEN(s->stream.opaque);
        
-       switch (status = http_inflate_rounds(&s->stream, HTTP_ENCODING_STREAM_FLUSH_FLAG(s->flags), decoded, decoded_len))
-       {
+       switch (status = http_inflate_rounds(&s->stream, HTTP_ENCODING_STREAM_FLUSH_FLAG(s->flags), decoded, decoded_len)) {
                case Z_OK:
                case Z_STREAM_END:
                        /* cut off */
@@ -481,7 +473,6 @@ retry_raw_inflate:
                                phpstr_reset(PHPSTR(s->stream.opaque));
                        }
                        return SUCCESS;
-               break;
                
                case Z_DATA_ERROR:
                        /* raw deflated data ? */
@@ -491,7 +482,6 @@ retry_raw_inflate:
                                inflateInit2(&s->stream, HTTP_WINDOW_BITS_RAW);
                                goto retry_raw_inflate;
                        }
-               break;
        }
        
        http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Failed to update inflate stream: %s", zError(status));
@@ -512,15 +502,13 @@ PHP_HTTP_API STATUS _http_encoding_deflate_stream_flush(http_encoding_stream *s,
        s->stream.avail_out = *encoded_len;
        s->stream.next_out = (Bytef *) *encoded;
        
-       switch (status = deflate(&s->stream, Z_FULL_FLUSH))
-       {
+       switch (status = deflate(&s->stream, Z_FULL_FLUSH)) {
                case Z_OK:
                case Z_STREAM_END:
                        *encoded_len = HTTP_DEFLATE_BUFFER_SIZE - s->stream.avail_out;
                        *encoded = erealloc_rel(*encoded, *encoded_len + 1);
                        (*encoded)[*encoded_len] = '\0';
                        return SUCCESS;
-               break;
        }
        
        STR_SET(*encoded, NULL);
@@ -581,6 +569,12 @@ PHP_HTTP_API STATUS _http_encoding_inflate_stream_finish(http_encoding_stream *s
 {
        int status;
        
+       if (!PHPSTR_LEN(s->stream.opaque)) {
+               *decoded = NULL;
+               *decoded_len = 0;
+               return SUCCESS;
+       }
+       
        *decoded_len = (PHPSTR_LEN(s->stream.opaque) + 1) * HTTP_INFLATE_ROUNDS;
        *decoded = emalloc_rel(*decoded_len);
        
@@ -675,19 +669,17 @@ void _http_ob_deflatehandler(char *output, uint output_len, char **handled_outpu
                
                HTTP_G->send.deflate.encoding = !0;
                
-               switch (http_encoding_response_start(0))
-               {
+               switch (http_encoding_response_start(0)) {
                        case HTTP_ENCODING_GZIP:
                                flags = HTTP_DEFLATE_TYPE_GZIP;
-                       break;
+                               break;
                        
                        case HTTP_ENCODING_DEFLATE:
                                flags = HTTP_DEFLATE_TYPE_ZLIB;
-                       break;
+                               break;
                        
                        default:
                                goto deflate_passthru_plain;
-                       break;
                }
                
                flags |= (HTTP_G->send.deflate.start_flags &~ 0xf0);