- if (data[2] != (const char) Z_DEFLATED) {
- http_error_ex(error_level TSRMLS_CC, HTTP_E_ENCODING, "Unrecognized compression format (%d)", (int) (data[2] & 0xFF));
- /* still try to decode */
- }
- if ((data[3] & 0x4) == 0x4) {
- if (data_len < offset + 2) {
- goto really_bad_gzip_header;
- }
- /* there are extra fields, the length follows the common header as 2 bytes LSB */
- offset += (unsigned) ((data[offset] & 0xFF));
- offset += 1;
- offset += (unsigned) ((data[offset] & 0xFF) << 8);
- offset += 1;
- }
- if ((data[3] & 0x8) == 0x8) {
- if (data_len <= offset) {
- goto really_bad_gzip_header;
- }
- /* there's a file name */
- offset += strlen(&data[offset]) + 1 /*NUL*/;
- }
- if ((data[3] & 0x10) == 0x10) {
- if (data_len <= offset) {
- goto really_bad_gzip_header;
- }
- /* there's a comment */
- offset += strlen(&data[offset]) + 1 /* NUL */;
- }
- if ((data[3] & 0x2) == 0x2) {
- /* there's a CRC16 of the header */
- offset += 2;
- if (data_len <= offset) {
- goto really_bad_gzip_header;
- } else {
- unsigned long crc, cmp;
-
- cmp = (unsigned) ((data[offset-2] & 0xFF));
- cmp += (unsigned) ((data[offset-1] & 0xFF) << 8);
-
- crc = crc32(0L, Z_NULL, 0);
- crc = crc32(crc, (const Bytef *) data, sizeof(http_encoding_gzip_header));
-
- if (cmp != (crc & 0xFFFF)) {
- http_error_ex(error_level TSRMLS_CC, HTTP_E_ENCODING, "GZIP headers CRC checksums so not match (%lu, %lu)", cmp, crc & 0xFFFF);
- return FAILURE;
- }
+ if (Z_OK == (status = deflateInit2(&s->stream, level, Z_DEFLATED, wbits, MAX_MEM_LEVEL, strategy))) {
+ int p = (flags & HTTP_ENCODING_STREAM_PERSISTENT) ? PHPSTR_INIT_PERSISTENT:0;
+
+ if ((s->stream.opaque = phpstr_init_ex(NULL, HTTP_DEFLATE_BUFFER_SIZE, p))) {
+ return s;