author | Petr Sumbera <petr.sumbera@oracle.com> |
Wed, 22 Jun 2011 14:10:22 -0700 | |
changeset 331 | 5001b63ddc8a |
permissions | -rw-r--r-- |
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; |