123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- --- mod_gzip.c-old Fri Jan 26 10:50:05 2001
- +++ mod_gzip.c Fri Jan 26 15:08:26 2001
- @@ -575,10 +575,15 @@
- * The GZP request control structure...
- */
-
- +#define GZIP_FORMAT (0)
- +#define DEFLATE_FORMAT (1)
- +
- typedef struct _GZP_CONTROL {
-
- int decompress; /* 0=Compress 1=Decompress */
-
- + int compression_format; /* GZIP_FORMAT or DEFLATE_FORMAT */
- +
- /* Input control... */
-
- int input_ismem; /* Input source is memory buffer, not file */
- @@ -2209,10 +2214,11 @@
- mod_gzip_printf( "%s: Checking for 'gzip' designator...\n",cn);
- #endif
-
- - if ( strstr( has_encoding, "gzip" ) )
- + if ( strstr( has_encoding, "gzip" ) ||
- + strstr( has_encoding, "deflate" ) )
- {
- #ifdef MOD_GZIP_DEBUG1
- - mod_gzip_printf( "%s: 'Content-encoding:' field contains 'gzip' designator...\n",cn);
- + mod_gzip_printf( "%s: 'Content-encoding:' field contains 'gzip' or 'deflate' designator...\n",cn);
- mod_gzip_printf( "%s: Pre-compression is assumed.\n",cn);
- mod_gzip_printf( "%s: Exit > return( DECLINED ) >\n",cn);
- #endif
- @@ -2237,7 +2243,7 @@
- else /* 'gzip' designator not found... */
- {
- #ifdef MOD_GZIP_DEBUG1
- - mod_gzip_printf( "%s: 'Content-encoding:' field does NOT contain 'gzip' designator...\n",cn);
- + mod_gzip_printf( "%s: 'Content-encoding:' field does NOT contain 'gzip' or 'deflate' designator...\n",cn);
- mod_gzip_printf( "%s: Assuming OK to proceed...\n",cn);
- #endif
- }
- @@ -2347,10 +2353,21 @@
- if ( accept_encoding )
- {
- /* ...and if it has the right 'gzip' indicator... */
- -
- + /* We record the compression format in a request note, so we
- + * can get it again later, and so it can potentially be logged.
- + */
- if ( strstr( accept_encoding, "gzip" ) )
- {
- process = 1; /* ...set the 'process' flag TRUE */
- + ap_table_setn( r->notes,"mod_gzip_compression_format",
- + ap_pstrdup(r->pool,"gzip"));
- +
- + }
- + else if ( strstr( accept_encoding, "deflate" ) )
- + {
- + process = 1; /* ...set the 'process' flag TRUE */
- + ap_table_setn( r->notes,"mod_gzip_compression_format",
- + ap_pstrdup(r->pool,"deflate"));
- }
-
- }/* End 'if( accept_encoding )' */
- @@ -2388,7 +2405,7 @@
- else /* 'gzip' designator was seen in 'Accept-Encoding:' field */
- {
- #ifdef MOD_GZIP_DEBUG1
- - mod_gzip_printf( "%s: 'gzip' capability specified by user-agent.\n",cn);
- + mod_gzip_printf( "%s: 'gzip' or 'deflate' capability specified by user-agent.\n",cn);
- mod_gzip_printf( "%s: Assuming OK to proceed...\n",cn);
- #endif
- }
- @@ -4093,7 +4110,8 @@
-
- char tmp[ MOD_GZIP_LARGE_BUFFER_SIZE + 2 ]; /* Scratch buffer */
-
- - char actual_content_encoding_name[] = "gzip"; /* Adjustable */
- + char *actual_content_encoding_name = "gzip"; /* Adjustable */
- + const char *compression_format;
-
- #ifdef MOD_GZIP_DEBUG1
- char cn[]="mod_gzip_encode_and_transmit()";
- @@ -4470,6 +4488,18 @@
-
- gzp->decompress = 0; /* Perform encoding */
-
- + /* Recover the compression format we're supposed to use. */
- + compression_format = ap_table_get(r->notes, "mod_gzip_compression_format");
- + if (compression_format && strcmp(compression_format, "deflate") == 0)
- + {
- + actual_content_encoding_name = "deflate";
- + gzp->compression_format = DEFLATE_FORMAT;
- + }
- + else
- + {
- + gzp->compression_format = GZIP_FORMAT;
- + }
- +
- if ( input_size <= (long) conf->maximum_inmem_size )
- {
- /* The input source is small enough to compress directly */
- @@ -4591,6 +4621,7 @@
-
- #ifdef MOD_GZIP_DEBUG1
- mod_gzip_printf( "%s: gzp->decompress = %d\n" ,cn,gzp->decompress);
- + mod_gzip_printf( "%s: gzp->compression_format = %d\n",cn,gzp->compression_format);
- mod_gzip_printf( "%s: gzp->input_ismem = %d\n", cn,gzp->input_ismem);
- mod_gzip_printf( "%s: gzp->output_ismem = %d\n", cn,gzp->output_ismem);
- mod_gzip_printf( "%s: gzp->input_filename = [%s]\n",cn,gzp->input_filename);
- @@ -7256,6 +7287,8 @@
- };
-
- typedef struct _GZ1 {
- + long compression_format;
- +
- long versionid1;
- int state;
- int done;
- @@ -7345,6 +7378,7 @@
- int dbits;
- ulg window_size;
- ulg crc;
- + ulg adler;
-
- uch dist_code[512];
- uch length_code[MAX_MATCH-MIN_MATCH+1];
- @@ -7449,6 +7483,15 @@
-
- void error( char *msg );
-
- +/* XXX - Precomputed zlib header. If you change the window size or
- + * compression level from the defaults, this will break badly. The
- + * algorithm to build this is fairly complex; you can find it in
- + * the file deflate.c from the zlib distribution.
- + */
- +#define ZLIB_HEADER "\170œ"
- +
- +ulg adler32(ulg adler, uch *buf, unsigned len);
- +
- int zip(
- PGZ1 gz1,
- int in,
- @@ -9088,10 +9131,20 @@
- if ( len == (unsigned)(-1) || len == 0 )
- {
- gz1->crc = gz1->crc ^ 0xffffffffL;
- + /* XXX - Do we need to do something with Adler CRC's here?
- + * I don't think so--they don't seem to need postprocessing. */
- return (int)len;
- }
-
- - updcrc( gz1, (uch*)buf, len );
- + if (gz1->compression_format != DEFLATE_FORMAT)
- + {
- + updcrc( gz1, (uch*)buf, len );
- + }
- + else
- + {
- + gz1->adler = adler32(gz1->adler, (uch*)buf, len);
- + }
- +
- gz1->bytes_in += (ulg)len;
-
- return (int)len;
- @@ -9288,6 +9341,7 @@
- gz1->heap[k] = v;
- }
-
- +
- #define GZS_ZIP1 1
- #define GZS_ZIP2 2
- #define GZS_DEFLATE1 3
- @@ -9317,6 +9371,7 @@
- }
-
- gz1->decompress = gzp->decompress;
- + gz1->compression_format = gzp->compression_format;
-
- strcpy( gz1->ifname, gzp->input_filename );
- strcpy( gz1->ofname, gzp->output_filename );
- @@ -9489,6 +9544,7 @@
- return( rc );
- }
-
- +
- int gzs_zip1( PGZ1 gz1 )
- {
- uch flags = 0;
- @@ -9499,21 +9555,40 @@
-
- gz1->method = DEFLATED;
-
- - put_byte(GZIP_MAGIC[0]);
- - put_byte(GZIP_MAGIC[1]);
- - put_byte(DEFLATED);
- + if (gz1->compression_format != DEFLATE_FORMAT)
- + {
- + put_byte(GZIP_MAGIC[0]);
- + put_byte(GZIP_MAGIC[1]);
- + put_byte(DEFLATED);
- + }
- + else
- + {
- + /* Yes, I know RFC 1951 doesn't mention any header at the start of
- + * a deflated document, but zlib absolutely requires one. And since nearly
- + * all "deflate" implementations use zlib, we need to play along with this
- + * brain damage. */
- + put_byte(ZLIB_HEADER[0]);
- + put_byte(ZLIB_HEADER[1]);
- + }
-
- if ( gz1->save_orig_name )
- {
- flags |= ORIG_NAME;
- }
-
- - put_byte(flags);
- - put_long(gz1->time_stamp);
- -
- - gz1->crc = -1;
- + if (gz1->compression_format != DEFLATE_FORMAT)
- + {
- + put_byte(flags);
- + put_long(gz1->time_stamp);
-
- - updcrc( gz1, NULL, 0 );
- + gz1->crc = -1;
- + updcrc( gz1, NULL, 0 );
- + }
- + else
- + {
- + /* Deflate compression uses an Adler32 CRC, not a CRC32. */
- + gz1->adler = 1L;
- + }
-
- gz1->state = GZS_ZIP2;
-
- @@ -9529,18 +9604,20 @@
- bi_init( gz1, gz1->ofd );
- ct_init( gz1, &attr, &gz1->method );
- lm_init( gz1, gz1->level, &deflate_flags );
- - put_byte((uch)deflate_flags);
- -
- - put_byte(OS_CODE);
-
- - if ( gz1->save_orig_name )
- + if (gz1->compression_format != DEFLATE_FORMAT)
- {
- - char *p = gz1_basename( gz1, gz1->ifname );
- + put_byte((uch)deflate_flags);
- + put_byte(OS_CODE);
- + if ( gz1->save_orig_name )
- + {
- + char *p = gz1_basename( gz1, gz1->ifname );
-
- - do {
- - put_char(*p);
- + do {
- + put_char(*p);
-
- - } while (*p++);
- + } while (*p++);
- + }
- }
-
- gz1->header_bytes = (long)gz1->outcnt;
- @@ -9674,10 +9751,25 @@
- }
- #endif
-
- - put_long( gz1->crc );
- - put_long( gz1->bytes_in );
- -
- - gz1->header_bytes += 2*sizeof(long);
- + if (gz1->compression_format != DEFLATE_FORMAT)
- + {
- + put_long( gz1->crc );
- + put_long( gz1->bytes_in );
- + gz1->header_bytes += 2*sizeof(long);
- + }
- + else
- + {
- + /* Append an Adler32 CRC to our deflated data.
- + * Yes, I know RFC 1951 doesn't mention any CRC at the end of a
- + * deflated document, but zlib absolutely requires one. And since nearly
- + * all "deflate" implementations use zlib, we need to play along with this
- + * brain damage. */
- + put_byte( (gz1->adler >> 24) );
- + put_byte( (gz1->adler >> 16) & 0xFF );
- + put_byte( (gz1->adler >> 8) & 0xFF );
- + put_byte( (gz1->adler ) & 0xFF );
- + gz1->header_bytes += 4*sizeof(uch);
- + }
-
- flush_outbuf( gz1 );
-
- @@ -9685,6 +9777,67 @@
-
- return OK;
- }
- +
- +
- +/* =========================================================================
- + adler32 -- compute the Adler-32 checksum of a data stream
- + Copyright (C) 1995-1998 Mark Adler
- +
- + This software is provided 'as-is', without any express or implied
- + warranty. In no event will the authors be held liable for any damages
- + arising from the use of this software.
- +
- + Permission is granted to anyone to use this software for any purpose,
- + including commercial applications, and to alter it and redistribute it
- + freely, subject to the following restrictions:
- +
- + 1. The origin of this software must not be misrepresented; you must not
- + claim that you wrote the original software. If you use this software
- + in a product, an acknowledgment in the product documentation would be
- + appreciated but is not required.
- + 2. Altered source versions must be plainly marked as such, and must not be
- + misrepresented as being the original software.
- + 3. This notice may not be removed or altered from any source distribution.
- +
- + Modified by Eric Kidd <eric.kidd@pobox.com> to play nicely with mod_gzip.
- + */
- +
- +#define BASE 65521L /* largest prime smaller than 65536 */
- +#define NMAX 5552
- +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
- +
- +#define DO1(buf,i) {s1 += buf[i]; s2 += s1;}
- +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
- +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
- +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
- +#define DO16(buf) DO8(buf,0); DO8(buf,8);
- +
- +ulg adler32(ulg adler, uch *buf, unsigned len)
- +{
- + unsigned long s1 = adler & 0xffff;
- + unsigned long s2 = (adler >> 16) & 0xffff;
- + int k;
- +
- + if (buf == NULL) return 1L;
- +
- + while (len > 0) {
- + k = len < NMAX ? len : NMAX;
- + len -= k;
- + while (k >= 16) {
- + DO16(buf);
- + buf += 16;
- + k -= 16;
- + }
- + if (k != 0) do {
- + s1 += *buf++;
- + s2 += s1;
- + } while (--k);
- + s1 %= BASE;
- + s2 %= BASE;
- + }
- + return (s2 << 16) | s1;
- +}
- +
-
- /* END OF FILE */
-
|