components/lighttpd/patches/lighttpd_fix_slow_request_dos.patch
author Mike Sullivan <Mike.Sullivan@Oracle.COM>
Mon, 11 Mar 2013 10:38:09 -0700
branchs11-update
changeset 2520 ceec631e74d1
parent 331 5001b63ddc8a
permissions -rw-r--r--
Close of build 10.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
331
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     1
diff -u -r lighttpd-1.4.23-orig/src/base.h lighttpd-1.4.23/src/base.h
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     2
--- src/base.h	Thu Jun 11 02:44:17 2009
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     3
+++ src/base.h	Tue Aug 24 04:16:29 2010
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     4
@@ -421,7 +421,6 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     5
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     6
 #ifdef USE_OPENSSL
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     7
 	SSL *ssl;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     8
-	buffer *ssl_error_want_reuse_buffer;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     9
 #endif
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    10
 	/* etag handling */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    11
 	etag_flags_t etag_flags;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    12
Only in lighttpd-1.4.23/src: base.h.orig
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    13
diff -u -r lighttpd-1.4.23-orig/src/chunk.c lighttpd-1.4.23/src/chunk.c
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    14
--- src/chunk.c	Mon Mar 30 15:16:59 2009
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    15
+++ src/chunk.c	Tue Aug 24 04:12:50 2010
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    16
@@ -197,8 +197,6 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    17
 int chunkqueue_append_buffer_weak(chunkqueue *cq, buffer *mem) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    18
 	chunk *c;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    19
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    20
-	if (mem->used == 0) return 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    21
-
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    22
 	c = chunkqueue_get_unused_chunk(cq);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    23
 	c->type = MEM_CHUNK;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    24
 	c->offset = 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    25
diff -u -r lighttpd-1.4.23-orig/src/connections.c lighttpd-1.4.23/src/connections.c
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    26
--- src/connections.c	Thu Jun 11 06:54:30 2009
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    27
+++ src/connections.c	Tue Aug 24 04:12:50 2010
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    28
@@ -192,40 +192,42 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    29
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    30
 static int connection_handle_read_ssl(server *srv, connection *con) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    31
 #ifdef USE_OPENSSL
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    32
-	int r, ssl_err, len, count = 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    33
+	int r, ssl_err, len, count = 0, read_offset, toread;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    34
 	buffer *b = NULL;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    35
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    36
 	if (!con->conf.is_ssl) return -1;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    37
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    38
-	/* don't resize the buffer if we were in SSL_ERROR_WANT_* */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    39
-
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    40
 	ERR_clear_error();
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    41
 	do {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    42
-		if (!con->ssl_error_want_reuse_buffer) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    43
-			b = buffer_init();
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    44
-			buffer_prepare_copy(b, SSL_pending(con->ssl) + (16 * 1024)); /* the pending bytes + 16kb */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    45
+		if (NULL != con->read_queue->last) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    46
+			b = con->read_queue->last->mem;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    47
+		}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    48
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    49
+		if (NULL == b || b->size - b->used < 1024) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    50
+			b = chunkqueue_get_append_buffer(con->read_queue);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    51
+			len = SSL_pending(con->ssl);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    52
+			if (len < 4*1024) len = 4*1024; /* always alloc >= 4k buffer */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    53
+			buffer_prepare_copy(b, len + 1);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    54
+
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    55
 			/* overwrite everything with 0 */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    56
 			memset(b->ptr, 0, b->size);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    57
-		} else {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    58
-			b = con->ssl_error_want_reuse_buffer;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    59
 		}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    60
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    61
-		len = SSL_read(con->ssl, b->ptr, b->size - 1);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    62
-		con->ssl_error_want_reuse_buffer = NULL; /* reuse it only once */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    63
+		read_offset = (b->used > 0) ? b->used - 1 : 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    64
+		toread = b->size - 1 - read_offset;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    65
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    66
+		len = SSL_read(con->ssl, b->ptr + read_offset, toread);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    67
+
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    68
 		if (len > 0) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    69
-			b->used = len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    70
+			if (b->used > 0) b->used--;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    71
+			b->used += len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    72
 			b->ptr[b->used++] = '\0';
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    73
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    74
-		       	/* we move the buffer to the chunk-queue, no need to free it */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    75
+			con->bytes_read += len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    76
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    77
-			chunkqueue_append_buffer_weak(con->read_queue, b);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    78
 			count += len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    79
-			con->bytes_read += len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    80
-			b = NULL;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    81
 		}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    82
-	} while (len > 0 && count < MAX_READ_LIMIT);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    83
+	} while (len == toread && count < MAX_READ_LIMIT);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    84
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    85
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    86
 	if (len < 0) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    87
@@ -234,11 +236,11 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    88
 		case SSL_ERROR_WANT_READ:
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    89
 		case SSL_ERROR_WANT_WRITE:
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    90
 			con->is_readable = 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    91
