diff options
author | Sander Roobol <sander@php.net> | 2003-05-21 16:05:03 +0000 |
---|---|---|
committer | Sander Roobol <sander@php.net> | 2003-05-21 16:05:03 +0000 |
commit | ff36043d142d4a4545bbf8cabfdf2825a8cc0685 (patch) | |
tree | c0890ad2edf69dcbcd208e147eb9b103e7d0e759 | |
parent | 18254e85efe2bf66f2a98ac4f9f1d531af72e885 (diff) | |
download | php-git-ff36043d142d4a4545bbf8cabfdf2825a8cc0685.tar.gz |
ob_gzhandler and zlib.output_compression should send a Content-Length
header if the length of the complete compressed output is known
# MFH follows in a few minutes, please wait with the release :)
-rw-r--r-- | ext/zlib/zlib.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 1e6ce2f286..5c7f4da348 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -45,6 +45,7 @@ #include "safe_mode.h" #include "ext/standard/php_standard.h" #include "ext/standard/info.h" +#include "ext/standard/php_smart_str.h" #include "php_zlib.h" #include "fopen_wrappers.h" #if HAVE_PWD_H @@ -74,6 +75,22 @@ #define GZIP_HEADER_LENGTH 10 #define GZIP_FOOTER_LENGTH 8 +#define ADD_CL_HEADER(xln) \ +{ \ + smart_str str = {0}; \ + sapi_header_line ctr = {0}; \ + \ + smart_str_appends(&str, "Content-Length: "); \ + smart_str_append_long(&str, xln); \ + smart_str_0(&str); \ + \ + ctr.line = str.c; \ + ctr.line_len = str.len; \ + \ + sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC); \ + smart_str_free(&str); \ +} + /* True globals, no need for thread safety */ static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ @@ -1013,6 +1030,8 @@ PHP_FUNCTION(ob_gzhandler) if (return_original) { zval_dtor(return_value); + } else if(do_start && do_end) { + ADD_CL_HEADER(Z_STRLEN_P(return_value)); } } else { @@ -1040,6 +1059,8 @@ static void php_gzip_output_handler(char *output, uint output_len, char **handle do_end = (mode & PHP_OUTPUT_HANDLER_END ? 1 : 0); if (php_deflate_string(output, output_len, handled_output, handled_output_len, ZLIBG(ob_gzip_coding), do_start, do_end, ZLIBG(output_compression_level) TSRMLS_CC) != SUCCESS) { zend_error(E_ERROR, "Compression failed"); + } else if (do_start && do_end) { + ADD_CL_HEADER(*handled_output_len); } } } |