X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_encoding_api.c;h=d1ce3da984441d1a839590c642aa6ed68c9433ed;hp=cba2d2547a595721790007a3d6cfc47610debff6;hb=dfe2dbf042d42f83255b6ff46c2210bcd57ca586;hpb=5c5ddf9042732a05100245844fe2fb70bfe6d495 diff --git a/http_encoding_api.c b/http_encoding_api.c index cba2d25..d1ce3da 100644 --- a/http_encoding_api.c +++ b/http_encoding_api.c @@ -151,13 +151,13 @@ inline void http_init_uncompress_buffer(size_t data_len, char **buf_ptr, size_t *buf_ptr = emalloc(*buf_len + 1); } else { size_t new_len = *buf_len << 2; - char *new_ptr = erealloc(*buf_ptr, new_len + 1); + char *new_ptr = erealloc_recoverable(*buf_ptr, new_len + 1); if (new_ptr) { *buf_ptr = new_ptr; *buf_len = new_len; } else { - *iteration = INT_MAX; + *iteration = INT_MAX-1; /* avoid integer overflow on increment op */ } } } @@ -531,7 +531,7 @@ PHP_HTTP_API STATUS _http_encoding_stream_update(http_encoding_stream *s, const status = deflate(&s->Z, Z_SYNC_FLUSH); if (Z_OK != status && Z_STREAM_END != status) { - HTTP_GZSTREAM_ERROR(status, *encoded); + HTTP_ENCODING_STREAM_ERROR(status, *encoded); } *encoded_len -= s->Z.avail_out; @@ -556,8 +556,6 @@ PHP_HTTP_API STATUS _http_encoding_stream_finish(http_encoding_stream *s, char * HTTP_ENCODING_STREAM_ERROR(status, *encoded); } - fprintf(stderr, "Needed %d bytes\n", *encoded_len - s->Z.avail_out); - *encoded_len -= s->Z.avail_out; if (s->gzip) { if (s->Z.avail_out < 8) { @@ -580,19 +578,21 @@ PHP_HTTP_API STATUS _http_encoding_stream_finish(http_encoding_stream *s, char * PHP_HTTP_API zend_bool _http_encoding_response_start(size_t content_length TSRMLS_DC) { - if (php_ob_handler_used("ob_gzhandler" TSRMLS_DC)||php_ob_handler_used("zlib output compression" TSRMLS_DC)) { + if ( php_ob_handler_used("ob_gzhandler" TSRMLS_CC) || + php_ob_handler_used("zlib output compression" TSRMLS_CC)) { HTTP_G(send).gzip_encoding = 0; } else { if (!HTTP_G(send).gzip_encoding) { /* emit a content-length header */ if (content_length) { - char *cl; - spprintf(&cl, 0, "Content-Length: %lu", (unsigned long) content_length); - http_send_header_string(cl); - efree(cl); + char cl_header_str[128]; + size_t cl_header_len; + cl_header_len = snprintf(cl_header_str, lenof(cl_header_str), "Content-Length: %lu", (unsigned long) content_length); + http_send_header_string_ex(cl_header_str, cl_header_len, 1); } } else { #ifndef HTTP_HAVE_ZLIB + HTTP_G(send).gzip_encoding = 0; php_start_ob_buffer_named("ob_gzhandler", 0, 0 TSRMLS_CC); #else HashTable *selected; @@ -603,6 +603,8 @@ PHP_HTTP_API zend_bool _http_encoding_response_start(size_t content_length TSRML add_next_index_stringl(&zsupported, "gzip", lenof("gzip"), 1); add_next_index_stringl(&zsupported, "deflate", lenof("deflate"), 1); + HTTP_G(send).gzip_encoding = 0; + if (selected = http_negotiate_encoding(&zsupported)) { STATUS hs = FAILURE; char *encoding = NULL; @@ -620,8 +622,6 @@ PHP_HTTP_API zend_bool _http_encoding_response_start(size_t content_length TSRML } if (SUCCESS == hs) { http_send_header_string("Vary: Accept-Encoding"); - } else { - HTTP_G(send).gzip_encoding = 0; } } @@ -630,7 +630,7 @@ PHP_HTTP_API zend_bool _http_encoding_response_start(size_t content_length TSRML } zval_dtor(&zsupported); - return 1; + return HTTP_G(send).gzip_encoding; #endif } }