-			con->ssl_error_want_reuse_buffer = b;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    92
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    93
-			b = NULL;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    94
+			/* the manual says we have to call SSL_read with the same arguments next time.
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    95
+			 * we ignore this restriction; no one has complained about it in 1.5 yet, so it probably works anyway.
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    96
+			 */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    97
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    98
-			/* we have to steal the buffer from the queue-queue */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    99
 			return 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   100
 		case SSL_ERROR_SYSCALL:
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   101
 			/**
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   102
@@ -297,16 +299,11 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   103
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   104
 		connection_set_state(srv, con, CON_STATE_ERROR);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   105
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   106
-		buffer_free(b);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   107
-
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   108
 		return -1;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   109
 	} else if (len == 0) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   110
 		con->is_readable = 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   111
 		/* the other end close the connection -> KEEP-ALIVE */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   112
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   113
-		/* pipelining */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   114
-		buffer_free(b);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   115
-
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   116
 		return -2;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   117
 	}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   118
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   119
@@ -321,26 +318,41 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   120
 static int connection_handle_read(server *srv, connection *con) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   121
 	int len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   122
 	buffer *b;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   123
-	int toread;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   124
+	int toread, read_offset;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   125
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   126
 	if (con->conf.is_ssl) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   127
 		return connection_handle_read_ssl(srv, con);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   128
 	}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   129
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   130
+	b = (NULL != con->read_queue->last) ? con->read_queue->last->mem : NULL;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   131
+
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   132
+	/* default size for chunks is 4kb; only use bigger chunks if FIONREAD tells
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   133
+	 *  us more than 4kb is available
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   134
+	 * if FIONREAD doesn't signal a big chunk we fill the previous buffer
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   135
+	 *  if it has >= 1kb free
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   136
+	 */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   137
 #if defined(__WIN32)
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   138
-	b = chunkqueue_get_append_buffer(con->read_queue);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   139
-	buffer_prepare_copy(b, 4 * 1024);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   140
-	len = recv(con->fd, b->ptr, b->size - 1, 0);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   141
-#else
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   142
-	if (ioctl(con->fd, FIONREAD, &toread) || toread == 0) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   143
+	if (NULL == b || b->size - b->used < 1024) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   144
 		b = chunkqueue_get_append_buffer(con->read_queue);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   145
 		buffer_prepare_copy(b, 4 * 1024);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   146
+	}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   147
+
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   148
+	read_offset = (b->used == 0) ? 0 : b->used - 1;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   149
+	len = recv(con->fd, b->ptr + read_offset, b->size - 1 - read_offset, 0);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   150
+#else
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   151
+	if (ioctl(con->fd, FIONREAD, &toread) || toread == 0 || toread <= 4*1024) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   152
+		if (NULL == b || b->size - b->used < 1024) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   153
+			b = chunkqueue_get_append_buffer(con->read_queue);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   154
+			buffer_prepare_copy(b, 4 * 1024);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   155
+		}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   156
 	} else {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   157
 		if (toread > MAX_READ_LIMIT) toread = MAX_READ_LIMIT;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   158
 		b = chunkqueue_get_append_buffer(con->read_queue);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   159
 		buffer_prepare_copy(b, toread + 1);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   160
 	}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   161
-	len = read(con->fd, b->ptr, b->size - 1);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   162
+
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   163
+	read_offset = (b->used == 0) ? 0 : b->used - 1;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   164
+	len = read(con->fd, b->ptr + read_offset, b->size - 1 - read_offset);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   165
 #endif
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   166
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   167
 	if (len < 0) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   168
@@ -374,7 +386,8 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   169
 		con->is_readable = 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   170
 	}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   171
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   172
-	b->used = len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   173
+	if (b->used > 0) b->used--;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   174
+	b->used += len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   175
 	b->ptr[b->used++] = '\0';
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   176
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   177
 	con->bytes_read += len;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   178
@@ -841,13 +854,6 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   179
 	/* The cond_cache gets reset in response.c */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   180
 	/* config_cond_cache_reset(srv, con); */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   181
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   182
-#ifdef USE_OPENSSL
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   183
-	if (con->ssl_error_want_reuse_buffer) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   184
-		buffer_free(con->ssl_error_want_reuse_buffer);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   185
-		con->ssl_error_want_reuse_buffer = NULL;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   186
-	}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   187
-#endif
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   188
-
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   189
 	con->header_len = 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   190
 	con->in_error_handler = 0;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   191
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   192
@@ -1131,8 +1137,15 @@
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   193
 			} else {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   194
 				buffer *b;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   195
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   196
-				b = chunkqueue_get_append_buffer(dst_cq);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   197
-				buffer_copy_string_len(b, c->mem->ptr + c->offset, toRead);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   198
+				if (dst_cq->last &&
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   199
+				    dst_cq->last->type == MEM_CHUNK) {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   200
+					b = dst_cq->last->mem;
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   201
+				} else {
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   202
+					b = chunkqueue_get_append_buffer(dst_cq);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   203
+					/* prepare buffer size for remaining POST data; is < 64kb */
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   204
+					buffer_prepare_copy(b, con->request.content_length - dst_cq->bytes_in + 1);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   205
+				}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   206
+				buffer_append_string_len(b, c->mem->ptr + c->offset, toRead);
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   207
 			}
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   208
 
5001b63ddc8a 7057442 Move Lighttpd to userland
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   209
 			c->offset += toRead;