Author: paszczus                     Date: Sun Feb 19 09:51:24 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- from http://trac.lighttpd.net/trac/wiki/Release-1.4.10-patches

---- Files affected:
SOURCES:
   lighttpd-mod_deflate.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/lighttpd-mod_deflate.patch
diff -u /dev/null SOURCES/lighttpd-mod_deflate.patch:1.1
--- /dev/null   Sun Feb 19 10:51:24 2006
+++ SOURCES/lighttpd-mod_deflate.patch  Sun Feb 19 10:51:19 2006
@@ -0,0 +1,1945 @@
+diff -Naur lighttpd-1.4.10.orig/src/Makefile.am lighttpd-1.4.10/src/Makefile.am
+--- lighttpd-1.4.10.orig/src/Makefile.am       2006-01-04 06:08:03.000000000 
-0800
++++ lighttpd-1.4.10/src/Makefile.am    2006-02-16 22:25:16.504347041 -0800
+@@ -28,7 +28,7 @@
+ mod_ssi_expr.c: mod_ssi_exprparser.h
+ 
+ common_src=buffer.c log.c \
+-      keyvalue.c chunk.c  \
++      keyvalue.c chunk.c chunk_encode.c \
+       http_chunk.c stream.c fdevent.c \
+       stat_cache.c plugin.c joblist.c etag.c array.c \
+       data_string.c data_count.c data_array.c \
+@@ -222,9 +222,14 @@
+ mod_accesslog_la_LDFLAGS = -module -export-dynamic -avoid-version 
-no-undefined
+ mod_accesslog_la_LIBADD = $(common_libadd)
+ 
++lib_LTLIBRARIES += mod_deflate.la
++mod_deflate_la_SOURCES = mod_deflate.c 
++mod_deflate_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
++mod_deflate_la_LIBADD = $(Z_LIB) $(BZ_LIB) $(common_libadd)
++
+ 
+ hdr = server.h buffer.h network.h log.h keyvalue.h \
+-      response.h request.h fastcgi.h chunk.h \
++      response.h request.h fastcgi.h chunk.h chunk_encode.h \
+       settings.h http_chunk.h http_auth_digest.h \
+       md5.h http_auth.h stream.h \
+       fdevent.h connections.h base.h stat_cache.h \
+diff -Naur lighttpd-1.4.10.orig/src/base.h lighttpd-1.4.10/src/base.h
+--- lighttpd-1.4.10.orig/src/base.h    2006-01-11 06:51:04.000000000 -0800
++++ lighttpd-1.4.10/src/base.h 2006-02-16 22:25:16.504347041 -0800
+@@ -345,8 +345,10 @@
+       
+       int file_started;
+       int file_finished;
++      int end_chunk; /* used for chunked transfer encoding. */
+       
+-      chunkqueue *write_queue;      /* a large queue for low-level write ( 
HTTP response ) [ file, mem ] */
++      chunkqueue *write_queue;  /* a large queue for HTTP response content [ 
file, mem ] */
++      chunkqueue *output_queue; /* a large queue for low-level write ( HTTP 
response ) [ file, mem ] */
+       chunkqueue *read_queue;       /* a small queue for low-level read ( 
HTTP request ) [ mem ] */
+       chunkqueue *request_content_queue; /* takes request-content into 
tempfile if necessary [ tempfile, mem ]*/
+       
+@@ -570,6 +572,7 @@
+       
+       connections *conns;
+       connections *joblist;
++      connections *joblist_prev;
+       connections *fdwaitqueue;
+       
+       stat_cache  *stat_cache;
+diff -Naur lighttpd-1.4.10.orig/src/chunk.c lighttpd-1.4.10/src/chunk.c
+--- lighttpd-1.4.10.orig/src/chunk.c   2005-11-18 05:18:19.000000000 -0800
++++ lighttpd-1.4.10/src/chunk.c        2006-02-16 22:25:16.505346873 -0800
+@@ -224,6 +224,16 @@
+       return 0;
+ }
+ 
++int chunkqueue_append_chunkqueue(chunkqueue *cq, chunkqueue *src) {
++      if(src == NULL) return 0;
++      chunkqueue_append_chunk(cq, src->first);
++      cq->last = src->last;
++      src->first = NULL;
++      src->last = NULL;
++
++      return 0;
++}
++
+ buffer * chunkqueue_get_prepend_buffer(chunkqueue *cq) {
+       chunk *c;
+       
+diff -Naur lighttpd-1.4.10.orig/src/chunk.h lighttpd-1.4.10/src/chunk.h
+--- lighttpd-1.4.10.orig/src/chunk.h   2005-10-31 23:32:21.000000000 -0800
++++ lighttpd-1.4.10/src/chunk.h        2006-02-16 22:25:16.505346873 -0800
+@@ -51,6 +51,7 @@
+ int chunkqueue_append_file(chunkqueue *c, buffer *fn, off_t offset, off_t 
len);
+ int chunkqueue_append_mem(chunkqueue *c, const char *mem, size_t len);
+ int chunkqueue_append_buffer(chunkqueue *c, buffer *mem);
++int chunkqueue_append_chunkqueue(chunkqueue *cq, chunkqueue *src);
+ int chunkqueue_prepend_buffer(chunkqueue *c, buffer *mem);
+ 
+ buffer * chunkqueue_get_append_buffer(chunkqueue *c);
+diff -Naur lighttpd-1.4.10.orig/src/chunk_encode.c 
lighttpd-1.4.10/src/chunk_encode.c
+--- lighttpd-1.4.10.orig/src/chunk_encode.c    1969-12-31 16:00:00.000000000 
-0800
++++ lighttpd-1.4.10/src/chunk_encode.c 2006-02-16 22:25:16.505346873 -0800
+@@ -0,0 +1,117 @@
++/**
++ * the HTTP chunk-API
++ * 
++ * 
++ */
++
++#include <sys/types.h>
++#include <sys/stat.h>
++
++#include <stdlib.h>
++#include <fcntl.h>
++#include <unistd.h>
++
++#include <stdio.h>
++#include <errno.h>
++#include <string.h>
++
++#include "server.h"
++#include "chunk.h"
++#include "chunk_encode.h"
++#include "log.h"
++
++static int chunk_encode_append_len(chunkqueue *cq, size_t len) {
++      size_t i, olen = len, j;
++      buffer *b;
++      
++      /*b = srv->tmp_chunk_len;*/
++      /*b = buffer_init();*/
++      b = chunkqueue_get_append_buffer(cq);
++      
++      if (len == 0) {
++              buffer_copy_string(b, "0");
++      } else {
++              for (i = 0; i < 8 && len; i++) {
++                      len >>= 4;
++              }
++              
++              /* i is the number of hex digits we have */
++              buffer_prepare_copy(b, i + 1);
++              
++              for (j = i-1, len = olen; j+1 > 0; j--) {
++                      b->ptr[j] = (len & 0xf) + (((len & 0xf) <= 9) ? '0' : 
'a' - 10);
++                      len >>= 4;
++              }
++              b->used = i;
++              b->ptr[b->used++] = '\0';
++      }
++              
++      buffer_append_string(b, "\r\n");
++      /*
++      chunkqueue_append_buffer(cq, b);
++      buffer_free(b);
++      */
++      
++      return 0;
++}
++
++
++int chunk_encode_append_file(chunkqueue *cq, buffer *fn, off_t offset, off_t 
len) {
++      if (!cq) return -1;
++      if (len == 0) return 0;
++      
++      chunk_encode_append_len(cq, len);
++      
++      chunkqueue_append_file(cq, fn, offset, len);
++      
++      chunkqueue_append_mem(cq, "\r\n", 2 + 1);
++      
++      return 0;
++}
++
++int chunk_encode_append_buffer(chunkqueue *cq, buffer *mem) {
++      if (!cq) return -1;
++      if (mem->used <= 1) return 0;
++      
++      chunk_encode_append_len(cq, mem->used - 1);
++      
++      chunkqueue_append_buffer(cq, mem);
++      
++      chunkqueue_append_mem(cq, "\r\n", 2 + 1);
++      
++      return 0;
++}
++
++int chunk_encode_append_mem(chunkqueue *cq, const char * mem, size_t len) {
++      if (!cq) return -1;
++      if (len <= 1) return 0;
++      
++      chunk_encode_append_len(cq, len - 1);
++      
++      chunkqueue_append_mem(cq, mem, len);
++      
++      chunkqueue_append_mem(cq, "\r\n", 2 + 1);
++      
++      return 0;
++}
++
++int chunk_encode_append_queue(chunkqueue *cq, chunkqueue *src) {
++      int len = chunkqueue_length(src);
++      if (!cq) return -1;
++      if (len == 0) return 0;
++      
++      chunk_encode_append_len(cq, len);
++      
++      chunkqueue_append_chunkqueue(cq, src);
++      
++      chunkqueue_append_mem(cq, "\r\n", 2 + 1);
++      
++      return 0;
++}
++
++int chunk_encode_end(chunkqueue *cq) {
++      chunk_encode_append_len(cq, 0);
++      chunkqueue_append_mem(cq, "\r\n", 2 + 1);
++      return 0;
++}
++
+diff -Naur lighttpd-1.4.10.orig/src/chunk_encode.h 
lighttpd-1.4.10/src/chunk_encode.h
+--- lighttpd-1.4.10.orig/src/chunk_encode.h    1969-12-31 16:00:00.000000000 
-0800
++++ lighttpd-1.4.10/src/chunk_encode.h 2006-02-16 22:25:16.506346704 -0800
+@@ -0,0 +1,13 @@
++#ifndef _CHUNK_ENCODE_H_
++#define _CHUNK_ENCODE_H_
++
++#include "server.h"
++#include <sys/types.h>
++
++int chunk_encode_append_mem(chunkqueue *cq, const char * mem, size_t len);
++int chunk_encode_append_buffer(chunkqueue *cq, buffer *mem);
++int chunk_encode_append_file(chunkqueue *cq, buffer *fn, off_t offset, off_t 
len);
++int chunk_encode_append_queue(chunkqueue *cq, chunkqueue *src);
++int chunk_encode_end(chunkqueue *cq);
++
++#endif
+diff -Naur lighttpd-1.4.10.orig/src/connections.c 
lighttpd-1.4.10/src/connections.c
+--- lighttpd-1.4.10.orig/src/connections.c     2006-02-08 04:27:20.000000000 
-0800
++++ lighttpd-1.4.10/src/connections.c  2006-02-16 22:25:16.507346536 -0800
+@@ -18,6 +18,7 @@
+ #include "response.h"
+ #include "network.h"
+ #include "http_chunk.h"
++#include "chunk_encode.h"
+ #include "stat_cache.h"
+ #include "joblist.h"
+ 
+@@ -146,6 +147,12 @@
+       return 0;
+ }
+ 
++int connection_queue_is_empty(connection *con) {
++      if(!chunkqueue_is_empty(con->write_queue)) return 0;
++      if(!chunkqueue_is_empty(con->output_queue)) return 0;
++      return 1;
++}
++
+ #if 0
+ static void dump_packet(const unsigned char *data, size_t len) {
+       size_t i, j;
+@@ -365,6 +372,7 @@
+                               con->file_finished = 1;
+ 
+                               chunkqueue_reset(con->write_queue);
++                              chunkqueue_reset(con->output_queue);
+                       }
+                       break;
+               default:
+@@ -472,12 +480,27 @@
+               /* disable chunked encoding again as we have no body */
+               con->response.transfer_encoding &= 
~HTTP_TRANSFER_ENCODING_CHUNKED;
+               chunkqueue_reset(con->write_queue);
++              chunkqueue_reset(con->output_queue);
+               
+               con->file_finished = 1;
+               break;
+       }
+       
+ 
++      /* Allow filter plugins to change response headers before they are 
written. */
++      switch(plugins_call_handle_response_start(srv, con)) {
++      case HANDLER_GO_ON:
++      case HANDLER_FINISHED:
++              /* response start is finished */
++              break;
++      default:
++              /* something strange happend */
++              log_error_write(srv, __FILE__, __LINE__, "s", "Filter plugin 
failed.");
++              connection_set_state(srv, con, CON_STATE_ERROR);
++              joblist_append(srv, con);
++              break;
++      }
++
+       if (con->file_finished) {
+               /* we have all the content and chunked encoding is not used, 
set a content-length */ 
+               
+@@ -517,6 +540,7 @@
+       
+       if (con->request.http_method == HTTP_METHOD_HEAD) {
+               chunkqueue_reset(con->write_queue);
++              chunkqueue_reset(con->output_queue);
+       }
+ 
+       http_response_write_header(srv, con);
+@@ -525,11 +549,57 @@
+ }
+ 
+ static int connection_handle_write(server *srv, connection *con) {
+-      switch(network_write_chunkqueue(srv, con, con->write_queue)) {
++      int finished = 0;
++      int len;
++
++      /* Allow filter plugins to modify response conent */
++      switch(plugins_call_handle_response_filter(srv, con)) {
++      case HANDLER_GO_ON:
++              finished = con->file_finished;
++              /* response content not changed */
++              break;
++      case HANDLER_COMEBACK:
++              /* response filter has more work */
++              finished = 0;
++              break;
++      case HANDLER_FINISHED:
++              /* response filter is finished */
++              finished = 1;
++              break;
++      default:
++              /* something strange happend */
++              log_error_write(srv, __FILE__, __LINE__, "s", "Filter plugin 
failed.");
++              connection_set_state(srv, con, CON_STATE_ERROR);
++              joblist_append(srv, con);
++              finished = 1;
++              break;
++      }
++
++      /* move chunks from write_queue to output_queue. */
++      if (con->request.http_method == HTTP_METHOD_HEAD) {
++              chunkqueue_reset(con->write_queue);
++      } else {
++              len = chunkqueue_length(con->write_queue);
++              if(con->response.transfer_encoding & 
HTTP_TRANSFER_ENCODING_CHUNKED) {
++                      chunk_encode_append_queue(con->output_queue, 
con->write_queue);
++                      if(finished && !con->end_chunk) {
++                              con->end_chunk = 1;
++                              chunk_encode_end(con->output_queue);
++                      }
++              } else {
++                      chunkqueue_append_chunkqueue(con->output_queue, 
con->write_queue);
++              }
++              con->write_queue->bytes_out += len;
++      }
++      /* write chunks from output_queue to network */
++      switch(network_write_chunkqueue(srv, con, con->output_queue)) {
+       case 0:
+-              if (con->file_finished) {
++              if (finished) {
+                       connection_set_state(srv, con, CON_STATE_RESPONSE_END);
+                       joblist_append(srv, con);
++              } else {
++                      /* not finished yet -> WRITE */
++                      con->is_writable = 1;
+               }
+               break;
+       case -1: /* error on our side */
+@@ -599,6 +669,7 @@
+       
+ #undef CLEAN
+       con->write_queue = chunkqueue_init();
++      con->output_queue = chunkqueue_init();
+       con->read_queue = chunkqueue_init();
+       con->request_content_queue = chunkqueue_init();
+       chunkqueue_set_tempdirs(con->request_content_queue, 
srv->srvconf.upload_tempdirs);
+@@ -627,6 +698,7 @@
+               connection_reset(srv, con);
+               
+               chunkqueue_free(con->write_queue);
++              chunkqueue_free(con->output_queue);
+               chunkqueue_free(con->read_queue);
+               chunkqueue_free(con->request_content_queue);
+               array_free(con->request.headers);
+@@ -681,6 +753,7 @@
+       con->http_status = 0;
+       con->file_finished = 0;
+       con->file_started = 0;
++      con->end_chunk = 0;
+       con->got_response = 0;
+       
+       con->parsed_response = 0;
+@@ -751,6 +824,7 @@
+       array_reset(con->environment);
+       
+       chunkqueue_reset(con->write_queue);
++      chunkqueue_reset(con->output_queue);
+       chunkqueue_reset(con->request_content_queue);
+ 
+       /* the plugins should cleanup themself */       
+@@ -1178,7 +1252,6 @@
+       }
+       
+       if (con->state == CON_STATE_WRITE &&
+-          !chunkqueue_is_empty(con->write_queue) &&
+           con->is_writable) {
+               
+               if (-1 == connection_handle_write(srv, con)) {
+@@ -1573,15 +1646,15 @@
+                       }
+                       
+                       /* only try to write if we have something in the queue 
*/
+-                      if (!chunkqueue_is_empty(con->write_queue)) {
+ #if 0
++                      if (!connection_queue_is_empty(con)) {
+                               log_error_write(srv, __FILE__, __LINE__, "dsd",
+                                               con->fd,
+                                               "packets to write:",
+-                                              con->write_queue->used);
+-#endif
++                                              con->output_queue->used);
+                       }
+-                      if (!chunkqueue_is_empty(con->write_queue) && 
con->is_writable) {
++#endif
++                      if (con->is_writable) {
+                               if (-1 == connection_handle_write(srv, con)) {
+                                       log_error_write(srv, __FILE__, 
__LINE__, "ds",
+                                                       con->fd,
+@@ -1691,9 +1764,9 @@
+                * - if we have data to write
+                * - if the socket is not writable yet 
+                */
+-              if (!chunkqueue_is_empty(con->write_queue) && 
+-                  (con->is_writable == 0) &&
+-                  (con->traffic_limit_reached == 0)) {
++              if ((con->is_writable == 0) &&
++                  (con->traffic_limit_reached == 0) &&
++                              !connection_queue_is_empty(con)) {
+                       fdevent_event_add(srv->ev, &(con->fde_ndx), con->fd, 
FDEVENT_OUT);
+               } else {
+                       fdevent_event_del(srv->ev, &(con->fde_ndx), con->fd);
+diff -Naur lighttpd-1.4.10.orig/src/http_chunk.c 
lighttpd-1.4.10/src/http_chunk.c
+--- lighttpd-1.4.10.orig/src/http_chunk.c      2005-08-10 15:26:50.000000000 
-0700
++++ lighttpd-1.4.10/src/http_chunk.c   2006-02-16 22:25:16.508346367 -0800
+@@ -58,16 +58,9 @@
+       
+       cq = con->write_queue;
+       
+-      if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
+-              http_chunk_append_len(srv, con, len);
+-      }
+-      
++
+       chunkqueue_append_file(cq, fn, offset, len);
+       
+-      if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED && 
len > 0) {
+-              chunkqueue_append_mem(cq, "\r\n", 2 + 1);
+-      }
+-      
+       return 0;
+ }
+ 
+@@ -78,16 +71,9 @@
+       
+       cq = con->write_queue;
+       
+-      if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
+-              http_chunk_append_len(srv, con, mem->used - 1);
+-      }
+-      
++
+       chunkqueue_append_buffer(cq, mem);
+       
+-      if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED && 
mem->used > 0) {
+-              chunkqueue_append_mem(cq, "\r\n", 2 + 1);
+-      }
+-      
+       return 0;
+ }
+ 
+@@ -99,25 +85,11 @@
+       cq = con->write_queue;
+       
+       if (len == 0) {
+-              if (con->response.transfer_encoding & 
HTTP_TRANSFER_ENCODING_CHUNKED) {
+-                      http_chunk_append_len(srv, con, 0);
+-                      chunkqueue_append_mem(cq, "\r\n", 2 + 1);
+-              } else {
+-                      chunkqueue_append_mem(cq, "", 1);
+-              }
+               return 0;
+       }
+       
+-      if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
+-              http_chunk_append_len(srv, con, len - 1);
+-      }
+-      
+       chunkqueue_append_mem(cq, mem, len);
+       
+-      if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
+-              chunkqueue_append_mem(cq, "\r\n", 2 + 1);
+-      }
+-      
+       return 0;
+ }
+ 
+diff -Naur lighttpd-1.4.10.orig/src/joblist.c lighttpd-1.4.10/src/joblist.c
+--- lighttpd-1.4.10.orig/src/joblist.c 2005-08-10 15:26:41.000000000 -0700
++++ lighttpd-1.4.10/src/joblist.c      2006-02-16 22:25:16.508346367 -0800
+@@ -7,6 +7,7 @@
+ 
+ int joblist_append(server *srv, connection *con) {
+       if (con->in_joblist) return 0;
++      con->in_joblist = 1;
+       
+       if (srv->joblist->size == 0) {
+               srv->joblist->size  = 16;
+diff -Naur lighttpd-1.4.10.orig/src/mod_deflate.c 
lighttpd-1.4.10/src/mod_deflate.c
+--- lighttpd-1.4.10.orig/src/mod_deflate.c     1969-12-31 16:00:00.000000000 
-0800
++++ lighttpd-1.4.10/src/mod_deflate.c  2006-02-17 23:26:45.885437687 -0800
+@@ -0,0 +1,1291 @@
++#include <sys/types.h>
++#include <sys/stat.h>
++
++#include <fcntl.h>
++#include <unistd.h>
++#include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <time.h>
++#include <assert.h>
++
++#include "base.h"
++#include "log.h"
++#include "buffer.h"
++#include "response.h"
++#include "joblist.h"
++#include "stat_cache.h"
++
++#include "plugin.h"
++
++#include "crc32.h"
++#include "etag.h"
++
++#if defined HAVE_ZLIB_H && defined HAVE_LIBZ
++# define USE_ZLIB
++# include <zlib.h>
++#else
++# define Z_DEFAULT_COMPRESSION 1
++#endif
++
++#if defined HAVE_BZLIB_H && defined HAVE_LIBBZ2
++# define USE_BZ2LIB
++/* we don't need stdio interface */
++# define BZ_NO_STDIO
++# include <bzlib.h>
++#endif
++
++#include "sys-mmap.h"
++
++/* request: accept-encoding */
++#define HTTP_ACCEPT_ENCODING_IDENTITY BV(0)
++#define HTTP_ACCEPT_ENCODING_GZIP     BV(1)
++#define HTTP_ACCEPT_ENCODING_DEFLATE  BV(2)
++#define HTTP_ACCEPT_ENCODING_COMPRESS BV(3)
++#define HTTP_ACCEPT_ENCODING_BZIP2    BV(4)
++
++#define KByte * 1024
++#define MByte * 1024 KByte
++#define GByte * 1024 MByte
++
++typedef struct {
++      unsigned short  debug;
++      unsigned short  enabled;
++      unsigned short  bzip2;
++      unsigned short  sync_flush;
++      unsigned short  output_buffer_size;
++      unsigned short  min_compress_size;
++      unsigned short  work_block_size;
++      short           mem_level;
++      short           compression_level;
++      short           window_size;
++      array           *mimetypes;
++} plugin_config;
++
++typedef struct {
++      PLUGIN_DATA;
++      buffer *tmp_buf;
++      
++      plugin_config **config_storage;
++      plugin_config conf; 
++} plugin_data;
++
++typedef struct {
++      int bytes_in;
++      int bytes_out;
++      chunkqueue *in_queue;
++      buffer *output;
++      /* compression type & state */
++      int compression_type;
++      int stream_open;
++#ifdef USE_ZLIB
++      unsigned long crc;
++      z_stream z;
++      unsigned short gzip_header;
++#endif
++#ifdef USE_BZ2LIB
++      bz_stream bz;
++#endif
++      plugin_data *plugin_data;
<<Diff was trimmed, longer than 597 lines>>
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to