]>
Commit | Line | Data |
---|---|---|
16489078 JB |
1 | * Updated * (the first version I added here was incomplete, sorry) |
2 | ||
3 | This patch works around a couple of problems in the stock 1.3.24 apache | |
4 | mod_proxy. The 1.3.24 version would fail to de-chunk a chunked http/1.1 | |
5 | response for an http/1.0-client, resulting in mysterious hex digits | |
6 | spread all over the returned document. Especially in a chain of proxies, | |
7 | that would lead to serious problems in the interaction between upstream | |
8 | proxies and apache, and the connections would often hang. | |
9 | ||
10 | The patch is a snapshot of the current development version 1.3.25-dev | |
11 | (as of 18-Apr-2002), and contains a lot of whitespace reformatting. | |
12 | Sorry for that, but the layout was standardized using indent, so as | |
13 | to ease future maintenance. | |
14 | ||
15 | It has been tested in an intranet environment, both using direct | |
16 | connections and ProxyRemote connections, and with both http and | |
17 | https. | |
18 | ||
19 | The patch should apply cleanly against version apache-1.3.24 | |
20 | ||
21 | If you have questions, please contact martin at apache dot org, who | |
22 | supplied this patch file. Thank you. | |
23 | ||
24 | Martin | |
25 | ||
26 | ||
27 | How-to-apply: | |
28 | ||
29 | $ gzip -dc apache_1.3.24.tar.gz | tar xvf - | |
30 | $ cd apache_1.3.24/src | |
31 | $ patch -p0 </tmp/proxy_http1.1_chunking.patch | |
32 | ||
33 | ||
34 | Index: main/http_protocol.c | |
35 | =================================================================== | |
36 | RCS file: /home/cvs/apache-1.3/src/main/http_protocol.c,v | |
37 | retrieving revision 1.312 | |
38 | retrieving revision 1.314 | |
39 | diff -u -b -u -r1.312 -r1.314 | |
40 | --- main/http_protocol.c 21 Mar 2002 14:49:46 -0000 1.312 | |
41 | +++ main/http_protocol.c 6 Apr 2002 14:31:05 -0000 1.314 | |
42 | @@ -857,13 +857,13 @@ | |
43 | * then the actual input line exceeded the buffer length, | |
44 | * and it would be a good idea for the caller to puke 400 or 414. | |
45 | */ | |
46 | -static int getline(char *s, int n, BUFF *in, int fold) | |
47 | +API_EXPORT(int) ap_getline(char *s, int n, BUFF *in, int fold) | |
48 | { | |
49 | char *pos, next; | |
50 | int retval; | |
51 | int total = 0; | |
52 | #ifdef CHARSET_EBCDIC | |
53 | - /* When getline() is called, the HTTP protocol is in a state | |
54 | + /* When ap_getline() is called, the HTTP protocol is in a state | |
55 | * where we MUST be reading "plain text" protocol stuff, | |
56 | * (Request line, MIME headers, Chunk sizes) regardless of | |
57 | * the MIME type and conversion setting of the document itself. | |
58 | @@ -978,7 +978,7 @@ | |
59 | ||
60 | static int read_request_line(request_rec *r) | |
61 | { | |
62 | - char l[DEFAULT_LIMIT_REQUEST_LINE + 2]; /* getline's two extra for \n\0 */ | |
63 | + char l[DEFAULT_LIMIT_REQUEST_LINE + 2]; /* ap_getline's two extra for \n\0 */ | |
64 | const char *ll = l; | |
65 | const char *uri; | |
66 | conn_rec *conn = r->connection; | |
67 | @@ -1000,7 +1000,7 @@ | |
68 | * have to block during a read. | |
69 | */ | |
70 | ap_bsetflag(conn->client, B_SAFEREAD, 1); | |
71 | - while ((len = getline(l, sizeof(l), conn->client, 0)) <= 0) { | |
72 | + while ((len = ap_getline(l, sizeof(l), conn->client, 0)) <= 0) { | |
73 | if ((len < 0) || ap_bgetflag(conn->client, B_EOF)) { | |
74 | ap_bsetflag(conn->client, B_SAFEREAD, 0); | |
75 | /* this is a hack to make sure that request time is set, | |
76 | @@ -1031,7 +1031,7 @@ | |
77 | ||
78 | ap_parse_uri(r, uri); | |
79 | ||
80 | - /* getline returns (size of max buffer - 1) if it fills up the | |
81 | + /* ap_getline returns (size of max buffer - 1) if it fills up the | |
82 | * buffer before finding the end-of-line. This is only going to | |
83 | * happen if it exceeds the configured limit for a request-line. | |
84 | */ | |
85 | @@ -1056,7 +1056,7 @@ | |
86 | ||
87 | static void get_mime_headers(request_rec *r) | |
88 | { | |
89 | - char field[DEFAULT_LIMIT_REQUEST_FIELDSIZE + 2]; /* getline's two extra */ | |
90 | + char field[DEFAULT_LIMIT_REQUEST_FIELDSIZE + 2]; /* ap_getline's two extra */ | |
91 | conn_rec *c = r->connection; | |
92 | char *value; | |
93 | char *copy; | |
94 | @@ -1071,7 +1071,7 @@ | |
95 | * Read header lines until we get the empty separator line, a read error, | |
96 | * the connection closes (EOF), reach the server limit, or we timeout. | |
97 | */ | |
98 | - while ((len = getline(field, sizeof(field), c->client, 1)) > 0) { | |
99 | + while ((len = ap_getline(field, sizeof(field), c->client, 1)) > 0) { | |
100 | ||
101 | if (r->server->limit_req_fields && | |
102 | (++fields_read > r->server->limit_req_fields)) { | |
103 | @@ -1081,7 +1081,7 @@ | |
104 | "this server's limit.<P>\n"); | |
105 | return; | |
106 | } | |
107 | - /* getline returns (size of max buffer - 1) if it fills up the | |
108 | + /* ap_getline returns (size of max buffer - 1) if it fills up the | |
109 | * buffer before finding the end-of-line. This is only going to | |
110 | * happen if it exceeds the configured limit for a field size. | |
111 | */ | |
112 | @@ -1513,7 +1513,6 @@ | |
113 | API_EXPORT(void) ap_basic_http_header(request_rec *r) | |
114 | { | |
115 | char *protocol; | |
116 | - const char *server; | |
117 | ||
118 | if (r->assbackwards) | |
119 | return; | |
120 | @@ -1542,11 +1541,14 @@ | |
121 | /* output the date header */ | |
122 | ap_send_header_field(r, "Date", ap_gm_timestr_822(r->pool, r->request_time)); | |
123 | ||
124 | - /* keep a previously set server header (possible from proxy), otherwise | |
125 | + /* keep the set-by-proxy server header, otherwise | |
126 | * generate a new server header */ | |
127 | - if (server = ap_table_get(r->headers_out, "Server")) { | |
128 | + if (r->proxyreq) { | |
129 | + const char *server = ap_table_get(r->headers_out, "Server"); | |
130 | + if (server) { | |
131 | ap_send_header_field(r, "Server", server); | |
132 | } | |
133 | + } | |
134 | else { | |
135 | ap_send_header_field(r, "Server", ap_get_server_version()); | |
136 | } | |
137 | @@ -2016,7 +2018,7 @@ | |
138 | return 1; | |
139 | } | |
140 | ||
141 | -static long get_chunk_size(char *b) | |
142 | +API_EXPORT(long) ap_get_chunk_size(char *b) | |
143 | { | |
144 | long chunksize = 0; | |
145 | ||
146 | @@ -2098,14 +2100,14 @@ | |
147 | ||
148 | if (r->remaining == 0) { /* Start of new chunk */ | |
149 | ||
150 | - chunk_start = getline(buffer, bufsiz, r->connection->client, 0); | |
151 | + chunk_start = ap_getline(buffer, bufsiz, r->connection->client, 0); | |
152 | if ((chunk_start <= 0) || (chunk_start >= (bufsiz - 1)) | |
153 | || !ap_isxdigit(*buffer)) { | |
154 | r->connection->keepalive = -1; | |
155 | return -1; | |
156 | } | |
157 | ||
158 | - len_to_read = get_chunk_size(buffer); | |
159 | + len_to_read = ap_get_chunk_size(buffer); | |
160 | ||
161 | if (len_to_read == 0) { /* Last chunk indicated, get footers */ | |
162 | if (r->read_body == REQUEST_CHUNKED_DECHUNK) { | |
163 | @@ -2139,7 +2141,7 @@ | |
164 | len_read = chunk_start; | |
165 | ||
166 | while ((bufsiz > 1) && ((len_read = | |
167 | - getline(buffer, bufsiz, r->connection->client, 1)) > 0)) { | |
168 | + ap_getline(buffer, bufsiz, r->connection->client, 1)) > 0)) { | |
169 | ||
170 | if (len_read != (bufsiz - 1)) { | |
171 | buffer[len_read++] = CR; /* Restore footer line end */ | |
172 | Index: modules/proxy/mod_proxy.c | |
173 | =================================================================== | |
174 | RCS file: /home/cvs/apache-1.3/src/modules/proxy/mod_proxy.c,v | |
175 | retrieving revision 1.80 | |
176 | retrieving revision 1.81 | |
177 | diff -u -b -u -r1.80 -r1.81 | |
178 | --- modules/proxy/mod_proxy.c 13 Mar 2002 21:05:32 -0000 1.80 | |
179 | +++ modules/proxy/mod_proxy.c 25 Mar 2002 09:21:58 -0000 1.81 | |
180 | @@ -99,8 +99,9 @@ | |
181 | ||
182 | while (aliasp < end_fakename) { | |
183 | if (*aliasp == '/') { | |
184 | - /* any number of '/' in the alias matches any number in | |
185 | - * the supplied URI, but there must be at least one... | |
186 | + /* | |
187 | + * any number of '/' in the alias matches any number in the | |
188 | + * supplied URI, but there must be at least one... | |
189 | */ | |
190 | if (*urip != '/') | |
191 | return 0; | |
192 | @@ -122,9 +123,9 @@ | |
193 | if (aliasp[-1] != '/' && *urip != '\0' && *urip != '/') | |
194 | return 0; | |
195 | ||
196 | - /* Return number of characters from URI which matched (may be | |
197 | - * greater than length of alias, since we may have matched | |
198 | - * doubled slashes) | |
199 | + /* | |
200 | + * Return number of characters from URI which matched (may be greater | |
201 | + * than length of alias, since we may have matched doubled slashes) | |
202 | */ | |
203 | ||
204 | return urip - uri; | |
205 | @@ -146,7 +147,7 @@ | |
206 | void *sconf = r->server->module_config; | |
207 | proxy_server_conf *conf; | |
208 | ||
209 | - conf = (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
210 | + conf = (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
211 | ||
212 | if (conf->req && r->parsed_uri.scheme) { | |
213 | /* but it might be something vhosted */ | |
214 | @@ -176,20 +177,22 @@ | |
215 | { | |
216 | void *sconf = r->server->module_config; | |
217 | proxy_server_conf *conf = | |
218 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
219 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
220 | int i, len; | |
221 | - struct proxy_alias *ent = (struct proxy_alias *) conf->aliases->elts; | |
222 | + struct proxy_alias *ent = (struct proxy_alias *)conf->aliases->elts; | |
223 | ||
224 | if (r->proxyreq != NOT_PROXY) { | |
225 | - /* someone has already set up the proxy, it was possibly ourselves | |
226 | - * in proxy_detect | |
227 | + /* | |
228 | + * someone has already set up the proxy, it was possibly ourselves in | |
229 | + * proxy_detect | |
230 | */ | |
231 | return OK; | |
232 | } | |
233 | ||
234 | - /* XXX: since r->uri has been manipulated already we're not really | |
235 | - * compliant with RFC1945 at this point. But this probably isn't | |
236 | - * an issue because this is a hybrid proxy/origin server. | |
237 | + /* | |
238 | + * XXX: since r->uri has been manipulated already we're not really | |
239 | + * compliant with RFC1945 at this point. But this probably isn't an | |
240 | + * issue because this is a hybrid proxy/origin server. | |
241 | */ | |
242 | ||
243 | for (i = 0; i < conf->aliases->nelts; i++) { | |
244 | @@ -272,7 +275,7 @@ | |
245 | UNP_REVEALPASSWORD); | |
246 | ||
247 | ap_table_set(r->headers_out, "Location", nuri); | |
248 | - ap_log_rerror(APLOG_MARK, APLOG_INFO|APLOG_NOERRNO, r, | |
249 | + ap_log_rerror(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, r, | |
250 | "Domain missing: %s sent to %s%s%s", r->uri, | |
251 | ap_unparse_uri_components(r->pool, &r->parsed_uri, | |
252 | UNP_OMITUSERINFO), | |
253 | @@ -289,7 +292,7 @@ | |
254 | char *url, *scheme, *p; | |
255 | void *sconf = r->server->module_config; | |
256 | proxy_server_conf *conf = | |
257 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
258 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
259 | array_header *proxies = conf->proxies; | |
260 | struct proxy_remote *ents = (struct proxy_remote *) proxies->elts; | |
261 | int i, rc; | |
262 | @@ -313,7 +316,7 @@ | |
263 | return OK; | |
264 | } | |
265 | ap_table_setn(r->headers_in, "Max-Forwards", | |
266 | - ap_psprintf(r->pool, "%ld", (maxfwd > 0) ? maxfwd-1 : 0)); | |
267 | + ap_psprintf(r->pool, "%ld", (maxfwd > 0) ? maxfwd - 1 : 0)); | |
268 | } | |
269 | ||
270 | if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR))) | |
271 | @@ -343,16 +346,16 @@ | |
272 | /* Check URI's destination host against NoProxy hosts */ | |
273 | /* Bypass ProxyRemote server lookup if configured as NoProxy */ | |
274 | /* we only know how to handle communication to a proxy via http */ | |
275 | - /*if (strcasecmp(scheme, "http") == 0) */ | |
276 | + /* if (strcasecmp(scheme, "http") == 0) */ | |
277 | { | |
278 | int ii; | |
279 | - struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts; | |
280 | + struct dirconn_entry *list = (struct dirconn_entry *)conf->dirconn->elts; | |
281 | ||
282 | for (direct_connect = ii = 0; ii < conf->dirconn->nelts && !direct_connect; ii++) { | |
283 | direct_connect = list[ii].matcher(&list[ii], r); | |
284 | } | |
285 | #if DEBUGGING | |
286 | - ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r, | |
287 | + ap_log_rerror(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r, | |
288 | (direct_connect) ? "NoProxy for %s" : "UseProxy for %s", | |
289 | r->uri); | |
290 | #endif | |
291 | @@ -367,8 +370,9 @@ | |
292 | (p == NULL && strcasecmp(scheme, ents[i].scheme) == 0) || | |
293 | (p != NULL && | |
294 | strncasecmp(url, ents[i].scheme, strlen(ents[i].scheme)) == 0)) { | |
295 | - /* CONNECT is a special method that bypasses the normal | |
296 | - * proxy code. | |
297 | + /* | |
298 | + * CONNECT is a special method that bypasses the normal proxy | |
299 | + * code. | |
300 | */ | |
301 | if (r->method_number == M_CONNECT) | |
302 | rc = ap_proxy_connect_handler(r, cr, url, ents[i].hostname, | |
303 | @@ -422,7 +426,8 @@ | |
304 | ps->viaopt_set = 0; /* 0 means default */ | |
305 | ps->req = 0; | |
306 | ps->req_set = 0; | |
307 | - ps->recv_buffer_size = 0; /* this default was left unset for some reason */ | |
308 | + ps->recv_buffer_size = 0; /* this default was left unset for some | |
309 | + * reason */ | |
310 | ps->recv_buffer_size_set = 0; | |
311 | ps->io_buffer_size = IOBUFSIZE; | |
312 | ps->io_buffer_size_set = 0; | |
313 | @@ -454,8 +459,8 @@ | |
314 | void *overridesv) | |
315 | { | |
316 | proxy_server_conf *ps = ap_pcalloc(p, sizeof(proxy_server_conf)); | |
317 | - proxy_server_conf *base = (proxy_server_conf *) basev; | |
318 | - proxy_server_conf *overrides = (proxy_server_conf *) overridesv; | |
319 | + proxy_server_conf *base = (proxy_server_conf *)basev; | |
320 | + proxy_server_conf *overrides = (proxy_server_conf *)overridesv; | |
321 | ||
322 | ps->proxies = ap_append_arrays(p, base->proxies, overrides->proxies); | |
323 | ps->aliases = ap_append_arrays(p, base->aliases, overrides->aliases); | |
324 | @@ -490,7 +495,7 @@ | |
325 | { | |
326 | server_rec *s = cmd->server; | |
327 | proxy_server_conf *conf = | |
328 | - (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module); | |
329 | + (proxy_server_conf *)ap_get_module_config(s->module_config, &proxy_module); | |
330 | struct proxy_remote *new; | |
331 | char *p, *q; | |
332 | int port; | |
333 | @@ -532,7 +537,7 @@ | |
334 | { | |
335 | server_rec *s = cmd->server; | |
336 | proxy_server_conf *conf = | |
337 | - (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module); | |
338 | + (proxy_server_conf *)ap_get_module_config(s->module_config, &proxy_module); | |
339 | struct proxy_alias *new; | |
340 | ||
341 | new = ap_push_array(conf->aliases); | |
342 | @@ -579,7 +584,10 @@ | |
343 | new->name = arg; | |
344 | /* Don't do name lookups on things that aren't dotted */ | |
345 | if (strchr(arg, '.') != NULL && ap_proxy_host2addr(new->name, &hp) == NULL) | |
346 | - /*@@@FIXME: This copies only the first of (possibly many) IP addrs */ | |
347 | + /* | |
348 | + * @@@FIXME: This copies only the first of (possibly many) IP | |
349 | + * addrs | |
350 | + */ | |
351 | memcpy(&new->addr, hp.h_addr, sizeof(struct in_addr)); | |
352 | else | |
353 | new->addr.s_addr = 0; | |
354 | @@ -616,7 +624,7 @@ | |
355 | proxy_server_conf *conf = | |
356 | ap_get_module_config(s->module_config, &proxy_module); | |
357 | struct dirconn_entry *New; | |
358 | - struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts; | |
359 | + struct dirconn_entry *list = (struct dirconn_entry *)conf->dirconn->elts; | |
360 | int found = 0; | |
361 | int i; | |
362 | ||
363 | @@ -733,7 +741,7 @@ | |
364 | ||
365 | if (sscanf(arg, "%lg", &val) != 1) | |
366 | return "CacheMaxExpire value must be a float"; | |
367 | - psf->cache.maxexpire = (int) (val * (double) SEC_ONE_HR); | |
368 | + psf->cache.maxexpire = (int)(val * (double)SEC_ONE_HR); | |
369 | psf->cache.maxexpire_set = 1; | |
370 | return NULL; | |
371 | } | |
372 | @@ -747,7 +755,7 @@ | |
373 | ||
374 | if (sscanf(arg, "%lg", &val) != 1) | |
375 | return "CacheDefaultExpire value must be a float"; | |
376 | - psf->cache.defaultexpire = (int) (val * (double) SEC_ONE_HR); | |
377 | + psf->cache.defaultexpire = (int)(val * (double)SEC_ONE_HR); | |
378 | psf->cache.defaultexpire_set = 1; | |
379 | return NULL; | |
380 | } | |
381 | @@ -761,7 +769,7 @@ | |
382 | ||
383 | if (sscanf(arg, "%lg", &val) != 1) | |
384 | return "CacheGcInterval value must be a float"; | |
385 | - psf->cache.gcinterval = (int) (val * (double) SEC_ONE_HR); | |
386 | + psf->cache.gcinterval = (int)(val * (double)SEC_ONE_HR); | |
387 | psf->cache.gcinterval_set = 1; | |
388 | return NULL; | |
389 | } | |
390 | @@ -823,7 +831,10 @@ | |
391 | new->name = arg; | |
392 | /* Don't do name lookups on things that aren't dotted */ | |
393 | if (strchr(arg, '.') != NULL && ap_proxy_host2addr(new->name, &hp) == NULL) | |
394 | - /*@@@FIXME: This copies only the first of (possibly many) IP addrs */ | |
395 | + /* | |
396 | + * @@@FIXME: This copies only the first of (possibly many) IP | |
397 | + * addrs | |
398 | + */ | |
399 | memcpy(&new->addr, hp.h_addr, sizeof(struct in_addr)); | |
400 | else | |
401 | new->addr.s_addr = 0; | |
402 | @@ -858,7 +869,7 @@ | |
403 | return NULL; | |
404 | } | |
405 | ||
406 | -static const char* | |
407 | +static const char * | |
408 | set_cache_completion(cmd_parms *parms, void *dummy, char *arg) | |
409 | { | |
410 | proxy_server_conf *psf = | |
411 | @@ -876,7 +887,7 @@ | |
412 | return NULL; | |
413 | } | |
414 | ||
415 | -static const char* | |
416 | +static const char * | |
417 | set_via_opt(cmd_parms *parms, void *dummy, char *arg) | |
418 | { | |
419 | proxy_server_conf *psf = | |
420 | @@ -974,5 +985,3 @@ | |
421 | NULL, /* child_exit */ | |
422 | proxy_detect /* post read-request */ | |
423 | }; | |
424 | - | |
425 | - | |
426 | Index: modules/proxy/mod_proxy.h | |
427 | =================================================================== | |
428 | RCS file: /home/cvs/apache-1.3/src/modules/proxy/mod_proxy.h,v | |
429 | retrieving revision 1.57 | |
430 | retrieving revision 1.58 | |
431 | diff -u -b -u -r1.57 -r1.58 | |
432 | --- modules/proxy/mod_proxy.h 13 Mar 2002 21:05:32 -0000 1.57 | |
433 | +++ modules/proxy/mod_proxy.h 7 Apr 2002 18:57:36 -0000 1.58 | |
434 | @@ -297,7 +297,7 @@ | |
435 | char **passwordp, char **hostp, int *port); | |
436 | const char *ap_proxy_date_canon(pool *p, const char *x); | |
437 | table *ap_proxy_read_headers(request_rec *r, char *buffer, int size, BUFF *f); | |
438 | -long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c, off_t len, int nowrite, size_t recv_buffer_size); | |
439 | +long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c, off_t len, int nowrite, int chunked, size_t recv_buffer_size); | |
440 | void ap_proxy_write_headers(cache_req *c, const char *respline, table *t); | |
441 | int ap_proxy_liststr(const char *list, const char *key, char **val); | |
442 | void ap_proxy_hash(const char *it, char *val, int ndepth, int nlength); | |
443 | Index: modules/proxy/proxy_cache.c | |
444 | =================================================================== | |
445 | RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_cache.c,v | |
446 | retrieving revision 1.81 | |
447 | retrieving revision 1.86 | |
448 | diff -u -b -u -r1.81 -r1.86 | |
449 | --- modules/proxy/proxy_cache.c 13 Mar 2002 21:05:32 -0000 1.81 | |
450 | +++ modules/proxy/proxy_cache.c 12 Apr 2002 12:34:46 -0000 1.86 | |
451 | @@ -135,14 +135,14 @@ | |
452 | { | |
453 | static int inside = 0; | |
454 | ||
455 | - (void) ap_acquire_mutex(garbage_mutex); | |
456 | + (void)ap_acquire_mutex(garbage_mutex); | |
457 | if (inside == 1) { | |
458 | - (void) ap_release_mutex(garbage_mutex); | |
459 | + (void)ap_release_mutex(garbage_mutex); | |
460 | return; | |
461 | } | |
462 | else | |
463 | inside = 1; | |
464 | - (void) ap_release_mutex(garbage_mutex); | |
465 | + (void)ap_release_mutex(garbage_mutex); | |
466 | ||
467 | ap_block_alarms(); /* avoid SIGALRM on big cache cleanup */ | |
468 | if (should_proxy_garbage_coll(r)) | |
469 | @@ -153,14 +153,13 @@ | |
470 | #endif | |
471 | ap_unblock_alarms(); | |
472 | ||
473 | - (void) ap_acquire_mutex(garbage_mutex); | |
474 | + (void)ap_acquire_mutex(garbage_mutex); | |
475 | inside = 0; | |
476 | - (void) ap_release_mutex(garbage_mutex); | |
477 | + (void)ap_release_mutex(garbage_mutex); | |
478 | } | |
479 | ||
480 | ||
481 | -static void | |
482 | -add_long61 (long61_t *accu, long val) | |
483 | +static void add_long61(long61_t *accu, long val) | |
484 | { | |
485 | /* Add in lower 30 bits */ | |
486 | accu->lower += (val & 0x3FFFFFFFL); | |
487 | @@ -170,8 +169,7 @@ | |
488 | accu->lower &= 0x3FFFFFFFL; | |
489 | } | |
490 | ||
491 | -static void | |
492 | -sub_long61 (long61_t *accu, long val) | |
493 | +static void sub_long61(long61_t *accu, long val) | |
494 | { | |
495 | int carry = (val & 0x3FFFFFFFL) > accu->lower; | |
496 | /* Subtract lower 30 bits */ | |
497 | @@ -185,8 +183,7 @@ | |
498 | * return 0 when left == right | |
499 | * return >0 when left > right | |
500 | */ | |
501 | -static long | |
502 | -cmp_long61 (long61_t *left, long61_t *right) | |
503 | +static long cmp_long61(long61_t *left, long61_t *right) | |
504 | { | |
505 | return (left->upper == right->upper) ? (left->lower - right->lower) | |
506 | : (left->upper - right->upper); | |
507 | @@ -282,7 +279,7 @@ | |
508 | { | |
509 | void *sconf = r->server->module_config; | |
510 | proxy_server_conf *pconf = | |
511 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
512 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
513 | const struct cache_conf *conf = &pconf->cache; | |
514 | ||
515 | const char *cachedir = conf->root; | |
516 | @@ -295,27 +292,29 @@ | |
517 | if (cachedir == NULL || every == -1) | |
518 | return 0; | |
519 | ||
520 | - filename = ap_palloc(r->pool, strlen(cachedir) + strlen( DOT_TIME ) +1); | |
521 | + filename = ap_palloc(r->pool, strlen(cachedir) + strlen(DOT_TIME) + 1); | |
522 | ||
523 | garbage_now = time(NULL); | |
524 | - /* Usually, the modification time of <cachedir>/.time can only increase. | |
525 | + /* | |
526 | + * Usually, the modification time of <cachedir>/.time can only increase. | |
527 | * Thus, even with several child processes having their own copy of | |
528 | - * lastcheck, if time(NULL) still < lastcheck then it's not time | |
529 | - * for GC yet. | |
530 | + * lastcheck, if time(NULL) still < lastcheck then it's not time for GC | |
531 | + * yet. | |
532 | */ | |
533 | if (garbage_now != -1 && lastcheck != BAD_DATE && garbage_now < lastcheck + every) | |
534 | return 0; | |
535 | ||
536 | - strcpy(filename,cachedir); | |
537 | - strcat(filename,DOT_TIME); | |
538 | + strcpy(filename, cachedir); | |
539 | + strcat(filename, DOT_TIME); | |
540 | ||
541 | - /* At this point we have a bit of an engineering compromise. We could either | |
542 | - * create and/or mark the .time file (prior to the fork which might | |
543 | - * fail on a resource issue) or wait until we are safely forked. The | |
544 | - * advantage of doing it now in this process is that we get some | |
545 | - * usefull live out of the global last check variable. (XXX which | |
546 | - * should go scoreboard IMHO.) Note that the actual counting is | |
547 | - * at a later moment. | |
548 | + /* | |
549 | + * At this point we have a bit of an engineering compromise. We could | |
550 | + * either create and/or mark the .time file (prior to the fork which | |
551 | + * might fail on a resource issue) or wait until we are safely forked. | |
552 | + * The advantage of doing it now in this process is that we get some | |
553 | + * usefull live out of the global last check variable. (XXX which should | |
554 | + * go scoreboard IMHO.) Note that the actual counting is at a later | |
555 | + * moment. | |
556 | */ | |
557 | if (stat(filename, &buf) == -1) { /* does not exist */ | |
558 | if (errno != ENOENT) { | |
559 | @@ -351,7 +350,7 @@ | |
560 | const char *cachedir; | |
561 | void *sconf = r->server->module_config; | |
562 | proxy_server_conf *pconf = | |
563 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
564 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
565 | const struct cache_conf *conf = &pconf->cache; | |
566 | array_header *files; | |
567 | struct gc_ent *fent; | |
568 | @@ -372,9 +371,9 @@ | |
569 | sub_garbage_coll(r, files, cachedir, "/"); | |
570 | ||
571 | if (cmp_long61(&curbytes, &cachesize) < 0L) { | |
572 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
573 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
574 | "proxy GC: Cache is %ld%% full (nothing deleted)", | |
575 | - (long)(((curbytes.upper<<20)|(curbytes.lower>>10))*100/conf->space)); | |
576 | + (long)(((curbytes.upper << 20) | (curbytes.lower >> 10)) * 100 / conf->space)); | |
577 | ap_unblock_alarms(); | |
578 | return; | |
579 | } | |
580 | @@ -385,7 +384,7 @@ | |
581 | for (i = 0; i < files->nelts; i++) { | |
582 | fent = &((struct gc_ent *) files->elts)[i]; | |
583 | sprintf(filename, "%s%s", cachedir, fent->file); | |
584 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "GC Unlinking %s (expiry %ld, garbage_now %ld)", filename, (long)fent->expire, (long)garbage_now); | |
585 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "GC Unlinking %s (expiry %ld, garbage_now %ld)", filename, (long)fent->expire, (long)garbage_now); | |
586 | #if TESTING | |
587 | fprintf(stderr, "Would unlink %s\n", filename); | |
588 | #else | |
589 | @@ -403,16 +402,16 @@ | |
590 | } | |
591 | } | |
592 | ||
593 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
594 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
595 | "proxy GC: Cache is %ld%% full (%d deleted)", | |
596 | - (long)(((curbytes.upper<<20)|(curbytes.lower>>10))*100/conf->space), i); | |
597 | + (long)(((curbytes.upper << 20) | (curbytes.lower >> 10)) * 100 / conf->space), i); | |
598 | ap_unblock_alarms(); | |
599 | } | |
600 | ||
601 | static int sub_garbage_coll(request_rec *r, array_header *files, | |
602 | const char *cachebasedir, const char *cachesubdir) | |
603 | { | |
604 | - char line[17*(3)]; | |
605 | + char line[17 * (3)]; | |
606 | char cachedir[HUGE_STRING_LEN]; | |
607 | struct stat buf; | |
608 | int fd, i; | |
609 | @@ -428,7 +427,7 @@ | |
610 | ||
611 | ap_snprintf(cachedir, sizeof(cachedir), "%s%s", cachebasedir, cachesubdir); | |
612 | filename = ap_palloc(r->pool, strlen(cachedir) + HASH_LEN + 2); | |
613 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "GC Examining directory %s", cachedir); | |
614 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "GC Examining directory %s", cachedir); | |
615 | dir = opendir(cachedir); | |
616 | if (dir == NULL) { | |
617 | ap_log_error(APLOG_MARK, APLOG_ERR, r->server, | |
618 | @@ -440,7 +439,7 @@ | |
619 | if (ent->d_name[0] == '.') | |
620 | continue; | |
621 | sprintf(filename, "%s%s", cachedir, ent->d_name); | |
622 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "GC Examining file %s", filename); | |
623 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "GC Examining file %s", filename); | |
624 | /* is it a temporary file? */ | |
625 | if (strncmp(ent->d_name, "tmp", 3) == 0) { | |
626 | /* then stat it to see how old it is; delete temporary files > 1 day old */ | |
627 | @@ -451,8 +450,8 @@ | |
628 | } | |
629 | else if (garbage_now != -1 && buf.st_atime < garbage_now - SEC_ONE_DAY && | |
630 | buf.st_mtime < garbage_now - SEC_ONE_DAY) { | |
631 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "GC unlink %s", filename); | |
632 | - ap_log_error(APLOG_MARK, APLOG_INFO|APLOG_NOERRNO, r->server, | |
633 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "GC unlink %s", filename); | |
634 | + ap_log_error(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, r->server, | |
635 | "proxy gc: deleting orphaned cache file %s", filename); | |
636 | #if TESTING | |
637 | fprintf(stderr, "Would unlink %s\n", filename); | |
638 | @@ -472,15 +471,16 @@ | |
639 | #if defined(OS2) || defined(TPF) | |
640 | /* is it a directory? */ | |
641 | #ifdef OS2 | |
642 | - if (ent->d_attr & A_DIR) { | |
643 | + if (ent->d_attr & A_DIR) | |
644 | #elif defined(TPF) | |
645 | if (stat(filename, &buf) == -1) { | |
646 | if (errno != ENOENT) | |
647 | ap_log_error(APLOG_MARK, APLOG_ERR, r->server, | |
648 | "proxy gc: stat(%s)", filename); | |
649 | } | |
650 | - if (S_ISDIR(buf.st_mode)) { | |
651 | + if (S_ISDIR(buf.st_mode)) | |
652 | #endif | |
653 | + { | |
654 | char newcachedir[HUGE_STRING_LEN]; | |
655 | ap_snprintf(newcachedir, sizeof(newcachedir), | |
656 | "%s%s/", cachesubdir, ent->d_name); | |
657 | @@ -500,9 +500,9 @@ | |
658 | ||
659 | /* read the file */ | |
660 | #if defined(WIN32) | |
661 | - /* On WIN32 open does not work for directories, | |
662 | - * so we us stat instead of fstat to determine | |
663 | - * if the file is a directory | |
664 | + /* | |
665 | + * On WIN32 open does not work for directories, so we us stat instead | |
666 | + * of fstat to determine if the file is a directory | |
667 | */ | |
668 | if (stat(filename, &buf) == -1) { | |
669 | ap_log_error(APLOG_MARK, APLOG_ERR, r->server, | |
670 | @@ -545,7 +545,8 @@ | |
671 | rmdir(newcachedir); | |
672 | #endif | |
673 | --nfiles; | |
674 | - } else { | |
675 | + } | |
676 | + else { | |
677 | /* Directory is not empty. Account for its size: */ | |
678 | add_long61(&curbytes, ROUNDUP2BLOCKS(buf.st_size)); | |
679 | } | |
680 | @@ -554,7 +555,8 @@ | |
681 | #endif | |
682 | ||
683 | #if defined(WIN32) | |
684 | - /* Since we have determined above that the file is not a directory, | |
685 | + /* | |
686 | + * Since we have determined above that the file is not a directory, | |
687 | * it should be safe to open it now | |
688 | */ | |
689 | fd = open(filename, O_RDONLY | O_BINARY); | |
690 | @@ -566,7 +568,7 @@ | |
691 | } | |
692 | #endif | |
693 | ||
694 | - i = read(fd, line, 17*(3)-1); | |
695 | + i = read(fd, line, 17 * (3) - 1); | |
696 | close(fd); | |
697 | if (i == -1) { | |
698 | ap_log_error(APLOG_MARK, APLOG_ERR, r->server, | |
699 | @@ -574,13 +576,13 @@ | |
700 | continue; | |
701 | } | |
702 | line[i] = '\0'; | |
703 | - garbage_expire = ap_proxy_hex2sec(line + 17*(2)); | |
704 | + garbage_expire = ap_proxy_hex2sec(line + 17 * (2)); | |
705 | if (!ap_checkmask(line, "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&") || | |
706 | garbage_expire == BAD_DATE) { | |
707 | /* bad file */ | |
708 | if (garbage_now != -1 && buf.st_atime > garbage_now + SEC_ONE_DAY && | |
709 | buf.st_mtime > garbage_now + SEC_ONE_DAY) { | |
710 | - ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server, | |
711 | + ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, r->server, | |
712 | "proxy: deleting bad cache file with future date: %s", filename); | |
713 | #if TESTING | |
714 | fprintf(stderr, "Would unlink bad file %s\n", filename); | |
715 | @@ -632,29 +634,28 @@ | |
716 | ||
717 | /* read the data from the cache file */ | |
718 | ||
719 | - /* Format: | |
720 | + /* | |
721 | + * Format: | |
722 | * | |
723 | - * The cache needs to keep track of the following information: | |
724 | - * - Date, LastMod, Version, ReqTime, RespTime, ContentLength | |
725 | - * - The original request headers (for Vary) | |
726 | - * - The original response headers (for returning with a cached response) | |
727 | - * - The body of the message | |
728 | - * | |
729 | - * date SP lastmod SP expire SP count SP request-time SP response-time SP content-lengthCRLF | |
730 | - * (dates are stored as hex seconds since 1970) | |
731 | - * Original URLCRLF | |
732 | - * Original Request Headers | |
733 | - * CRLF | |
734 | - * Original Response Headers | |
735 | - * CRLF | |
736 | - * Body | |
737 | + * The cache needs to keep track of the following information: - Date, | |
738 | + * LastMod, Version, ReqTime, RespTime, ContentLength - The original | |
739 | + * request headers (for Vary) - The original response headers (for | |
740 | + * returning with a cached response) - The body of the message | |
741 | + * | |
742 | + * date SP lastmod SP expire SP count SP request-time SP response-time SP | |
743 | + * content-lengthCRLF (dates are stored as hex seconds since 1970) | |
744 | + * Original URLCRLF Original Request Headers CRLF Original Response | |
745 | + * Headers CRLF Body | |
746 | * | |
747 | */ | |
748 | ||
749 | /* retrieve cachefile information values */ | |
750 | len = ap_bgets(urlbuff, sizeof urlbuff, cachefp); | |
751 | - if (len == -1) | |
752 | + if (len == -1) { | |
753 | + /* Delete broken cache file */ | |
754 | + unlink(c->filename); | |
755 | return -1; | |
756 | + } | |
757 | if (len == 0 || urlbuff[len - 1] != '\n') | |
758 | return 0; | |
759 | urlbuff[len - 1] = '\0'; | |
760 | @@ -663,18 +664,21 @@ | |
761 | "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&")) | |
762 | return 0; | |
763 | ||
764 | - c->date = ap_proxy_hex2sec(urlbuff + 17*(0)); | |
765 | - c->lmod = ap_proxy_hex2sec(urlbuff + 17*(1)); | |
766 | - c->expire = ap_proxy_hex2sec(urlbuff + 17*(2)); | |
767 | - c->version = ap_proxy_hex2sec(urlbuff + 17*(3)); | |
768 | - c->req_time = ap_proxy_hex2sec(urlbuff + 17*(4)); | |
769 | - c->resp_time = ap_proxy_hex2sec(urlbuff + 17*(5)); | |
770 | - c->len = ap_proxy_hex2sec(urlbuff + 17*(6)); | |
771 | + c->date = ap_proxy_hex2sec(urlbuff + 17 * (0)); | |
772 | + c->lmod = ap_proxy_hex2sec(urlbuff + 17 * (1)); | |
773 | + c->expire = ap_proxy_hex2sec(urlbuff + 17 * (2)); | |
774 | + c->version = ap_proxy_hex2sec(urlbuff + 17 * (3)); | |
775 | + c->req_time = ap_proxy_hex2sec(urlbuff + 17 * (4)); | |
776 | + c->resp_time = ap_proxy_hex2sec(urlbuff + 17 * (5)); | |
777 | + c->len = ap_proxy_hex2sec(urlbuff + 17 * (6)); | |
778 | ||
779 | /* check that we have the same URL */ | |
780 | len = ap_bgets(urlbuff, sizeof urlbuff, cachefp); | |
781 | - if (len == -1) | |
782 | + if (len == -1) { | |
783 | + /* Delete broken cache file */ | |
784 | + unlink(c->filename); | |
785 | return -1; | |
786 | + } | |
787 | if (len == 0 || strncmp(urlbuff, "X-URL: ", 7) != 0 || | |
788 | urlbuff[len - 1] != '\n') | |
789 | return 0; | |
790 | @@ -684,13 +688,19 @@ | |
791 | ||
792 | /* then the original request headers */ | |
793 | c->req_hdrs = ap_proxy_read_headers(r, urlbuff, sizeof urlbuff, cachefp); | |
794 | - if (c->req_hdrs == NULL) | |
795 | + if (c->req_hdrs == NULL) { | |
796 | + /* Delete broken cache file */ | |
797 | + unlink(c->filename); | |
798 | return -1; | |
799 | + } | |
800 | ||
801 | /* then the original response headers */ | |
802 | len = ap_bgets(urlbuff, sizeof urlbuff, cachefp); | |
803 | - if (len == -1) | |
804 | + if (len == -1) { | |
805 | + /* Delete broken cache file */ | |
806 | + unlink(c->filename); | |
807 | return -1; | |
808 | + } | |
809 | if (len == 0 || urlbuff[len - 1] != '\n') | |
810 | return 0; | |
811 | urlbuff[--len] = '\0'; | |
812 | @@ -702,8 +712,11 @@ | |
813 | ||
814 | c->status = atoi(strp); | |
815 | c->hdrs = ap_proxy_read_headers(r, urlbuff, sizeof urlbuff, cachefp); | |
816 | - if (c->hdrs == NULL) | |
817 | + if (c->hdrs == NULL) { | |
818 | + /* Delete broken cache file */ | |
819 | + unlink(c->filename); | |
820 | return -1; | |
821 | + } | |
822 | if (c->len != -1) /* add a content-length header */ | |
823 | if (ap_table_get(c->hdrs, "Content-Length") == NULL) { | |
824 | ap_table_set(c->hdrs, "Content-Length", | |
825 | @@ -735,52 +748,53 @@ | |
826 | /* check for If-Match, If-Unmodified-Since */ | |
827 | while (1) { | |
828 | ||
829 | - /* check If-Match and If-Unmodified-Since exist | |
830 | + /* | |
831 | + * check If-Match and If-Unmodified-Since exist | |
832 | * | |
833 | - * If neither of these exist, the request is not conditional, and | |
834 | - * we serve it normally | |
835 | + * If neither of these exist, the request is not conditional, and we | |
836 | + * serve it normally | |
837 | */ | |
838 | if (!c->im && BAD_DATE == c->ius) { | |
839 | break; | |
840 | } | |
841 | ||
842 | - /* check If-Match | |
843 | + /* | |
844 | + * check If-Match | |
845 | * | |
846 | - * we check if the Etag on the cached file is in the list of Etags | |
847 | - * in the If-Match field. The comparison must be a strong comparison, | |
848 | - * so the Etag cannot be marked as weak. If the comparision fails | |
849 | - * we return 412 Precondition Failed. | |
850 | - * | |
851 | - * if If-Match is specified AND | |
852 | - * If-Match is not a "*" AND | |
853 | - * Etag is missing or weak or not in the list THEN | |
854 | - * return 412 Precondition Failed | |
855 | + * we check if the Etag on the cached file is in the list of Etags in | |
856 | + * the If-Match field. The comparison must be a strong comparison, so | |
857 | + * the Etag cannot be marked as weak. If the comparision fails we | |
858 | + * return 412 Precondition Failed. | |
859 | + * | |
860 | + * if If-Match is specified AND If-Match is not a "*" AND Etag is | |
861 | + * missing or weak or not in the list THEN return 412 Precondition | |
862 | + * Failed | |
863 | */ | |
864 | ||
865 | if (c->im) { | |
866 | if (strcmp(c->im, "*") && | |
867 | (!etag || (strlen(etag) > 1 && 'W' == etag[0] && '/' == etag[1]) || !ap_proxy_liststr(c->im, etag, NULL))) { | |
868 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Match specified, and it didn't - return 412"); | |
869 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Match specified, and it didn't - return 412"); | |
870 | } | |
871 | else { | |
872 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Match specified, and it matched"); | |
873 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Match specified, and it matched"); | |
874 | break; | |
875 | } | |
876 | } | |
877 | ||
878 | - /* check If-Unmodified-Since | |
879 | + /* | |
880 | + * check If-Unmodified-Since | |
881 | * | |
882 | - * if If-Unmodified-Since is specified AND | |
883 | - * Last-Modified is specified somewhere AND | |
884 | - * If-Unmodified-Since is in the past compared to Last-Modified THEN | |
885 | - * return 412 Precondition Failed | |
886 | + * if If-Unmodified-Since is specified AND Last-Modified is specified | |
887 | + * somewhere AND If-Unmodified-Since is in the past compared to | |
888 | + * Last-Modified THEN return 412 Precondition Failed | |
889 | */ | |
890 | if (BAD_DATE != c->ius && BAD_DATE != c->lmod) { | |
891 | if (c->ius < c->lmod) { | |
892 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Unmodified-Since specified, but it wasn't - return 412"); | |
893 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Unmodified-Since specified, but it wasn't - return 412"); | |
894 | } | |
895 | else { | |
896 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Unmodified-Since specified, and it was unmodified"); | |
897 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Unmodified-Since specified, and it was unmodified"); | |
898 | break; | |
899 | } | |
900 | } | |
901 | @@ -788,13 +802,13 @@ | |
902 | /* if cache file is being updated */ | |
903 | if (c->origfp) { | |
904 | ap_proxy_write_headers(c, c->resp_line, c->hdrs); | |
905 | - ap_proxy_send_fb(c->origfp, r, c, c->len, 1, IOBUFSIZE); | |
906 | + ap_proxy_send_fb(c->origfp, r, c, c->len, 1, 0, IOBUFSIZE); | |
907 | ap_proxy_cache_tidy(c); | |
908 | } | |
909 | else | |
910 | ap_pclosef(r->pool, ap_bfileno(cachefp, B_WR)); | |
911 | ||
912 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Use your cached copy, conditional precondition failed."); | |
913 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Use your cached copy, conditional precondition failed."); | |
914 | return HTTP_PRECONDITION_FAILED; | |
915 | } | |
916 | ||
917 | @@ -802,53 +816,54 @@ | |
918 | /* check for If-None-Match, If-Modified-Since */ | |
919 | while (1) { | |
920 | ||
921 | - /* check for existance of If-None-Match and If-Modified-Since | |
922 | + /* | |
923 | + * check for existance of If-None-Match and If-Modified-Since | |
924 | * | |
925 | - * if neither of these headers have been set, then the request | |
926 | - * is not conditional, and we just send the cached response and | |
927 | - * be done with it. | |
928 | + * if neither of these headers have been set, then the request is not | |
929 | + * conditional, and we just send the cached response and be done with | |
930 | + * it. | |
931 | */ | |
932 | if (!c->inm && BAD_DATE == c->ims) { | |
933 | break; | |
934 | } | |
935 | ||
936 | - /* check If-None-Match | |
937 | + /* | |
938 | + * check If-None-Match | |
939 | * | |
940 | - * we check if the Etag on the cached file is in the list of Etags | |
941 | - * in the If-None-Match field. The comparison must be a strong comparison, | |
942 | - * so the Etag cannot be marked as weak. If the comparision fails | |
943 | - * we return 412 Precondition Failed. | |
944 | - * | |
945 | - * if If-None-Match is specified: | |
946 | - * if If-None-Match is a "*" THEN 304 | |
947 | - * else if Etag is specified AND we get a match THEN 304 | |
948 | - * else if Weak Etag is specified AND we get a match THEN 304 | |
949 | - * else sent the original object | |
950 | + * we check if the Etag on the cached file is in the list of Etags in | |
951 | + * the If-None-Match field. The comparison must be a strong | |
952 | + * comparison, so the Etag cannot be marked as weak. If the | |
953 | + * comparision fails we return 412 Precondition Failed. | |
954 | + * | |
955 | + * if If-None-Match is specified: if If-None-Match is a "*" THEN 304 | |
956 | + * else if Etag is specified AND we get a match THEN 304 else if Weak | |
957 | + * Etag is specified AND we get a match THEN 304 else sent the | |
958 | + * original object | |
959 | */ | |
960 | if (c->inm) { | |
961 | if (!strcmp(c->inm, "*")) { | |
962 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-None-Match: * specified, return 304"); | |
963 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-None-Match: * specified, return 304"); | |
964 | } | |
965 | else if (etag && ap_proxy_liststr(c->inm, etag, NULL)) { | |
966 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-None-Match: specified and we got a strong match - return 304"); | |
967 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-None-Match: specified and we got a strong match - return 304"); | |
968 | } | |
969 | else if (wetag && ap_proxy_liststr(c->inm, wetag, NULL)) { | |
970 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-None-Match specified, and we got a weak match - return 304"); | |
971 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-None-Match specified, and we got a weak match - return 304"); | |
972 | } | |
973 | else | |
974 | break; | |
975 | } | |
976 | ||
977 | - /* check If-Modified-Since | |
978 | + /* | |
979 | + * check If-Modified-Since | |
980 | * | |
981 | - * if If-Modified-Since is specified AND | |
982 | - * Last-Modified is specified somewhere: | |
983 | - * if last modification date is earlier than If-Modified-Since THEN 304 | |
984 | - * else send the original object | |
985 | + * if If-Modified-Since is specified AND Last-Modified is specified | |
986 | + * somewhere: if last modification date is earlier than | |
987 | + * If-Modified-Since THEN 304 else send the original object | |
988 | */ | |
989 | if (BAD_DATE != c->ims && BAD_DATE != c->lmod) { | |
990 | if (c->ims >= c->lmod) { | |
991 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "If-Modified-Since specified and not modified, try return 304"); | |
992 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "If-Modified-Since specified and not modified, try return 304"); | |
993 | } | |
994 | else | |
995 | break; | |
996 | @@ -858,47 +873,43 @@ | |
997 | /* are we updating the cache file? */ | |
998 | if (c->origfp) { | |
999 | ap_proxy_write_headers(c, c->resp_line, c->hdrs); | |
1000 | - ap_proxy_send_fb(c->origfp, r, c, c->len, 1, IOBUFSIZE); | |
1001 | + ap_proxy_send_fb(c->origfp, r, c, c->len, 1, 0, IOBUFSIZE); | |
1002 | ap_proxy_cache_tidy(c); | |
1003 | } | |
1004 | else | |
1005 | ap_pclosef(r->pool, ap_bfileno(cachefp, B_WR)); | |
1006 | ||
1007 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Use local copy, cached file hasn't changed"); | |
1008 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Use local copy, cached file hasn't changed"); | |
1009 | return HTTP_NOT_MODIFIED; | |
1010 | } | |
1011 | ||
1012 | ||
1013 | /* No conditional - just send it cousin! */ | |
1014 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Local copy modified, send it"); | |
1015 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Local copy modified, send it"); | |
1016 | r->status_line = strchr(c->resp_line, ' ') + 1; | |
1017 | r->status = c->status; | |
1018 | ||
1019 | /* Prepare and send headers to client */ | |
1020 | - ap_overlap_tables(r->headers_out, c->hdrs, AP_OVERLAP_TABLES_SET); | |
1021 | + ap_proxy_table_replace(r->headers_out, c->hdrs); | |
1022 | /* make sure our X-Cache header does not stomp on a previous header */ | |
1023 | ap_table_mergen(r->headers_out, "X-Cache", c->xcache); | |
1024 | ||
1025 | /* content type is already set in the headers */ | |
1026 | r->content_type = ap_table_get(r->headers_out, "Content-Type"); | |
1027 | ||
1028 | - /* cookies are special: they must not be merged (stupid browsers) */ | |
1029 | - ap_proxy_table_unmerge(r->pool, r->headers_out, "Set-Cookie"); | |
1030 | - ap_proxy_table_unmerge(r->pool, r->headers_out, "Set-Cookie2"); | |
1031 | - | |
1032 | ap_send_http_header(r); | |
1033 | ||
1034 | /* are we rewriting the cache file? */ | |
1035 | if (c->origfp) { | |
1036 | ap_proxy_write_headers(c, c->resp_line, c->hdrs); | |
1037 | - ap_proxy_send_fb(c->origfp, r, c, c->len, r->header_only, IOBUFSIZE); | |
1038 | + ap_proxy_send_fb(c->origfp, r, c, c->len, r->header_only, 0, IOBUFSIZE); | |
1039 | ap_proxy_cache_tidy(c); | |
1040 | return OK; | |
1041 | } | |
1042 | ||
1043 | /* no, we not */ | |
1044 | if (!r->header_only) { | |
1045 | - ap_proxy_send_fb(cachefp, r, NULL, c->len, 0, IOBUFSIZE); | |
1046 | + ap_proxy_send_fb(cachefp, r, NULL, c->len, 0, 0, IOBUFSIZE); | |
1047 | } | |
1048 | else { | |
1049 | ap_pclosef(r->pool, ap_bfileno(cachefp, B_WR)); | |
1050 | @@ -922,17 +933,17 @@ | |
1051 | * if last modified after if-modified-since then add | |
1052 | * last modified date to request | |
1053 | */ | |
1054 | -int ap_proxy_cache_check(request_rec *r, char *url, struct cache_conf *conf, | |
1055 | +int ap_proxy_cache_check(request_rec *r, char *url, struct cache_conf * conf, | |
1056 | cache_req **cr) | |
1057 | { | |
1058 | - const char *datestr, *pragma_req = NULL, *pragma_cresp = NULL, *cc_req = NULL, *cc_cresp = NULL, *vary = NULL; | |
1059 | + const char *datestr, *pragma_req = NULL, *pragma_cresp = NULL, *cc_req = NULL, | |
1060 | + *cc_cresp = NULL; | |
1061 | cache_req *c; | |
1062 | - time_t now; | |
1063 | BUFF *cachefp; | |
1064 | int i; | |
1065 | void *sconf = r->server->module_config; | |
1066 | proxy_server_conf *pconf = | |
1067 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
1068 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
1069 | const char *agestr = NULL; | |
1070 | char *val; | |
1071 | time_t age_c = 0; | |
1072 | @@ -989,7 +1000,7 @@ | |
1073 | else { | |
1074 | c->filename = NULL; | |
1075 | c->fp = NULL; | |
1076 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "No CacheRoot, so no caching. Declining."); | |
1077 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "No CacheRoot, so no caching. Declining."); | |
1078 | return DECLINED; | |
1079 | } | |
1080 | ||
1081 | @@ -1017,22 +1028,24 @@ | |
1082 | unlink(c->filename); | |
1083 | c->fp = NULL; | |
1084 | c->filename = NULL; | |
1085 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "no-store forbids caching. Declining."); | |
1086 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "no-store forbids caching. Declining."); | |
1087 | return DECLINED; | |
1088 | } | |
1089 | ||
1090 | /* if the cache file exists, open it */ | |
1091 | cachefp = NULL; | |
1092 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Request for %s, pragma_req=%s, ims=%ld", url, | |
1093 | - pragma_req, c->ims); | |
1094 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Request for %s, pragma_req=%s, ims=%ld", url, | |
1095 | + (pragma_req == NULL) ? "(unset)" : pragma_req, c->ims); | |
1096 | /* find out about whether the request can access the cache */ | |
1097 | if (c->filename != NULL && r->method_number == M_GET && | |
1098 | - strlen(url) < 1024 ) { | |
1099 | + strlen(url) < 1024) { | |
1100 | cachefp = ap_proxy_open_cachefile(r, c->filename); | |
1101 | } | |
1102 | ||
1103 | ||
1104 | - /* if a cache file exists, try reading body and headers from cache file */ | |
1105 | + /* | |
1106 | + * if a cache file exists, try reading body and headers from cache file | |
1107 | + */ | |
1108 | if (cachefp != NULL) { | |
1109 | i = rdcache(r, cachefp, c); | |
1110 | if (i == -1) | |
1111 | @@ -1040,7 +1053,7 @@ | |
1112 | "proxy: error reading cache file %s", | |
1113 | c->filename); | |
1114 | else if (i == 0) | |
1115 | - ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r, | |
1116 | + ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, r, | |
1117 | "proxy: bad (short?) cache file: %s", c->filename); | |
1118 | if (i != 1) { | |
1119 | ap_pclosef(r->pool, ap_bfileno(cachefp, B_WR)); | |
1120 | @@ -1049,7 +1062,6 @@ | |
1121 | if (c->hdrs) { | |
1122 | cc_cresp = ap_table_get(c->hdrs, "Cache-Control"); | |
1123 | pragma_cresp = ap_table_get(c->hdrs, "Pragma"); | |
1124 | - vary = ap_table_get(c->hdrs, "Vary"); | |
1125 | if ((agestr = ap_table_get(c->hdrs, "Age"))) { | |
1126 | age_c = atoi(agestr); | |
1127 | } | |
1128 | @@ -1065,7 +1077,8 @@ | |
1129 | */ | |
1130 | /* FIXME: Shouldn't we check the URL somewhere? */ | |
1131 | ||
1132 | - /* Check Content-Negotiation - Vary | |
1133 | + /* | |
1134 | + * Check Content-Negotiation - Vary | |
1135 | * | |
1136 | * At this point we need to make sure that the object we found in the cache | |
1137 | * is the same object that would be delivered to the client, when the | |
1138 | @@ -1092,8 +1105,10 @@ | |
1139 | ++vary; | |
1140 | } | |
1141 | ||
1142 | - /* is this header in the request and the header in the cached | |
1143 | - * request identical? If not, we give up and do a straight get */ | |
1144 | + /* | |
1145 | + * is this header in the request and the header in the cached | |
1146 | + * request identical? If not, we give up and do a straight get | |
1147 | + */ | |
1148 | h1 = ap_table_get(r->headers_in, name); | |
1149 | h2 = ap_table_get(c->req_hdrs, name); | |
1150 | if (h1 == h2) { | |
1151 | @@ -1106,42 +1121,43 @@ | |
1152 | ||
1153 | /* headers do not match, so Vary failed */ | |
1154 | c->fp = cachefp; | |
1155 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Vary header mismatch - object must be fetched from scratch. Declining."); | |
1156 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Vary header mismatch - object must be fetched from scratch. Declining."); | |
1157 | return DECLINED; | |
1158 | } | |
1159 | } | |
1160 | } | |
1161 | ||
1162 | ||
1163 | - /* We now want to check if our cached data is still fresh. This depends | |
1164 | + /* | |
1165 | + * We now want to check if our cached data is still fresh. This depends | |
1166 | * on a few things, in this order: | |
1167 | * | |
1168 | - * - RFC2616 14.9.4 End to end reload, Cache-Control: no-cache | |
1169 | - * no-cache in either the request or the cached response means that | |
1170 | - * we must revalidate the request unconditionally, overriding any | |
1171 | - * expiration mechanism. It's equivalent to max-age=0,must-revalidate. | |
1172 | - * | |
1173 | - * - RFC2616 14.32 Pragma: no-cache | |
1174 | - * This is treated the same as Cache-Control: no-cache. | |
1175 | - * | |
1176 | - * - RFC2616 14.9.3 Cache-Control: max-stale, must-revalidate, proxy-revalidate | |
1177 | - * if the max-stale request header exists, modify the stale calculations | |
1178 | - * below so that an object can be at most <max-stale> seconds stale before | |
1179 | - * we request a revalidation, _UNLESS_ a must-revalidate or | |
1180 | - * proxy-revalidate cached response header exists to stop us doing this. | |
1181 | - * | |
1182 | - * - RFC2616 14.9.3 Cache-Control: s-maxage | |
1183 | - * the origin server specifies the maximum age an object can be before | |
1184 | - * it is considered stale. This directive has the effect of proxy|must | |
1185 | - * revalidate, which in turn means simple ignore any max-stale setting. | |
1186 | - * | |
1187 | - * - RFC2616 14.9.4 Cache-Control: max-age | |
1188 | - * this header can appear in both requests and responses. If both are | |
1189 | - * specified, the smaller of the two takes priority. | |
1190 | - * | |
1191 | - * - RFC2616 14.21 Expires: | |
1192 | - * if this request header exists in the cached entity, and it's value is | |
1193 | - * in the past, it has expired. | |
1194 | + * - RFC2616 14.9.4 End to end reload, Cache-Control: no-cache no-cache in | |
1195 | + * either the request or the cached response means that we must | |
1196 | + * revalidate the request unconditionally, overriding any expiration | |
1197 | + * mechanism. It's equivalent to max-age=0,must-revalidate. | |
1198 | + * | |
1199 | + * - RFC2616 14.32 Pragma: no-cache This is treated the same as | |
1200 | + * Cache-Control: no-cache. | |
1201 | + * | |
1202 | + * - RFC2616 14.9.3 Cache-Control: max-stale, must-revalidate, | |
1203 | + * proxy-revalidate if the max-stale request header exists, modify the | |
1204 | + * stale calculations below so that an object can be at most <max-stale> | |
1205 | + * seconds stale before we request a revalidation, _UNLESS_ a | |
1206 | + * must-revalidate or proxy-revalidate cached response header exists to | |
1207 | + * stop us doing this. | |
1208 | + * | |
1209 | + * - RFC2616 14.9.3 Cache-Control: s-maxage the origin server specifies the | |
1210 | + * maximum age an object can be before it is considered stale. This | |
1211 | + * directive has the effect of proxy|must revalidate, which in turn means | |
1212 | + * simple ignore any max-stale setting. | |
1213 | + * | |
1214 | + * - RFC2616 14.9.4 Cache-Control: max-age this header can appear in both | |
1215 | + * requests and responses. If both are specified, the smaller of the two | |
1216 | + * takes priority. | |
1217 | + * | |
1218 | + * - RFC2616 14.21 Expires: if this request header exists in the cached | |
1219 | + * entity, and it's value is in the past, it has expired. | |
1220 | * | |
1221 | */ | |
1222 | ||
1223 | @@ -1166,7 +1182,9 @@ | |
1224 | else | |
1225 | maxage_cresp = -1; | |
1226 | ||
1227 | - /* if both maxage request and response, the smaller one takes priority */ | |
1228 | + /* | |
1229 | + * if both maxage request and response, the smaller one takes priority | |
1230 | + */ | |
1231 | if (-1 == maxage_req) | |
1232 | maxage = maxage_cresp; | |
1233 | else if (-1 == maxage_cresp) | |
1234 | @@ -1187,37 +1205,35 @@ | |
1235 | minfresh = 0; | |
1236 | ||
1237 | /* override maxstale if must-revalidate or proxy-revalidate */ | |
1238 | - if (maxstale && ( (cc_cresp && ap_proxy_liststr(cc_cresp, "must-revalidate", NULL)) || (cc_cresp && ap_proxy_liststr(cc_cresp, "proxy-revalidate", NULL)) )) | |
1239 | + if (maxstale && ((cc_cresp && ap_proxy_liststr(cc_cresp, "must-revalidate", NULL)) || (cc_cresp && ap_proxy_liststr(cc_cresp, "proxy-revalidate", NULL)))) | |
1240 | maxstale = 0; | |
1241 | ||
1242 | - now = time(NULL); | |
1243 | if (cachefp != NULL && | |
1244 | ||
1245 | /* handle no-cache */ | |
1246 | - !( (cc_req && ap_proxy_liststr(cc_req, "no-cache", NULL)) || | |
1247 | + !((cc_req && ap_proxy_liststr(cc_req, "no-cache", NULL)) || | |
1248 | (pragma_req && ap_proxy_liststr(pragma_req, "no-cache", NULL)) || | |
1249 | (cc_cresp && ap_proxy_liststr(cc_cresp, "no-cache", NULL)) || | |
1250 | - (pragma_cresp && ap_proxy_liststr(pragma_cresp, "no-cache", NULL)) ) && | |
1251 | + (pragma_cresp && ap_proxy_liststr(pragma_cresp, "no-cache", NULL))) && | |
1252 | ||
1253 | /* handle expiration */ | |
1254 | - ( (-1 < smaxage && age < (smaxage - minfresh)) || | |
1255 | + ((-1 < smaxage && age < (smaxage - minfresh)) || | |
1256 | (-1 < maxage && age < (maxage + maxstale - minfresh)) || | |
1257 | - (c->expire != BAD_DATE && age < (c->expire - c->date + maxstale - minfresh)) ) | |
1258 | - | |
1259 | + (c->expire != BAD_DATE && age < (c->expire - c->date + maxstale - minfresh))) | |
1260 | ) { | |
1261 | ||
1262 | /* it's fresh darlings... */ | |
1263 | ||
1264 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Unexpired data available"); | |
1265 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Unexpired data available"); | |
1266 | ||
1267 | /* set age header on response */ | |
1268 | ap_table_set(c->hdrs, "Age", | |
1269 | ap_psprintf(r->pool, "%lu", (unsigned long)age)); | |
1270 | ||
1271 | /* add warning if maxstale overrode freshness calculation */ | |
1272 | - if (!( (-1 < smaxage && age < smaxage) || | |
1273 | + if (!((-1 < smaxage && age < smaxage) || | |
1274 | (-1 < maxage && age < maxage) || | |
1275 | - (c->expire != BAD_DATE && (c->expire - c->date) > age) )) { | |
1276 | + (c->expire != BAD_DATE && (c->expire - c->date) > age))) { | |
1277 | /* make sure we don't stomp on a previous warning */ | |
1278 | ap_table_merge(c->hdrs, "Warning", "110 Response is stale"); | |
1279 | } | |
1280 | @@ -1229,11 +1245,12 @@ | |
1281 | ||
1282 | } | |
1283 | ||
1284 | - /* at this point we have determined our cached data needs revalidation | |
1285 | + /* | |
1286 | + * at this point we have determined our cached data needs revalidation | |
1287 | * but first - we check 1 thing: | |
1288 | * | |
1289 | - * RFC2616 14.9.4 - if "only-if-cached" specified, send a | |
1290 | - * 504 Gateway Timeout - we're not allowed to revalidate the object | |
1291 | + * RFC2616 14.9.4 - if "only-if-cached" specified, send a 504 Gateway | |
1292 | + * Timeout - we're not allowed to revalidate the object | |
1293 | */ | |
1294 | if (ap_proxy_liststr(cc_req, "only-if-cached", NULL)) { | |
1295 | if (cachefp) | |
1296 | @@ -1242,11 +1259,12 @@ | |
1297 | } | |
1298 | ||
1299 | ||
1300 | - /* If we already have cached data and a last-modified date, and it is | |
1301 | - * not a head request, then add an If-Modified-Since. | |
1302 | + /* | |
1303 | + * If we already have cached data and a last-modified date, and it is not | |
1304 | + * a head request, then add an If-Modified-Since. | |
1305 | * | |
1306 | - * If we also have an Etag, then the object must have come from | |
1307 | - * an HTTP/1.1 server. Add an If-None-Match as well. | |
1308 | + * If we also have an Etag, then the object must have come from an HTTP/1.1 | |
1309 | + * server. Add an If-None-Match as well. | |
1310 | * | |
1311 | * See RFC2616 13.3.4 | |
1312 | */ | |
1313 | @@ -1257,13 +1275,15 @@ | |
1314 | ||
1315 | /* If-Modified-Since */ | |
1316 | if (c->lmod != BAD_DATE) { | |
1317 | - /* use the later of the one from the request and the last-modified date | |
1318 | - * from the cache */ | |
1319 | + /* | |
1320 | + * use the later of the one from the request and the | |
1321 | + * last-modified date from the cache | |
1322 | + */ | |
1323 | if (c->ims == BAD_DATE || c->ims < c->lmod) { | |
1324 | const char *q; | |
1325 | ||
1326 | if ((q = ap_table_get(c->hdrs, "Last-Modified")) != NULL) | |
1327 | - ap_table_set(r->headers_in, "If-Modified-Since", (char *) q); | |
1328 | + ap_table_set(r->headers_in, "If-Modified-Since", (char *)q); | |
1329 | } | |
1330 | } | |
1331 | ||
1332 | @@ -1277,7 +1297,7 @@ | |
1333 | ||
1334 | c->fp = cachefp; | |
1335 | ||
1336 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Local copy not present or expired. Declining."); | |
1337 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Local copy not present or expired. Declining."); | |
1338 | ||
1339 | return DECLINED; | |
1340 | } | |
1341 | @@ -1304,10 +1324,10 @@ | |
1342 | char *p; | |
1343 | const char *expire, *lmods, *dates, *clen; | |
1344 | time_t expc, date, lmod, now; | |
1345 | - char buff[17*7+1]; | |
1346 | + char buff[17 * 7 + 1]; | |
1347 | void *sconf = r->server->module_config; | |
1348 | proxy_server_conf *conf = | |
1349 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
1350 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
1351 | const char *cc_resp; | |
1352 | table *req_hdrs; | |
1353 | ||
1354 | @@ -1317,8 +1337,10 @@ | |
1355 | ||
1356 | /* we've received the response from the origin server */ | |
1357 | ||
1358 | - /* read expiry date; if a bad date, then leave it so the client can | |
1359 | - * read it */ | |
1360 | + /* | |
1361 | + * read expiry date; if a bad date, then leave it so the client can read | |
1362 | + * it | |
1363 | + */ | |
1364 | expire = ap_table_get(resp_hdrs, "Expires"); | |
1365 | if (expire != NULL) | |
1366 | expc = ap_parseHTTPdate(expire); | |
1367 | @@ -1341,44 +1363,55 @@ | |
1368 | /* | |
1369 | * what responses should we not cache? | |
1370 | * | |
1371 | - * At this point we decide based on the response headers whether it | |
1372 | - * is appropriate _NOT_ to cache the data from the server. There are | |
1373 | - * a whole lot of conditions that prevent us from caching this data. | |
1374 | - * They are tested here one by one to be clear and unambiguous. */ | |
1375 | - | |
1376 | - /* RFC2616 13.4 we are allowed to cache 200, 203, 206, 300, 301 or 410 | |
1377 | - * We don't cache 206, because we don't (yet) cache partial responses. | |
1378 | - * We include 304 Not Modified here too as this is the origin server | |
1379 | - * telling us to serve the cached copy. */ | |
1380 | + * At this point we decide based on the response headers whether it is | |
1381 | + * appropriate _NOT_ to cache the data from the server. There are a whole | |
1382 | + * lot of conditions that prevent us from caching this data. They are | |
1383 | + * tested here one by one to be clear and unambiguous. | |
1384 | + */ | |
1385 | + | |
1386 | + /* | |
1387 | + * RFC2616 13.4 we are allowed to cache 200, 203, 206, 300, 301 or 410 We | |
1388 | + * don't cache 206, because we don't (yet) cache partial responses. We | |
1389 | + * include 304 Not Modified here too as this is the origin server telling | |
1390 | + * us to serve the cached copy. | |
1391 | + */ | |
1392 | if ((r->status != HTTP_OK && r->status != HTTP_NON_AUTHORITATIVE && r->status != HTTP_MULTIPLE_CHOICES && r->status != HTTP_MOVED_PERMANENTLY && r->status != HTTP_NOT_MODIFIED) || | |
1393 | ||
1394 | /* if a broken Expires header is present, don't cache it */ | |
1395 | (expire != NULL && expc == BAD_DATE) || | |
1396 | ||
1397 | - /* if the server said 304 Not Modified but we have no cache file - pass | |
1398 | - * this untouched to the user agent, it's not for us. */ | |
1399 | + /* | |
1400 | + * if the server said 304 Not Modified but we have no cache file - pass | |
1401 | + * this untouched to the user agent, it's not for us. | |
1402 | + */ | |
1403 | (r->status == HTTP_NOT_MODIFIED && (c == NULL || c->fp == NULL)) || | |
1404 | ||
1405 | - /* 200 OK response from HTTP/1.0 and up without a Last-Modified header */ | |
1406 | + /* | |
1407 | + * 200 OK response from HTTP/1.0 and up without a Last-Modified header | |
1408 | + */ | |
1409 | (r->status == HTTP_OK && lmods == NULL && is_HTTP1) || | |
1410 | ||
1411 | /* HEAD requests */ | |
1412 | r->header_only || | |
1413 | ||
1414 | - /* RFC2616 14.9.2 Cache-Control: no-store response indicating do not | |
1415 | - * cache, or stop now if you are trying to cache it */ | |
1416 | + /* | |
1417 | + * RFC2616 14.9.2 Cache-Control: no-store response indicating do not | |
1418 | + * cache, or stop now if you are trying to cache it | |
1419 | + */ | |
1420 | ap_proxy_liststr(cc_resp, "no-store", NULL) || | |
1421 | ||
1422 | - /* RFC2616 14.9.1 Cache-Control: private | |
1423 | - * this object is marked for this user's eyes only. Behave as a tunnel. */ | |
1424 | + /* | |
1425 | + * RFC2616 14.9.1 Cache-Control: private this object is marked for this | |
1426 | + * user's eyes only. Behave as a tunnel. | |
1427 | + */ | |
1428 | ap_proxy_liststr(cc_resp, "private", NULL) || | |
1429 | ||
1430 | - /* RFC2616 14.8 Authorisation: | |
1431 | - * if authorisation is included in the request, we don't cache, but we | |
1432 | - * can cache if the following exceptions are true: | |
1433 | - * 1) If Cache-Control: s-maxage is included | |
1434 | - * 2) If Cache-Control: must-revalidate is included | |
1435 | - * 3) If Cache-Control: public is included | |
1436 | + /* | |
1437 | + * RFC2616 14.8 Authorisation: if authorisation is included in the | |
1438 | + * request, we don't cache, but we can cache if the following exceptions | |
1439 | + * are true: 1) If Cache-Control: s-maxage is included 2) If | |
1440 | + * Cache-Control: must-revalidate is included 3) If Cache-Control: public | |
1441 | + * is included | |
1442 | */ | |
1443 | (ap_table_get(r->headers_in, "Authorization") != NULL | |
1444 | ||
1445 | @@ -1388,7 +1421,7 @@ | |
1446 | /* or we've been asked not to cache it above */ | |
1447 | nocache) { | |
1448 | ||
1449 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Response is not cacheable, unlinking %s", c->filename); | |
1450 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Response is not cacheable, unlinking %s", c->filename); | |
1451 | ||
1452 | /* close the file */ | |
1453 | if (c->fp != NULL) { | |
1454 | @@ -1403,15 +1436,15 @@ | |
1455 | } | |
1456 | ||
1457 | ||
1458 | - /* It's safe to cache the response. | |
1459 | + /* | |
1460 | + * It's safe to cache the response. | |
1461 | * | |
1462 | - * We now want to update the cache file header information with | |
1463 | - * the new date, last modified, expire and content length and write | |
1464 | - * it away to our cache file. First, we determine these values from | |
1465 | - * the response, using heuristics if appropriate. | |
1466 | + * We now want to update the cache file header information with the new | |
1467 | + * date, last modified, expire and content length and write it away to | |
1468 | + * our cache file. First, we determine these values from the response, | |
1469 | + * using heuristics if appropriate. | |
1470 | * | |
1471 | - * In addition, we make HTTP/1.1 age calculations and write them away | |
1472 | - * too. | |
1473 | + * In addition, we make HTTP/1.1 age calculations and write them away too. | |
1474 | */ | |
1475 | ||
1476 | /* Read the date. Generate one if one is not supplied */ | |
1477 | @@ -1430,7 +1463,7 @@ | |
1478 | date = now; | |
1479 | dates = ap_gm_timestr_822(r->pool, now); | |
1480 | ap_table_set(resp_hdrs, "Date", dates); | |
1481 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Added date header"); | |
1482 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Added date header"); | |
1483 | } | |
1484 | ||
1485 | /* set response_time for HTTP/1.1 age calculations */ | |
1486 | @@ -1442,16 +1475,17 @@ | |
1487 | { | |
1488 | lmod = date; | |
1489 | lmods = dates; | |
1490 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Last modified is in the future, replacing with now"); | |
1491 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Last modified is in the future, replacing with now"); | |
1492 | } | |
1493 | /* if the response did not contain the header, then use the cached version */ | |
1494 | if (lmod == BAD_DATE && c->fp != NULL) { | |
1495 | lmod = c->lmod; | |
1496 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Reusing cached last modified"); | |
1497 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Reusing cached last modified"); | |
1498 | } | |
1499 | ||
1500 | /* we now need to calculate the expire data for the object. */ | |
1501 | - if (expire == NULL && c->fp != NULL) { /* no expiry data sent in response */ | |
1502 | + if (expire == NULL && c->fp != NULL) { /* no expiry data sent in | |
1503 | + * response */ | |
1504 | expire = ap_table_get(c->hdrs, "Expires"); | |
1505 | if (expire != NULL) | |
1506 | expc = ap_parseHTTPdate(expire); | |
1507 | @@ -1463,18 +1497,18 @@ | |
1508 | * else | |
1509 | * expire date = now + defaultexpire | |
1510 | */ | |
1511 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Expiry date is %ld", (long)expc); | |
1512 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Expiry date is %ld", (long)expc); | |
1513 | if (expc == BAD_DATE) { | |
1514 | if (lmod != BAD_DATE) { | |
1515 | - double x = (double) (date - lmod) * conf->cache.lmfactor; | |
1516 | + double x = (double)(date - lmod) * conf->cache.lmfactor; | |
1517 | double maxex = conf->cache.maxexpire; | |
1518 | if (x > maxex) | |
1519 | x = maxex; | |
1520 | - expc = now + (int) x; | |
1521 | + expc = now + (int)x; | |
1522 | } | |
1523 | else | |
1524 | expc = now + conf->cache.defaultexpire; | |
1525 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Expiry date calculated %ld", (long)expc); | |
1526 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Expiry date calculated %ld", (long)expc); | |
1527 | } | |
1528 | ||
1529 | /* get the content-length header */ | |
1530 | @@ -1486,21 +1520,21 @@ | |
1531 | ||
1532 | /* we have all the header information we need - write it to the cache file */ | |
1533 | c->version++; | |
1534 | - ap_proxy_sec2hex(date, buff + 17*(0)); | |
1535 | - buff[17*(1)-1] = ' '; | |
1536 | - ap_proxy_sec2hex(lmod, buff + 17*(1)); | |
1537 | - buff[17*(2)-1] = ' '; | |
1538 | - ap_proxy_sec2hex(expc, buff + 17*(2)); | |
1539 | - buff[17*(3)-1] = ' '; | |
1540 | - ap_proxy_sec2hex(c->version, buff + 17*(3)); | |
1541 | - buff[17*(4)-1] = ' '; | |
1542 | - ap_proxy_sec2hex(c->req_time, buff + 17*(4)); | |
1543 | - buff[17*(5)-1] = ' '; | |
1544 | - ap_proxy_sec2hex(c->resp_time, buff + 17*(5)); | |
1545 | - buff[17*(6)-1] = ' '; | |
1546 | - ap_proxy_sec2hex(c->len, buff + 17*(6)); | |
1547 | - buff[17*(7)-1] = '\n'; | |
1548 | - buff[17*(7)] = '\0'; | |
1549 | + ap_proxy_sec2hex(date, buff + 17 * (0)); | |
1550 | + buff[17 * (1) - 1] = ' '; | |
1551 | + ap_proxy_sec2hex(lmod, buff + 17 * (1)); | |
1552 | + buff[17 * (2) - 1] = ' '; | |
1553 | + ap_proxy_sec2hex(expc, buff + 17 * (2)); | |
1554 | + buff[17 * (3) - 1] = ' '; | |
1555 | + ap_proxy_sec2hex(c->version, buff + 17 * (3)); | |
1556 | + buff[17 * (4) - 1] = ' '; | |
1557 | + ap_proxy_sec2hex(c->req_time, buff + 17 * (4)); | |
1558 | + buff[17 * (5) - 1] = ' '; | |
1559 | + ap_proxy_sec2hex(c->resp_time, buff + 17 * (5)); | |
1560 | + buff[17 * (6) - 1] = ' '; | |
1561 | + ap_proxy_sec2hex(c->len, buff + 17 * (6)); | |
1562 | + buff[17 * (7) - 1] = '\n'; | |
1563 | + buff[17 * (7)] = '\0'; | |
1564 | ||
1565 | /* Was the server response a 304 Not Modified? | |
1566 | * | |
1567 | @@ -1570,7 +1604,7 @@ | |
1568 | c = ap_proxy_cache_error(c); | |
1569 | break; | |
1570 | } | |
1571 | - c->tempfile = ap_palloc(r->pool, strlen(conf->cache.root) +1+ L_tmpnam); | |
1572 | + c->tempfile = ap_palloc(r->pool, strlen(conf->cache.root) + 1 + L_tmpnam); | |
1573 | strcpy(c->tempfile, conf->cache.root); | |
1574 | strcat(c->tempfile, "/"); | |
1575 | p = tmpnam(NULL); | |
1576 | @@ -1581,7 +1615,7 @@ | |
1577 | break; | |
1578 | } | |
1579 | ||
1580 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Create temporary file %s", c->tempfile); | |
1581 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Create temporary file %s", c->tempfile); | |
1582 | ||
1583 | /* create the new file */ | |
1584 | c->fp = ap_proxy_create_cachefile(r, c->tempfile); | |
1585 | @@ -1677,7 +1711,7 @@ | |
1586 | c->len = bc; | |
1587 | ap_bflush(c->fp); | |
1588 | ap_proxy_sec2hex(c->len, buff); | |
1589 | - curpos = lseek(ap_bfileno(c->fp, B_WR), 17*6, SEEK_SET); | |
1590 | + curpos = lseek(ap_bfileno(c->fp, B_WR), 17 * 6, SEEK_SET); | |
1591 | if (curpos == -1) | |
1592 | ap_log_error(APLOG_MARK, APLOG_ERR, s, | |
1593 | "proxy: error seeking on cache file %s", c->tempfile); | |
1594 | @@ -1695,7 +1729,7 @@ | |
1595 | return; | |
1596 | } | |
1597 | ||
1598 | - if (ap_pclosef(c->req->pool, ap_bfileno(c->fp, B_WR)) == -1) { | |
1599 | + if (ap_pclosef(c->req->pool, ap_bfileno(c->fp, B_WR))== -1) { | |
1600 | ap_log_error(APLOG_MARK, APLOG_ERR, s, | |
1601 | "proxy: error closing cache file %s", c->tempfile); | |
1602 | unlink(c->tempfile); | |
1603 | @@ -1705,12 +1739,13 @@ | |
1604 | if (unlink(c->filename) == -1 && errno != ENOENT) { | |
1605 | ap_log_error(APLOG_MARK, APLOG_ERR, s, | |
1606 | "proxy: error deleting old cache file %s", | |
1607 | - c->tempfile); | |
1608 | + c->filename); | |
1609 | + (void)unlink(c->tempfile); | |
1610 | } | |
1611 | else { | |
1612 | char *p; | |
1613 | proxy_server_conf *conf = | |
1614 | - (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module); | |
1615 | + (proxy_server_conf *)ap_get_module_config(s->module_config, &proxy_module); | |
1616 | ||
1617 | for (p = c->filename + strlen(conf->cache.root) + 1;;) { | |
1618 | p = strchr(p, '/'); | |
1619 | @@ -1732,10 +1767,11 @@ | |
1620 | } | |
1621 | #if defined(OS2) || defined(WIN32) || defined(NETWARE) || defined(MPE) | |
1622 | /* Under OS/2 use rename. */ | |
1623 | - if (rename(c->tempfile, c->filename) == -1) | |
1624 | + if (rename(c->tempfile, c->filename) == -1) { | |
1625 | ap_log_error(APLOG_MARK, APLOG_ERR, s, | |
1626 | "proxy: error renaming cache file %s to %s", | |
1627 | c->tempfile, c->filename); | |
1628 | + (void)unlink(c->tempfile); | |
1629 | } | |
1630 | #else | |
1631 | ||
1632 | @@ -1743,11 +1779,9 @@ | |
1633 | ap_log_error(APLOG_MARK, APLOG_ERR, s, | |
1634 | "proxy: error linking cache file %s to %s", | |
1635 | c->tempfile, c->filename); | |
1636 | - } | |
1637 | - | |
1638 | if (unlink(c->tempfile) == -1) | |
1639 | ap_log_error(APLOG_MARK, APLOG_ERR, s, | |
1640 | "proxy: error deleting temp file %s", c->tempfile); | |
1641 | #endif | |
1642 | - | |
1643 | + } | |
1644 | } | |
1645 | Index: modules/proxy/proxy_connect.c | |
1646 | =================================================================== | |
1647 | RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_connect.c,v | |
1648 | retrieving revision 1.48 | |
1649 | retrieving revision 1.49 | |
1650 | diff -u -b -u -r1.48 -r1.49 | |
1651 | --- modules/proxy/proxy_connect.c 13 Mar 2002 21:05:32 -0000 1.48 | |
1652 | +++ modules/proxy/proxy_connect.c 25 Mar 2002 09:21:58 -0000 1.49 | |
1653 | @@ -96,14 +96,13 @@ | |
1654 | * FIXME: no check for r->assbackwards, whatever that is. | |
1655 | */ | |
1656 | ||
1657 | -static int | |
1658 | -allowed_port(proxy_server_conf *conf, int port) | |
1659 | +static int allowed_port(proxy_server_conf *conf, int port) | |
1660 | { | |
1661 | int i; | |
1662 | - int *list = (int *) conf->allowed_connect_ports->elts; | |
1663 | + int *list = (int *)conf->allowed_connect_ports->elts; | |
1664 | ||
1665 | - for(i = 0; i < conf->allowed_connect_ports->nelts; i++) { | |
1666 | - if(port == list[i]) | |
1667 | + for (i = 0; i < conf->allowed_connect_ports->nelts; i++) { | |
1668 | + if (port == list[i]) | |
1669 | return 1; | |
1670 | } | |
1671 | return 0; | |
1672 | @@ -125,8 +124,8 @@ | |
1673 | ||
1674 | void *sconf = r->server->module_config; | |
1675 | proxy_server_conf *conf = | |
1676 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
1677 | - struct noproxy_entry *npent = (struct noproxy_entry *)conf->noproxies->elts; | |
1678 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
1679 | + struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts; | |
1680 | ||
1681 | memset(&server, '\0', sizeof(server)); | |
1682 | server.sin_family = AF_INET; | |
1683 | @@ -162,15 +161,16 @@ | |
1684 | default: | |
1685 | return HTTP_FORBIDDEN; | |
1686 | } | |
1687 | - } else if(!allowed_port(conf, port)) | |
1688 | + } | |
1689 | + else if (!allowed_port(conf, port)) | |
1690 | return HTTP_FORBIDDEN; | |
1691 | ||
1692 | if (proxyhost) { | |
1693 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
1694 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
1695 | "CONNECT to remote proxy %s on port %d", proxyhost, proxyport); | |
1696 | } | |
1697 | else { | |
1698 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
1699 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
1700 | "CONNECT to %s on port %d", host, port); | |
1701 | } | |
1702 | ||
1703 | @@ -190,7 +190,7 @@ | |
1704 | ||
1705 | #ifdef CHECK_FD_SETSIZE | |
1706 | if (sock >= FD_SETSIZE) { | |
1707 | - ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL, | |
1708 | + ap_log_error(APLOG_MARK, APLOG_NOERRNO | APLOG_WARNING, NULL, | |
1709 | "proxy_connect_handler: filedescriptor (%u) " | |
1710 | "larger than FD_SETSIZE (%u) " | |
1711 | "found, you probably need to rebuild Apache with a " | |
1712 | @@ -215,61 +215,64 @@ | |
1713 | "Could not connect to remote machine:<br>", strerror(errno), NULL)); | |
1714 | } | |
1715 | ||
1716 | - /* If we are connecting through a remote proxy, we need to pass | |
1717 | - * the CONNECT request on to it. | |
1718 | + /* | |
1719 | + * If we are connecting through a remote proxy, we need to pass the | |
1720 | + * CONNECT request on to it. | |
1721 | */ | |
1722 | if (proxyport) { | |
1723 | - /* FIXME: We should not be calling write() directly, but we currently | |
1724 | - * have no alternative. Error checking ignored. Also, we force | |
1725 | - * a HTTP/1.0 request to keep things simple. | |
1726 | + /* | |
1727 | + * FIXME: We should not be calling write() directly, but we currently | |
1728 | + * have no alternative. Error checking ignored. Also, we force a | |
1729 | + * HTTP/1.0 request to keep things simple. | |
1730 | */ | |
1731 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
1732 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
1733 | "Sending the CONNECT request to the remote proxy"); | |
1734 | ap_snprintf(buffer, sizeof(buffer), "CONNECT %s HTTP/1.0" CRLF, r->uri); | |
1735 | - send(sock, buffer, strlen(buffer),0); | |
1736 | + send(sock, buffer, strlen(buffer), 0); | |
1737 | ap_snprintf(buffer, sizeof(buffer), | |
1738 | "Proxy-agent: %s" CRLF CRLF, ap_get_server_version()); | |
1739 | - send(sock, buffer, strlen(buffer),0); | |
1740 | + send(sock, buffer, strlen(buffer), 0); | |
1741 | } | |
1742 | else { | |
1743 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
1744 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
1745 | "Returning 200 OK Status"); | |
1746 | ap_rvputs(r, "HTTP/1.0 200 Connection established" CRLF, NULL); | |
1747 | ap_rvputs(r, "Proxy-agent: ", ap_get_server_version(), CRLF CRLF, NULL); | |
1748 | ap_bflush(r->connection->client); | |
1749 | } | |
1750 | ||
1751 | - while (1) { /* Infinite loop until error (one side closes the connection) */ | |
1752 | + while (1) { /* Infinite loop until error (one side closes | |
1753 | + * the connection) */ | |
1754 | FD_ZERO(&fds); | |
1755 | FD_SET(sock, &fds); | |
1756 | FD_SET(ap_bfileno(r->connection->client, B_WR), &fds); | |
1757 | ||
1758 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
1759 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
1760 | "Going to sleep (select)"); | |
1761 | i = ap_select((ap_bfileno(r->connection->client, B_WR) > sock ? | |
1762 | ap_bfileno(r->connection->client, B_WR) + 1 : | |
1763 | sock + 1), &fds, NULL, NULL, NULL); | |
1764 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
1765 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
1766 | "Woke from select(), i=%d", i); | |
1767 | ||
1768 | if (i) { | |
1769 | if (FD_ISSET(sock, &fds)) { | |
1770 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
1771 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
1772 | "sock was set"); | |
1773 | - if ((nbytes = recv(sock, buffer, HUGE_STRING_LEN,0)) != 0) { | |
1774 | + if ((nbytes = recv(sock, buffer, HUGE_STRING_LEN, 0)) != 0) { | |
1775 | if (nbytes == -1) | |
1776 | break; | |
1777 | if (send(ap_bfileno(r->connection->client, B_WR), buffer, | |
1778 | - nbytes,0) == EOF) | |
1779 | + nbytes, 0) == EOF) | |
1780 | break; | |
1781 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, | |
1782 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, | |
1783 | r->server, "Wrote %d bytes to client", nbytes); | |
1784 | } | |
1785 | else | |
1786 | break; | |
1787 | } | |
1788 | else if (FD_ISSET(ap_bfileno(r->connection->client, B_WR), &fds)) { | |
1789 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, | |
1790 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, | |
1791 | "client->fd was set"); | |
1792 | if ((nbytes = recv(ap_bfileno(r->connection->client, B_WR), | |
1793 | buffer, HUGE_STRING_LEN, 0)) != 0) { | |
1794 | @@ -277,7 +280,7 @@ | |
1795 | break; | |
1796 | if (send(sock, buffer, nbytes, 0) == EOF) | |
1797 | break; | |
1798 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, | |
1799 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, | |
1800 | r->server, "Wrote %d bytes to server", nbytes); | |
1801 | } | |
1802 | else | |
1803 | Index: modules/proxy/proxy_ftp.c | |
1804 | =================================================================== | |
1805 | RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_ftp.c,v | |
1806 | retrieving revision 1.96 | |
1807 | retrieving revision 1.98 | |
1808 | diff -u -b -u -r1.96 -r1.98 | |
1809 | --- modules/proxy/proxy_ftp.c 13 Mar 2002 21:05:32 -0000 1.96 | |
1810 | +++ modules/proxy/proxy_ftp.c 7 Apr 2002 18:57:36 -0000 1.98 | |
1811 | @@ -229,8 +229,7 @@ | |
1812 | { | |
1813 | int len, status; | |
1814 | char linebuff[100], buff[5]; | |
1815 | - char *mb = msgbuf, | |
1816 | - *me = &msgbuf[msglen]; | |
1817 | + char *mb = msgbuf, *me = &msgbuf[msglen]; | |
1818 | ||
1819 | len = ap_bgets(linebuff, sizeof linebuff, ctrl); | |
1820 | if (len == -1) | |
1821 | @@ -241,7 +240,7 @@ | |
1822 | else | |
1823 | status = 100 * linebuff[0] + 10 * linebuff[1] + linebuff[2] - 111 * '0'; | |
1824 | ||
1825 | - mb = ap_cpystrn(mb, linebuff+4, me - mb); | |
1826 | + mb = ap_cpystrn(mb, linebuff + 4, me - mb); | |
1827 | ||
1828 | if (linebuff[len - 1] != '\n') | |
1829 | (void)ap_bskiplf(ctrl); | |
1830 | @@ -256,7 +255,7 @@ | |
1831 | if (linebuff[len - 1] != '\n') { | |
1832 | (void)ap_bskiplf(ctrl); | |
1833 | } | |
1834 | - mb = ap_cpystrn(mb, linebuff+4, me - mb); | |
1835 | + mb = ap_cpystrn(mb, linebuff + 4, me - mb); | |
1836 | } while (memcmp(linebuff, buff, 4) != 0); | |
1837 | } | |
1838 | return status; | |
1839 | @@ -275,7 +274,8 @@ | |
1840 | conn_rec *con = r->connection; | |
1841 | pool *p = r->pool; | |
1842 | char *dir, *path, *reldir, *site, *type = NULL; | |
1843 | - char *basedir = ""; /* By default, path is relative to the $HOME dir */ | |
1844 | + char *basedir = ""; /* By default, path is relative to the $HOME | |
1845 | + * dir */ | |
1846 | ||
1847 | /* create default sized buffers for the stuff below */ | |
1848 | buf_size = IOBUFSIZE; | |
1849 | @@ -283,9 +283,9 @@ | |
1850 | buf2 = ap_palloc(r->pool, buf_size); | |
1851 | ||
1852 | /* Save "scheme://site" prefix without password */ | |
1853 | - site = ap_unparse_uri_components(p, &r->parsed_uri, UNP_OMITPASSWORD|UNP_OMITPATHINFO); | |
1854 | + site = ap_unparse_uri_components(p, &r->parsed_uri, UNP_OMITPASSWORD | UNP_OMITPATHINFO); | |
1855 | /* ... and path without query args */ | |
1856 | - path = ap_unparse_uri_components(p, &r->parsed_uri, UNP_OMITSITEPART|UNP_OMITQUERY); | |
1857 | + path = ap_unparse_uri_components(p, &r->parsed_uri, UNP_OMITSITEPART | UNP_OMITQUERY); | |
1858 | ||
1859 | /* If path began with /%2f, change the basedir */ | |
1860 | if (strncasecmp(path, "/%2f", 4) == 0) { | |
1861 | @@ -304,8 +304,8 @@ | |
1862 | /* Copy path, strip (all except the last) trailing slashes */ | |
1863 | /* (the trailing slash is needed for the dir component loop below) */ | |
1864 | path = dir = ap_pstrcat(r->pool, path, "/", NULL); | |
1865 | - for (n = strlen(path); n > 1 && path[n-1] == '/' && path[n-2] == '/'; --n) | |
1866 | - path[n-1] = '\0'; | |
1867 | + for (n = strlen(path); n > 1 && path[n - 1] == '/' && path[n - 2] == '/'; --n) | |
1868 | + path[n - 1] = '\0'; | |
1869 | ||
1870 | /* print "ftp://host/" */ | |
1871 | n = ap_snprintf(buf, buf_size, DOCTYPE_HTML_3_2 | |
1872 | @@ -313,8 +313,8 @@ | |
1873 | "<base href=\"%s%s%s\"></head>\n" | |
1874 | "<body><h2>Directory of " | |
1875 | "<a href=\"/\">%s</a>/", | |
1876 | - site, basedir, ap_escape_html(p,path), | |
1877 | - site, basedir, ap_escape_uri(p,path), | |
1878 | + site, basedir, ap_escape_html(p, path), | |
1879 | + site, basedir, ap_escape_uri(p, path), | |
1880 | site); | |
1881 | total_bytes_sent += ap_proxy_bputs2(buf, con->client, c); | |
1882 | ||
1883 | @@ -323,11 +323,10 @@ | |
1884 | total_bytes_sent += ap_proxy_bputs2("<a href=\"/%2f/\">%2f</a>/", con->client, c); | |
1885 | } | |
1886 | ||
1887 | - for (dir = path+1; (dir = strchr(dir, '/')) != NULL; ) | |
1888 | - { | |
1889 | + for (dir = path + 1; (dir = strchr(dir, '/')) != NULL;) { | |
1890 | *dir = '\0'; | |
1891 | - if ((reldir = strrchr(path+1, '/'))==NULL) { | |
1892 | - reldir = path+1; | |
1893 | + if ((reldir = strrchr(path + 1, '/')) == NULL) { | |
1894 | + reldir = path + 1; | |
1895 | } | |
1896 | else | |
1897 | ++reldir; | |
1898 | @@ -344,9 +343,10 @@ | |
1899 | ||
1900 | /* If the caller has determined the current directory, and it differs */ | |
1901 | /* from what the client requested, then show the real name */ | |
1902 | - if (cwd == NULL || strncmp (cwd, path, strlen(cwd)) == 0) { | |
1903 | + if (cwd == NULL || strncmp(cwd, path, strlen(cwd)) == 0) { | |
1904 | ap_snprintf(buf, buf_size, "</h2>\n<hr /><pre>"); | |
1905 | - } else { | |
1906 | + } | |
1907 | + else { | |
1908 | ap_snprintf(buf, buf_size, "</h2>\n(%s)\n<hr /><pre>", | |
1909 | ap_escape_html(p, cwd)); | |
1910 | } | |
1911 | @@ -365,13 +365,13 @@ | |
1912 | if (n == 0) | |
1913 | break; /* EOF */ | |
1914 | ||
1915 | - if (buf[n-1] == '\n') /* strip trailing '\n' */ | |
1916 | + if (buf[n - 1] == '\n') /* strip trailing '\n' */ | |
1917 | buf[--n] = '\0'; | |
1918 | - if (buf[n-1] == '\r') /* strip trailing '\r' if present */ | |
1919 | + if (buf[n - 1] == '\r') /* strip trailing '\r' if present */ | |
1920 | buf[--n] = '\0'; | |
1921 | ||
1922 | /* Handle unix-style symbolic link */ | |
1923 | - if (buf[0] == 'l' && (filename=strstr(buf, " -> ")) != NULL) { | |
1924 | + if (buf[0] == 'l' && (filename = strstr(buf, " -> ")) != NULL) { | |
1925 | char *link_ptr = filename; | |
1926 | ||
1927 | do { | |
1928 | @@ -382,7 +382,7 @@ | |
1929 | *(link_ptr++) = '\0'; | |
1930 | ap_snprintf(buf2, buf_size, "%s <a href=\"%s\">%s %s</a>\n", | |
1931 | ap_escape_html(p, buf), | |
1932 | - ap_escape_uri(p,filename), | |
1933 | + ap_escape_uri(p, filename), | |
1934 | ap_escape_html(p, filename), | |
1935 | ap_escape_html(p, link_ptr)); | |
1936 | ap_cpystrn(buf, buf2, buf_size); | |
1937 | @@ -416,13 +416,13 @@ | |
1938 | /* Special handling for '.' and '..': append slash to link */ | |
1939 | if (!strcmp(filename, ".") || !strcmp(filename, "..") || buf[0] == 'd') { | |
1940 | ap_snprintf(buf2, buf_size, "%s <a href=\"%s/\">%s</a>\n", | |
1941 | - ap_escape_html(p, buf), ap_escape_uri(p,filename), | |
1942 | + ap_escape_html(p, buf), ap_escape_uri(p, filename), | |
1943 | ap_escape_html(p, filename)); | |
1944 | } | |
1945 | else { | |
1946 | ap_snprintf(buf2, buf_size, "%s <a href=\"%s\">%s</a>\n", | |
1947 | ap_escape_html(p, buf), | |
1948 | - ap_escape_uri(p,filename), | |
1949 | + ap_escape_uri(p, filename), | |
1950 | ap_escape_html(p, filename)); | |
1951 | } | |
1952 | ap_cpystrn(buf, buf2, buf_size); | |
1953 | @@ -457,14 +457,15 @@ | |
1954 | * Note that we "invent" a realm name which consists of the | |
1955 | * ftp://user@host part of the reqest (sans password -if supplied but invalid-) | |
1956 | */ | |
1957 | -static int ftp_unauthorized (request_rec *r, int log_it) | |
1958 | +static int ftp_unauthorized(request_rec *r, int log_it) | |
1959 | { | |
1960 | r->proxyreq = NOT_PROXY; | |
1961 | - /* Log failed requests if they supplied a password | |
1962 | - * (log username/password guessing attempts) | |
1963 | + /* | |
1964 | + * Log failed requests if they supplied a password (log username/password | |
1965 | + * guessing attempts) | |
1966 | */ | |
1967 | if (log_it) | |
1968 | - ap_log_rerror(APLOG_MARK, APLOG_INFO|APLOG_NOERRNO, r, | |
1969 | + ap_log_rerror(APLOG_MARK, APLOG_INFO | APLOG_NOERRNO, r, | |
1970 | "proxy: missing or failed auth to %s", | |
1971 | ap_unparse_uri_components(r->pool, | |
1972 | &r->parsed_uri, UNP_OMITPATHINFO)); | |
1973 | @@ -472,7 +473,7 @@ | |
1974 | ap_table_setn(r->err_headers_out, "WWW-Authenticate", | |
1975 | ap_pstrcat(r->pool, "Basic realm=\"", | |
1976 | ap_unparse_uri_components(r->pool, &r->parsed_uri, | |
1977 | - UNP_OMITPASSWORD|UNP_OMITPATHINFO), | |
1978 | + UNP_OMITPASSWORD | UNP_OMITPATHINFO), | |
1979 | "\"", NULL)); | |
1980 | ||
1981 | return HTTP_UNAUTHORIZED; | |
1982 | @@ -481,7 +482,7 @@ | |
1983 | /* Set ftp server to TYPE {A,I,E} before transfer of a directory or file */ | |
1984 | static int ftp_set_TYPE(request_rec *r, BUFF *ctrl, char xfer_type) | |
1985 | { | |
1986 | - static char old_type[2] = { 'A', '\0' }; /* After logon, mode is ASCII */ | |
1987 | + static char old_type[2] = {'A', '\0'}; /* After logon, mode is ASCII */ | |
1988 | int ret = HTTP_OK; | |
1989 | int rc; | |
1990 | ||
1991 | @@ -492,7 +493,7 @@ | |
1992 | old_type[0] = xfer_type; | |
1993 | ap_bvputs(ctrl, "TYPE ", old_type, CRLF, NULL); | |
1994 | ap_bflush(ctrl); | |
1995 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: TYPE %s", old_type); | |
1996 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: TYPE %s", old_type); | |
1997 | ||
1998 | /* responses: 200, 421, 500, 501, 504, 530 */ | |
1999 | /* 200 Command okay. */ | |
2000 | @@ -502,7 +503,7 @@ | |
2001 | /* 504 Command not implemented for that parameter. */ | |
2002 | /* 530 Not logged in. */ | |
2003 | rc = ftp_getrc(ctrl); | |
2004 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", rc); | |
2005 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", rc); | |
2006 | if (rc == -1 || rc == 421) { | |
2007 | ap_kill_timeout(r); | |
2008 | ret = ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2009 | @@ -515,14 +516,13 @@ | |
2010 | } | |
2011 | /* Allow not implemented */ | |
2012 | else if (rc == 504) | |
2013 | - /* ignore it silently */; | |
2014 | + /* ignore it silently */ ; | |
2015 | ||
2016 | return ret; | |
2017 | } | |
2018 | ||
2019 | /* Common cleanup routine: close open BUFFers or sockets, and return an error */ | |
2020 | -static int | |
2021 | -ftp_cleanup_and_return(request_rec *r, BUFF *ctrl, BUFF *data, int csock, int dsock, int rc) | |
2022 | +static int ftp_cleanup_and_return(request_rec *r, BUFF *ctrl, BUFF *data, int csock, int dsock, int rc) | |
2023 | { | |
2024 | if (ctrl != NULL) | |
2025 | ap_bclose(ctrl); | |
2026 | @@ -569,7 +569,7 @@ | |
2027 | ||
2028 | void *sconf = r->server->module_config; | |
2029 | proxy_server_conf *conf = | |
2030 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
2031 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
2032 | struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts; | |
2033 | struct nocache_entry *ncent = (struct nocache_entry *) conf->nocaches->elts; | |
2034 | ||
2035 | @@ -604,25 +604,27 @@ | |
2036 | while (*path == '/') | |
2037 | ++path; | |
2038 | ||
2039 | - /* The "Authorization:" header must be checked first. | |
2040 | - * We allow the user to "override" the URL-coded user [ & password ] | |
2041 | - * in the Browsers' User&Password Dialog. | |
2042 | - * NOTE that this is only marginally more secure than having the | |
2043 | - * password travel in plain as part of the URL, because Basic Auth | |
2044 | - * simply uuencodes the plain text password. | |
2045 | - * But chances are still smaller that the URL is logged regularly. | |
2046 | + /* | |
2047 | + * The "Authorization:" header must be checked first. We allow the user | |
2048 | + * to "override" the URL-coded user [ & password ] in the Browsers' | |
2049 | + * User&Password Dialog. NOTE that this is only marginally more secure | |
2050 | + * than having the password travel in plain as part of the URL, because | |
2051 | + * Basic Auth simply uuencodes the plain text password. But chances are | |
2052 | + * still smaller that the URL is logged regularly. | |
2053 | */ | |
2054 | if ((password = ap_table_get(r->headers_in, "Authorization")) != NULL | |
2055 | && strcasecmp(ap_getword(r->pool, &password, ' '), "Basic") == 0 | |
2056 | && (password = ap_pbase64decode(r->pool, password))[0] != ':') { | |
2057 | - /* Note that this allocation has to be made from r->connection->pool | |
2058 | - * because it has the lifetime of the connection. The other allocations | |
2059 | - * are temporary and can be tossed away any time. | |
2060 | + /* | |
2061 | + * Note that this allocation has to be made from r->connection->pool | |
2062 | + * because it has the lifetime of the connection. The other | |
2063 | + * allocations are temporary and can be tossed away any time. | |
2064 | */ | |
2065 | - user = ap_getword_nulls (r->connection->pool, &password, ':'); | |
2066 | + user = ap_getword_nulls(r->connection->pool, &password, ':'); | |
2067 | r->connection->ap_auth_type = "Basic"; | |
2068 | r->connection->user = r->parsed_uri.user = user; | |
2069 | - nocache = 1; /* This resource only accessible with username/password */ | |
2070 | + nocache = 1; /* This resource only accessible with | |
2071 | + * username/password */ | |
2072 | } | |
2073 | else if ((user = r->parsed_uri.user) != NULL) { | |
2074 | user = ap_pstrdup(p, user); | |
2075 | @@ -632,7 +634,8 @@ | |
2076 | decodeenc(tmp); | |
2077 | password = tmp; | |
2078 | } | |
2079 | - nocache = 1; /* This resource only accessible with username/password */ | |
2080 | + nocache = 1; /* This resource only accessible with | |
2081 | + * username/password */ | |
2082 | } | |
2083 | else { | |
2084 | user = "anonymous"; | |
2085 | @@ -649,7 +652,7 @@ | |
2086 | "Connect to remote machine blocked"); | |
2087 | } | |
2088 | ||
2089 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: connect to %s:%d", host, port); | |
2090 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: connect to %s:%d", host, port); | |
2091 | ||
2092 | parms = strchr(path, ';'); | |
2093 | if (parms != NULL) | |
2094 | @@ -672,26 +675,26 @@ | |
2095 | #if !defined(TPF) && !defined(BEOS) | |
2096 | if (conf->recv_buffer_size > 0 | |
2097 | && setsockopt(sock, SOL_SOCKET, SO_RCVBUF, | |
2098 | - (const char *) &conf->recv_buffer_size, sizeof(int)) | |
2099 | + (const char *)&conf->recv_buffer_size, sizeof(int)) | |
2100 | == -1) { | |
2101 | ap_log_rerror(APLOG_MARK, APLOG_ERR, r, | |
2102 | "setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default"); | |
2103 | } | |
2104 | #endif | |
2105 | ||
2106 | - if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &one, | |
2107 | + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, | |
2108 | sizeof(one)) == -1) { | |
2109 | #ifndef _OSD_POSIX /* BS2000 has this option "always on" */ | |
2110 | ap_log_rerror(APLOG_MARK, APLOG_ERR, r, | |
2111 | "proxy: error setting reuseaddr option: setsockopt(SO_REUSEADDR)"); | |
2112 | ap_pclosesocket(p, sock); | |
2113 | return HTTP_INTERNAL_SERVER_ERROR; | |
2114 | -#endif /*_OSD_POSIX*/ | |
2115 | +#endif /* _OSD_POSIX */ | |
2116 | } | |
2117 | ||
2118 | #ifdef SINIX_D_RESOLVER_BUG | |
2119 | { | |
2120 | - struct in_addr *ip_addr = (struct in_addr *) *server_hp.h_addr_list; | |
2121 | + struct in_addr *ip_addr = (struct in_addr *)*server_hp.h_addr_list; | |
2122 | ||
2123 | for (; ip_addr->s_addr != 0; ++ip_addr) { | |
2124 | memcpy(&server.sin_addr, ip_addr, sizeof(struct in_addr)); | |
2125 | @@ -726,8 +729,8 @@ | |
2126 | /* shouldn't we implement telnet control options here? */ | |
2127 | ||
2128 | #ifdef CHARSET_EBCDIC | |
2129 | - ap_bsetflag(ctrl, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1); | |
2130 | -#endif /*CHARSET_EBCDIC*/ | |
2131 | + ap_bsetflag(ctrl, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 1); | |
2132 | +#endif /* CHARSET_EBCDIC */ | |
2133 | ||
2134 | /* possible results: */ | |
2135 | /* 120 Service ready in nnn minutes. */ | |
2136 | @@ -735,7 +738,7 @@ | |
2137 | /* 421 Service not available, closing control connection. */ | |
2138 | ap_hard_timeout("proxy ftp", r); | |
2139 | i = ftp_getrc_msg(ctrl, resp, sizeof resp); | |
2140 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2141 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2142 | if (i == -1 || i == 421) { | |
2143 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2144 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2145 | @@ -743,17 +746,18 @@ | |
2146 | } | |
2147 | #if 0 | |
2148 | if (i == 120) { | |
2149 | - /* RFC2068 states: | |
2150 | - * 14.38 Retry-After | |
2151 | + /* | |
2152 | + * RFC2068 states: 14.38 Retry-After | |
2153 | * | |
2154 | * The Retry-After response-header field can be used with a 503 (Service | |
2155 | - * Unavailable) response to indicate how long the service is expected to | |
2156 | - * be unavailable to the requesting client. The value of this field can | |
2157 | - * be either an HTTP-date or an integer number of seconds (in decimal) | |
2158 | - * after the time of the response. | |
2159 | - * Retry-After = "Retry-After" ":" ( HTTP-date | delta-seconds ) | |
2160 | + * Unavailable) response to indicate how long the service is expected | |
2161 | + * to be unavailable to the requesting client. The value of this | |
2162 | + * field can be either an HTTP-date or an integer number of seconds | |
2163 | + * (in decimal) after the time of the response. Retry-After = | |
2164 | + * "Retry-After" ":" ( HTTP-date | delta-seconds ) | |
2165 | */ | |
2166 | - ap_set_header("Retry-After", ap_psprintf(p, "%u", 60*wait_mins); | |
2167 | +/**INDENT** Error@756: Unbalanced parens */ | |
2168 | + ap_set_header("Retry-After", ap_psprintf(p, "%u", 60 * wait_mins); | |
2169 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2170 | ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, resp)); | |
2171 | } | |
2172 | @@ -763,11 +767,11 @@ | |
2173 | ap_proxyerror(r, HTTP_BAD_GATEWAY, resp)); | |
2174 | } | |
2175 | ||
2176 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: connected."); | |
2177 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: connected."); | |
2178 | ||
2179 | ap_bvputs(ctrl, "USER ", user, CRLF, NULL); | |
2180 | ap_bflush(ctrl); /* capture any errors */ | |
2181 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: USER %s", user); | |
2182 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: USER %s", user); | |
2183 | ||
2184 | /* possible results; 230, 331, 332, 421, 500, 501, 530 */ | |
2185 | /* states: 1 - error, 2 - success; 3 - send password, 4,5 fail */ | |
2186 | @@ -780,7 +784,7 @@ | |
2187 | /* 501 Syntax error in parameters or arguments. */ | |
2188 | /* 530 Not logged in. */ | |
2189 | i = ftp_getrc(ctrl); | |
2190 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2191 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2192 | if (i == -1 || i == 421) { | |
2193 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2194 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2195 | @@ -788,7 +792,7 @@ | |
2196 | } | |
2197 | if (i == 530) { | |
2198 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2199 | - ftp_unauthorized (r, 1)); | |
2200 | + ftp_unauthorized(r, 1)); | |
2201 | } | |
2202 | if (i != 230 && i != 331) { | |
2203 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2204 | @@ -798,11 +802,11 @@ | |
2205 | if (i == 331) { /* send password */ | |
2206 | if (password == NULL) { | |
2207 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2208 | - ftp_unauthorized (r, 0)); | |
2209 | + ftp_unauthorized(r, 0)); | |
2210 | } | |
2211 | ap_bvputs(ctrl, "PASS ", password, CRLF, NULL); | |
2212 | ap_bflush(ctrl); | |
2213 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PASS %s", password); | |
2214 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PASS %s", password); | |
2215 | /* possible results 202, 230, 332, 421, 500, 501, 503, 530 */ | |
2216 | /* 230 User logged in, proceed. */ | |
2217 | /* 332 Need account for login. */ | |
2218 | @@ -812,7 +816,7 @@ | |
2219 | /* 503 Bad sequence of commands. */ | |
2220 | /* 530 Not logged in. */ | |
2221 | i = ftp_getrc(ctrl); | |
2222 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2223 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2224 | if (i == -1 || i == 421) { | |
2225 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2226 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2227 | @@ -826,14 +830,15 @@ | |
2228 | /* @@@ questionable -- we might as well return a 403 Forbidden here */ | |
2229 | if (i == 530) /* log it: passwd guessing attempt? */ | |
2230 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2231 | - ftp_unauthorized (r, 1)); | |
2232 | + ftp_unauthorized(r, 1)); | |
2233 | if (i != 230 && i != 202) | |
2234 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2235 | HTTP_BAD_GATEWAY); | |
2236 | } | |
2237 | ||
2238 | - /* Special handling for leading "%2f": this enforces a "cwd /" | |
2239 | - * out of the $HOME directory which was the starting point after login | |
2240 | + /* | |
2241 | + * Special handling for leading "%2f": this enforces a "cwd /" out of the | |
2242 | + * $HOME directory which was the starting point after login | |
2243 | */ | |
2244 | if (strncasecmp(path, "%2f", 3) == 0) { | |
2245 | path += 3; | |
2246 | @@ -841,7 +846,7 @@ | |
2247 | ++path; | |
2248 | ap_bputs("CWD /" CRLF, ctrl); | |
2249 | ap_bflush(ctrl); | |
2250 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: CWD /"); | |
2251 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: CWD /"); | |
2252 | ||
2253 | /* possible results: 250, 421, 500, 501, 502, 530, 550 */ | |
2254 | /* 250 Requested file action okay, completed. */ | |
2255 | @@ -852,7 +857,7 @@ | |
2256 | /* 530 Not logged in. */ | |
2257 | /* 550 Requested action not taken. */ | |
2258 | i = ftp_getrc(ctrl); | |
2259 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2260 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2261 | if (i == -1 || i == 421) | |
2262 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2263 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2264 | @@ -869,7 +874,7 @@ | |
2265 | * this is what we must do if we don't know the OS type of the remote | |
2266 | * machine | |
2267 | */ | |
2268 | - for ( ; (strp = strchr(path, '/')) != NULL ; path = strp + 1) { | |
2269 | + for (; (strp = strchr(path, '/')) != NULL; path = strp + 1) { | |
2270 | char *slash = strp; | |
2271 | ||
2272 | *slash = '\0'; | |
2273 | @@ -888,7 +893,7 @@ | |
2274 | ||
2275 | ap_bvputs(ctrl, "CWD ", path, CRLF, NULL); | |
2276 | ap_bflush(ctrl); | |
2277 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: CWD %s", path); | |
2278 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: CWD %s", path); | |
2279 | *slash = '/'; | |
2280 | ||
2281 | /* responses: 250, 421, 500, 501, 502, 530, 550 */ | |
2282 | @@ -900,7 +905,7 @@ | |
2283 | /* 530 Not logged in. */ | |
2284 | /* 550 Requested action not taken. */ | |
2285 | i = ftp_getrc(ctrl); | |
2286 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2287 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2288 | if (i == -1 || i == 421) | |
2289 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2290 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2291 | @@ -919,10 +924,11 @@ | |
2292 | ||
2293 | if (parms != NULL && strncmp(parms, "type=", 5) == 0 | |
2294 | && ap_isalpha(parms[5])) { | |
2295 | - /* "type=d" forces a dir listing. | |
2296 | - * The other types (i|a|e) are directly used for the ftp TYPE command | |
2297 | + /* | |
2298 | + * "type=d" forces a dir listing. The other types (i|a|e) are | |
2299 | + * directly used for the ftp TYPE command | |
2300 | */ | |
2301 | - if ( ! (get_dirlisting = (parms[5] == 'd'))) | |
2302 | + if (!(get_dirlisting = (parms[5] == 'd'))) | |
2303 | xfer_type = ap_toupper(parms[5]); | |
2304 | ||
2305 | /* Check valid types, rather than ignoring invalid types silently: */ | |
2306 | @@ -948,7 +954,7 @@ | |
2307 | #if !defined (TPF) && !defined(BEOS) | |
2308 | if (conf->recv_buffer_size) { | |
2309 | if (setsockopt(dsock, SOL_SOCKET, SO_RCVBUF, | |
2310 | - (const char *) &conf->recv_buffer_size, sizeof(int)) == -1) { | |
2311 | + (const char *)&conf->recv_buffer_size, sizeof(int)) == -1) { | |
2312 | ap_log_rerror(APLOG_MARK, APLOG_ERR, r, | |
2313 | "setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default"); | |
2314 | } | |
2315 | @@ -957,7 +963,7 @@ | |
2316 | ||
2317 | ap_bputs("PASV" CRLF, ctrl); | |
2318 | ap_bflush(ctrl); | |
2319 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PASV command issued"); | |
2320 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PASV command issued"); | |
2321 | /* possible results: 227, 421, 500, 501, 502, 530 */ | |
2322 | /* 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2). */ | |
2323 | /* 421 Service not available, closing control connection. */ | |
2324 | @@ -979,9 +985,9 @@ | |
2325 | presult = atoi(pstr); | |
2326 | if (*(pstr + strlen(pstr) + 1) == '=') | |
2327 | pstr += strlen(pstr) + 2; | |
2328 | - else | |
2329 | - { | |
2330 | - pstr = strtok(NULL, "("); /* separate address & port params */ | |
2331 | + else { | |
2332 | + pstr = strtok(NULL, "("); /* separate address & port | |
2333 | + * params */ | |
2334 | if (pstr != NULL) | |
2335 | pstr = strtok(NULL, ")"); | |
2336 | } | |
2337 | @@ -989,14 +995,14 @@ | |
2338 | else | |
2339 | presult = atoi(pasv); | |
2340 | ||
2341 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", presult); | |
2342 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", presult); | |
2343 | ||
2344 | if (presult == 227 && pstr != NULL && (sscanf(pstr, | |
2345 | "%d,%d,%d,%d,%d,%d", &h3, &h2, &h1, &h0, &p1, &p0) == 6)) { | |
2346 | /* pardon the parens, but it makes gcc happy */ | |
2347 | paddr = (((((h3 << 8) + h2) << 8) + h1) << 8) + h0; | |
2348 | pport = (p1 << 8) + p0; | |
2349 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: contacting host %d.%d.%d.%d:%d", | |
2350 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: contacting host %d.%d.%d.%d:%d", | |
2351 | h3, h2, h1, h0, pport); | |
2352 | data_addr.sin_family = AF_INET; | |
2353 | data_addr.sin_addr.s_addr = htonl(paddr); | |
2354 | @@ -1020,7 +1026,7 @@ | |
2355 | ||
2356 | if (!pasvmode) { /* set up data connection */ | |
2357 | clen = sizeof(struct sockaddr_in); | |
2358 | - if (getsockname(sock, (struct sockaddr *) &server, &clen) < 0) { | |
2359 | + if (getsockname(sock, (struct sockaddr *)&server, &clen) < 0) { | |
2360 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2361 | ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR, | |
2362 | "proxy: error getting socket address")); | |
2363 | @@ -1033,16 +1039,16 @@ | |
2364 | "proxy: error creating socket")); | |
2365 | } | |
2366 | ||
2367 | - if (setsockopt(dsock, SOL_SOCKET, SO_REUSEADDR, (void *) &one, | |
2368 | + if (setsockopt(dsock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, | |
2369 | sizeof(one)) == -1) { | |
2370 | #ifndef _OSD_POSIX /* BS2000 has this option "always on" */ | |
2371 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2372 | ap_proxyerror(r, HTTP_INTERNAL_SERVER_ERROR, | |
2373 | "proxy: error setting reuseaddr option")); | |
2374 | -#endif /*_OSD_POSIX*/ | |
2375 | +#endif /* _OSD_POSIX */ | |
2376 | } | |
2377 | ||
2378 | - if (bind(dsock, (struct sockaddr *) &server, | |
2379 | + if (bind(dsock, (struct sockaddr *)&server, | |
2380 | sizeof(struct sockaddr_in)) == -1) { | |
2381 | ||
2382 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2383 | @@ -1068,16 +1074,16 @@ | |
2384 | else { | |
2385 | ap_bvputs(ctrl, "SIZE ", path, CRLF, NULL); | |
2386 | ap_bflush(ctrl); | |
2387 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: SIZE %s", path); | |
2388 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: SIZE %s", path); | |
2389 | i = ftp_getrc_msg(ctrl, resp, sizeof resp); | |
2390 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d with response %s", i, resp); | |
2391 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d with response %s", i, resp); | |
2392 | if (i != 500) { /* Size command not recognized */ | |
2393 | if (i == 550) { /* Not a regular file */ | |
2394 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: SIZE shows this is a directory"); | |
2395 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: SIZE shows this is a directory"); | |
2396 | get_dirlisting = 1; | |
2397 | ap_bvputs(ctrl, "CWD ", path, CRLF, NULL); | |
2398 | ap_bflush(ctrl); | |
2399 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: CWD %s", path); | |
2400 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: CWD %s", path); | |
2401 | ||
2402 | /* possible results: 250, 421, 500, 501, 502, 530, 550 */ | |
2403 | /* 250 Requested file action okay, completed. */ | |
2404 | @@ -1088,7 +1094,7 @@ | |
2405 | /* 530 Not logged in. */ | |
2406 | /* 550 Requested action not taken. */ | |
2407 | i = ftp_getrc(ctrl); | |
2408 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2409 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2410 | if (i == -1 || i == 421) | |
2411 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2412 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2413 | @@ -1102,9 +1108,8 @@ | |
2414 | path = ""; | |
2415 | len = 0; | |
2416 | } | |
2417 | - else if (i == 213) { /* Size command ok */ | |
2418 | - for (j = 0; j < sizeof resp && ap_isdigit(resp[j]); j++) | |
2419 | - ; | |
2420 | + else if (i == 213) {/* Size command ok */ | |
2421 | + for (j = 0; j < sizeof resp && ap_isdigit(resp[j]); j++); | |
2422 | resp[j] = '\0'; | |
2423 | if (resp[0] != '\0') | |
2424 | size = ap_pstrdup(p, resp); | |
2425 | @@ -1115,7 +1120,7 @@ | |
2426 | #ifdef AUTODETECT_PWD | |
2427 | ap_bvputs(ctrl, "PWD", CRLF, NULL); | |
2428 | ap_bflush(ctrl); | |
2429 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PWD"); | |
2430 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PWD"); | |
2431 | /* responses: 257, 500, 501, 502, 421, 550 */ | |
2432 | /* 257 "<directory-name>" <commentary> */ | |
2433 | /* 421 Service not available, closing control connection. */ | |
2434 | @@ -1124,7 +1129,7 @@ | |
2435 | /* 502 Command not implemented. */ | |
2436 | /* 550 Requested action not taken. */ | |
2437 | i = ftp_getrc_msg(ctrl, resp, sizeof resp); | |
2438 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PWD returned status %d", i); | |
2439 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PWD returned status %d", i); | |
2440 | if (i == -1 || i == 421) | |
2441 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2442 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2443 | @@ -1136,19 +1141,19 @@ | |
2444 | const char *dirp = resp; | |
2445 | cwd = ap_getword_conf(r->pool, &dirp); | |
2446 | } | |
2447 | -#endif /*AUTODETECT_PWD*/ | |
2448 | +#endif /* AUTODETECT_PWD */ | |
2449 | ||
2450 | if (get_dirlisting) { | |
2451 | if (len != 0) | |
2452 | ap_bvputs(ctrl, "LIST ", path, CRLF, NULL); | |
2453 | else | |
2454 | ap_bputs("LIST -lag" CRLF, ctrl); | |
2455 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: LIST %s", (len == 0 ? "" : path)); | |
2456 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: LIST %s", (len == 0 ? "" : path)); | |
2457 | } | |
2458 | else { | |
2459 | ftp_set_TYPE(r, ctrl, xfer_type); | |
2460 | ap_bvputs(ctrl, "RETR ", path, CRLF, NULL); | |
2461 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: RETR %s", path); | |
2462 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: RETR %s", path); | |
2463 | } | |
2464 | ap_bflush(ctrl); | |
2465 | /* RETR: 110, 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 530, 550 | |
2466 | @@ -1168,19 +1173,20 @@ | |
2467 | /* 530 Not logged in. */ | |
2468 | /* 550 Requested action not taken. */ | |
2469 | rc = ftp_getrc(ctrl); | |
2470 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", rc); | |
2471 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", rc); | |
2472 | if (rc == -1 || rc == 421) | |
2473 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2474 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2475 | "Error reading from remote server")); | |
2476 | if (rc == 550) { | |
2477 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: RETR failed, trying LIST instead"); | |
2478 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: RETR failed, trying LIST instead"); | |
2479 | get_dirlisting = 1; | |
2480 | - ftp_set_TYPE(r, ctrl, 'A'); /* directories must be transferred in ASCII */ | |
2481 | + ftp_set_TYPE(r, ctrl, 'A'); /* directories must be transferred in | |
2482 | + * ASCII */ | |
2483 | ||
2484 | ap_bvputs(ctrl, "CWD ", path, CRLF, NULL); | |
2485 | ap_bflush(ctrl); | |
2486 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: CWD %s", path); | |
2487 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: CWD %s", path); | |
2488 | /* possible results: 250, 421, 500, 501, 502, 530, 550 */ | |
2489 | /* 250 Requested file action okay, completed. */ | |
2490 | /* 421 Service not available, closing control connection. */ | |
2491 | @@ -1190,7 +1196,7 @@ | |
2492 | /* 530 Not logged in. */ | |
2493 | /* 550 Requested action not taken. */ | |
2494 | rc = ftp_getrc(ctrl); | |
2495 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", rc); | |
2496 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", rc); | |
2497 | if (rc == -1 || rc == 421) | |
2498 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2499 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2500 | @@ -1205,7 +1211,7 @@ | |
2501 | #ifdef AUTODETECT_PWD | |
2502 | ap_bvputs(ctrl, "PWD", CRLF, NULL); | |
2503 | ap_bflush(ctrl); | |
2504 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PWD"); | |
2505 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PWD"); | |
2506 | /* responses: 257, 500, 501, 502, 421, 550 */ | |
2507 | /* 257 "<directory-name>" <commentary> */ | |
2508 | /* 421 Service not available, closing control connection. */ | |
2509 | @@ -1214,7 +1220,7 @@ | |
2510 | /* 502 Command not implemented. */ | |
2511 | /* 550 Requested action not taken. */ | |
2512 | i = ftp_getrc_msg(ctrl, resp, sizeof resp); | |
2513 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: PWD returned status %d", i); | |
2514 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: PWD returned status %d", i); | |
2515 | if (i == -1 || i == 421) | |
2516 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2517 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2518 | @@ -1226,13 +1232,13 @@ | |
2519 | const char *dirp = resp; | |
2520 | cwd = ap_getword_conf(r->pool, &dirp); | |
2521 | } | |
2522 | -#endif /*AUTODETECT_PWD*/ | |
2523 | +#endif /* AUTODETECT_PWD */ | |
2524 | ||
2525 | ap_bputs("LIST -lag" CRLF, ctrl); | |
2526 | ap_bflush(ctrl); | |
2527 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: LIST -lag"); | |
2528 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: LIST -lag"); | |
2529 | rc = ftp_getrc(ctrl); | |
2530 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", rc); | |
2531 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", rc); | |
2532 | if (rc == -1 || rc == 421) | |
2533 | return ftp_cleanup_and_return(r, ctrl, data, sock, dsock, | |
2534 | ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2535 | @@ -1260,11 +1266,12 @@ | |
2536 | } | |
2537 | else { | |
2538 | #ifdef CHARSET_EBCDIC | |
2539 | - r->ebcdic.conv_out = 0; /* do not convert what we read from the ftp server */ | |
2540 | + r->ebcdic.conv_out = 0; /* do not convert what we read from the ftp | |
2541 | + * server */ | |
2542 | #endif | |
2543 | if (r->content_type != NULL) { | |
2544 | ap_table_setn(resp_hdrs, "Content-Type", r->content_type); | |
2545 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: Content-Type set to %s", r->content_type); | |
2546 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: Content-Type set to %s", r->content_type); | |
2547 | } | |
2548 | else { | |
2549 | ap_table_setn(resp_hdrs, "Content-Type", ap_default_type(r)); | |
2550 | @@ -1272,11 +1279,11 @@ | |
2551 | if (xfer_type != 'A' && size != NULL) { | |
2552 | /* We "trust" the ftp server to really serve (size) bytes... */ | |
2553 | ap_table_set(resp_hdrs, "Content-Length", size); | |
2554 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: Content-Length set to %s", size); | |
2555 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: Content-Length set to %s", size); | |
2556 | } | |
2557 | } | |
2558 | if (r->content_encoding != NULL && r->content_encoding[0] != '\0') { | |
2559 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: Content-Encoding set to %s", r->content_encoding); | |
2560 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: Content-Encoding set to %s", r->content_encoding); | |
2561 | ap_table_setn(resp_hdrs, "Content-Encoding", r->content_encoding); | |
2562 | } | |
2563 | ||
2564 | @@ -1303,7 +1310,7 @@ | |
2565 | ap_hard_timeout("proxy ftp data connect", r); | |
2566 | clen = sizeof(struct sockaddr_in); | |
2567 | do | |
2568 | - csd = accept(dsock, (struct sockaddr *) &server, &clen); | |
2569 | + csd = accept(dsock, (struct sockaddr *)&server, &clen); | |
2570 | while (csd == -1 && errno == EINTR); | |
2571 | if (csd == -1) { | |
2572 | ap_log_rerror(APLOG_MARK, APLOG_ERR, r, | |
2573 | @@ -1335,7 +1342,7 @@ | |
2574 | ap_pstrcat(r->pool, "MISS from ", | |
2575 | ap_get_server_name(r), NULL)); | |
2576 | /* The Content-Type of this response is the upstream one. */ | |
2577 | - r->content_type = ap_table_get (r->headers_out, "Content-Type"); | |
2578 | + r->content_type = ap_table_get(r->headers_out, "Content-Type"); | |
2579 | /* finally output the headers to the client */ | |
2580 | ap_send_http_header(r); | |
2581 | ||
2582 | @@ -1348,7 +1355,7 @@ | |
2583 | /* we need to set this for ap_proxy_send_fb()... */ | |
2584 | if (c != NULL) | |
2585 | c->cache_completion = 0; | |
2586 | - ap_proxy_send_fb(data, r, c, -1, 0, conf->io_buffer_size); | |
2587 | + ap_proxy_send_fb(data, r, c, -1, 0, 0, conf->io_buffer_size); | |
2588 | } | |
2589 | else { | |
2590 | send_dir(data, r, c, cwd); | |
2591 | @@ -1357,8 +1364,9 @@ | |
2592 | data = NULL; | |
2593 | dsock = -1; | |
2594 | ||
2595 | - /* We checked for 125||150||226||250 above. | |
2596 | - * See if another rc is pending, and fetch it: | |
2597 | + /* | |
2598 | + * We checked for 125||150||226||250 above. See if another rc is | |
2599 | + * pending, and fetch it: | |
2600 | */ | |
2601 | if (rc == 125 || rc == 150) | |
2602 | rc = ftp_getrc(ctrl); | |
2603 | @@ -1372,7 +1380,7 @@ | |
2604 | data = NULL; | |
2605 | dsock = -1; | |
2606 | } | |
2607 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: ABOR"); | |
2608 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: ABOR"); | |
2609 | /* responses: 225, 226, 421, 500, 501, 502 */ | |
2610 | /* 225 Data connection open; no transfer in progress. */ | |
2611 | /* 226 Closing data connection. */ | |
2612 | @@ -1381,7 +1389,7 @@ | |
2613 | /* 501 Syntax error in parameters or arguments. */ | |
2614 | /* 502 Command not implemented. */ | |
2615 | i = ftp_getrc(ctrl); | |
2616 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2617 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: returned status %d", i); | |
2618 | } | |
2619 | ||
2620 | ap_kill_timeout(r); | |
2621 | @@ -1390,12 +1398,12 @@ | |
2622 | /* finish */ | |
2623 | ap_bputs("QUIT" CRLF, ctrl); | |
2624 | ap_bflush(ctrl); | |
2625 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: QUIT"); | |
2626 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: QUIT"); | |
2627 | /* responses: 221, 500 */ | |
2628 | /* 221 Service closing control connection. */ | |
2629 | /* 500 Syntax error, command unrecognized. */ | |
2630 | i = ftp_getrc(ctrl); | |
2631 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "FTP: QUIT: status %d", i); | |
2632 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "FTP: QUIT: status %d", i); | |
2633 | ||
2634 | ap_bclose(ctrl); | |
2635 | ||
2636 | Index: modules/proxy/proxy_http.c | |
2637 | =================================================================== | |
2638 | RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_http.c,v | |
2639 | retrieving revision 1.88 | |
2640 | retrieving revision 1.95 | |
2641 | diff -u -b -u -r1.88 -r1.95 | |
2642 | --- modules/proxy/proxy_http.c 21 Mar 2002 11:38:03 -0000 1.88 | |
2643 | +++ modules/proxy/proxy_http.c 17 Apr 2002 16:04:32 -0000 1.95 | |
2644 | @@ -76,8 +76,8 @@ | |
2645 | const char *err; | |
2646 | int port; | |
2647 | ||
2648 | - /* do syntatic check. | |
2649 | - * We break the URL into host, port, path, search | |
2650 | + /* | |
2651 | + * do syntatic check. We break the URL into host, port, path, search | |
2652 | */ | |
2653 | port = def_port; | |
2654 | err = ap_proxy_canon_netloc(r->pool, &url, NULL, NULL, &host, &port); | |
2655 | @@ -85,9 +85,10 @@ | |
2656 | return HTTP_BAD_REQUEST; | |
2657 | ||
2658 | /* now parse path/search args, according to rfc1738 */ | |
2659 | - /* N.B. if this isn't a true proxy request, then the URL _path_ | |
2660 | - * has already been decoded. True proxy requests have r->uri | |
2661 | - * == r->unparsed_uri, and no others have that property. | |
2662 | + /* | |
2663 | + * N.B. if this isn't a true proxy request, then the URL _path_ has | |
2664 | + * already been decoded. True proxy requests have r->uri == | |
2665 | + * r->unparsed_uri, and no others have that property. | |
2666 | */ | |
2667 | if (r->uri == r->unparsed_uri) { | |
2668 | search = strchr(url, '?'); | |
2669 | @@ -163,18 +164,21 @@ | |
2670 | char portstr[32]; | |
2671 | pool *p = r->pool; | |
2672 | int destport = 0; | |
2673 | + int chunked = 0; | |
2674 | char *destportstr = NULL; | |
2675 | const char *urlptr = NULL; | |
2676 | const char *datestr, *urlstr; | |
2677 | + const char *content_length; | |
2678 | ||
2679 | void *sconf = r->server->module_config; | |
2680 | proxy_server_conf *conf = | |
2681 | - (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); | |
2682 | + (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module); | |
2683 | struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts; | |
2684 | struct nocache_entry *ncent = (struct nocache_entry *) conf->nocaches->elts; | |
2685 | int nocache = 0; | |
2686 | ||
2687 | - if (conf->cache.root == NULL) nocache = 1; | |
2688 | + if (conf->cache.root == NULL) | |
2689 | + nocache = 1; | |
2690 | ||
2691 | memset(&server, '\0', sizeof(server)); | |
2692 | server.sin_family = AF_INET; | |
2693 | @@ -232,8 +236,9 @@ | |
2694 | } | |
2695 | ||
2696 | ||
2697 | - /* we have worked out who exactly we are going to connect to, now | |
2698 | - * make that connection... | |
2699 | + /* | |
2700 | + * we have worked out who exactly we are going to connect to, now make | |
2701 | + * that connection... | |
2702 | */ | |
2703 | sock = ap_psocket(p, PF_INET, SOCK_STREAM, IPPROTO_TCP); | |
2704 | if (sock == -1) { | |
2705 | @@ -245,7 +250,7 @@ | |
2706 | #if !defined(TPF) && !defined(BEOS) | |
2707 | if (conf->recv_buffer_size) { | |
2708 | if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, | |
2709 | - (const char *) &conf->recv_buffer_size, sizeof(int)) | |
2710 | + (const char *)&conf->recv_buffer_size, sizeof(int)) | |
2711 | == -1) { | |
2712 | ap_log_rerror(APLOG_MARK, APLOG_ERR, r, | |
2713 | "setsockopt(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default"); | |
2714 | @@ -255,7 +260,7 @@ | |
2715 | ||
2716 | #ifdef SINIX_D_RESOLVER_BUG | |
2717 | { | |
2718 | - struct in_addr *ip_addr = (struct in_addr *) *server_hp.h_addr_list; | |
2719 | + struct in_addr *ip_addr = (struct in_addr *)*server_hp.h_addr_list; | |
2720 | ||
2721 | for (; ip_addr->s_addr != 0; ++ip_addr) { | |
2722 | memcpy(&server.sin_addr, ip_addr, sizeof(struct in_addr)); | |
2723 | @@ -287,16 +292,17 @@ | |
2724 | /* record request_time for HTTP/1.1 age calculation */ | |
2725 | c->req_time = time(NULL); | |
2726 | ||
2727 | - /* build upstream-request headers by stripping r->headers_in from | |
2728 | - * connection specific headers. | |
2729 | - * We must not remove the Connection: header from r->headers_in, | |
2730 | - * we still have to react to Connection: close | |
2731 | + /* | |
2732 | + * build upstream-request headers by stripping r->headers_in from | |
2733 | + * connection specific headers. We must not remove the Connection: header | |
2734 | + * from r->headers_in, we still have to react to Connection: close | |
2735 | */ | |
2736 | req_hdrs = ap_copy_table(r->pool, r->headers_in); | |
2737 | ap_proxy_clear_connection(r->pool, req_hdrs); | |
2738 | ||
2739 | - /* At this point, we start sending the HTTP/1.1 request to the | |
2740 | - * remote server (proxy or otherwise). | |
2741 | + /* | |
2742 | + * At this point, we start sending the HTTP/1.1 request to the remote | |
2743 | + * server (proxy or otherwise). | |
2744 | */ | |
2745 | f = ap_bcreate(p, B_RDWR | B_SOCKET); | |
2746 | ap_bpushfd(f, sock, sock); | |
2747 | @@ -313,12 +319,14 @@ | |
2748 | if (conf->viaopt == via_block) { | |
2749 | /* Block all outgoing Via: headers */ | |
2750 | ap_table_unset(req_hdrs, "Via"); | |
2751 | - } else if (conf->viaopt != via_off) { | |
2752 | + } | |
2753 | + else if (conf->viaopt != via_off) { | |
2754 | /* Create a "Via:" request header entry and merge it */ | |
2755 | i = ap_get_server_port(r); | |
2756 | - if (ap_is_default_port(i,r)) { | |
2757 | - strcpy(portstr,""); | |
2758 | - } else { | |
2759 | + if (ap_is_default_port(i, r)) { | |
2760 | + strcpy(portstr, ""); | |
2761 | + } | |
2762 | + else { | |
2763 | ap_snprintf(portstr, sizeof portstr, ":%d", i); | |
2764 | } | |
2765 | /* Generate outgoing Via: header with/without server comment: */ | |
2766 | @@ -336,20 +344,23 @@ | |
2767 | ); | |
2768 | } | |
2769 | ||
2770 | - /* Add X-Forwarded-For: so that the upstream has a chance to | |
2771 | - determine, where the original request came from. */ | |
2772 | + /* | |
2773 | + * Add X-Forwarded-For: so that the upstream has a chance to determine, | |
2774 | + * where the original request came from. | |
2775 | + */ | |
2776 | ap_table_mergen(req_hdrs, "X-Forwarded-For", r->connection->remote_ip); | |
2777 | ||
2778 | /* we don't yet support keepalives - but we will soon, I promise! */ | |
2779 | ap_table_set(req_hdrs, "Connection", "close"); | |
2780 | ||
2781 | reqhdrs_arr = ap_table_elts(req_hdrs); | |
2782 | - reqhdrs_elts = (table_entry *) reqhdrs_arr->elts; | |
2783 | + reqhdrs_elts = (table_entry *)reqhdrs_arr->elts; | |
2784 | for (i = 0; i < reqhdrs_arr->nelts; i++) { | |
2785 | if (reqhdrs_elts[i].key == NULL || reqhdrs_elts[i].val == NULL | |
2786 | ||
2787 | - /* Clear out hop-by-hop request headers not to send: | |
2788 | - * RFC2616 13.5.1 says we should strip these headers: | |
2789 | + /* | |
2790 | + * Clear out hop-by-hop request headers not to send: RFC2616 13.5.1 | |
2791 | + * says we should strip these headers: | |
2792 | */ | |
2793 | || !strcasecmp(reqhdrs_elts[i].key, "Host") /* Already sent */ | |
2794 | || !strcasecmp(reqhdrs_elts[i].key, "Keep-Alive") | |
2795 | @@ -357,15 +368,15 @@ | |
2796 | || !strcasecmp(reqhdrs_elts[i].key, "Trailer") | |
2797 | || !strcasecmp(reqhdrs_elts[i].key, "Transfer-Encoding") | |
2798 | || !strcasecmp(reqhdrs_elts[i].key, "Upgrade") | |
2799 | - | |
2800 | - /* XXX: @@@ FIXME: "Proxy-Authorization" should *only* be | |
2801 | - * suppressed if THIS server requested the authentication, | |
2802 | - * not when a frontend proxy requested it! | |
2803 | + /* | |
2804 | + * XXX: @@@ FIXME: "Proxy-Authorization" should *only* be suppressed | |
2805 | + * if THIS server requested the authentication, not when a frontend | |
2806 | + * proxy requested it! | |
2807 | * | |
2808 | - * The solution to this problem is probably to strip out | |
2809 | - * the Proxy-Authorisation header in the authorisation | |
2810 | - * code itself, not here. This saves us having to signal | |
2811 | - * somehow whether this request was authenticated or not. | |
2812 | + * The solution to this problem is probably to strip out the | |
2813 | + * Proxy-Authorisation header in the authorisation code itself, not | |
2814 | + * here. This saves us having to signal somehow whether this request | |
2815 | + * was authenticated or not. | |
2816 | */ | |
2817 | || !strcasecmp(reqhdrs_elts[i].key, "Proxy-Authorization")) | |
2818 | continue; | |
2819 | @@ -377,14 +388,17 @@ | |
2820 | ||
2821 | /* send the request data, if any. */ | |
2822 | if (ap_should_client_block(r)) { | |
2823 | - while ((i = ap_get_client_block(r, buffer, sizeof buffer)) > 0) | |
2824 | + while ((i = ap_get_client_block(r, buffer, sizeof buffer)) > 0) { | |
2825 | + ap_reset_timeout(r); | |
2826 | ap_bwrite(f, buffer, i); | |
2827 | } | |
2828 | + } | |
2829 | ap_bflush(f); | |
2830 | ap_kill_timeout(r); | |
2831 | ||
2832 | ||
2833 | - /* Right - now it's time to listen for a response. | |
2834 | + /* | |
2835 | + * Right - now it's time to listen for a response. | |
2836 | */ | |
2837 | ap_hard_timeout("proxy receive", r); | |
2838 | ||
2839 | @@ -397,16 +411,17 @@ | |
2840 | proxyhost ? proxyhost : desthost, len); | |
2841 | return ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2842 | "Error reading from remote server"); | |
2843 | - } else if (len == 0) { | |
2844 | + } | |
2845 | + else if (len == 0) { | |
2846 | ap_bclose(f); | |
2847 | ap_kill_timeout(r); | |
2848 | return ap_proxyerror(r, HTTP_BAD_GATEWAY, | |
2849 | "Document contains no data"); | |
2850 | } | |
2851 | ||
2852 | - /* Is it an HTTP/1 response? | |
2853 | - * Do some sanity checks on the response. | |
2854 | - * (This is buggy if we ever see an HTTP/1.10) | |
2855 | + /* | |
2856 | + * Is it an HTTP/1 response? Do some sanity checks on the response. (This | |
2857 | + * is buggy if we ever see an HTTP/1.10) | |
2858 | */ | |
2859 | if (ap_checkmask(buffer, "HTTP/#.# ###*")) { | |
2860 | int major, minor; | |
2861 | @@ -436,7 +451,7 @@ | |
2862 | ||
2863 | resp_hdrs = ap_proxy_read_headers(r, buffer, HUGE_STRING_LEN, f); | |
2864 | if (resp_hdrs == NULL) { | |
2865 | - ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server, | |
2866 | + ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, r->server, | |
2867 | "proxy: Bad HTTP/%d.%d header returned by %s (%s)", | |
2868 | major, minor, r->uri, r->method); | |
2869 | resp_hdrs = ap_make_table(p, 20); | |
2870 | @@ -447,9 +462,10 @@ | |
2871 | if (conf->viaopt != via_off && conf->viaopt != via_block) { | |
2872 | /* Create a "Via:" response header entry and merge it */ | |
2873 | i = ap_get_server_port(r); | |
2874 | - if (ap_is_default_port(i,r)) { | |
2875 | - strcpy(portstr,""); | |
2876 | - } else { | |
2877 | + if (ap_is_default_port(i, r)) { | |
2878 | + strcpy(portstr, ""); | |
2879 | + } | |
2880 | + else { | |
2881 | ap_snprintf(portstr, sizeof portstr, ":%d", i); | |
2882 | } | |
2883 | ap_table_mergen((table *)resp_hdrs, "Via", | |
2884 | @@ -464,11 +480,21 @@ | |
2885 | ); | |
2886 | } | |
2887 | ||
2888 | - /* strip hop-by-hop headers defined by Connection */ | |
2889 | + /* is this content chunked? */ | |
2890 | + chunked = ap_find_last_token(r->pool, | |
2891 | + ap_table_get(resp_hdrs, "Transfer-Encoding"), | |
2892 | + "chunked"); | |
2893 | + | |
2894 | + /* strip hop-by-hop headers defined by Connection and RFC2616 */ | |
2895 | ap_proxy_clear_connection(p, resp_hdrs); | |
2896 | + | |
2897 | + content_length = ap_table_get(resp_hdrs, "Content-Length"); | |
2898 | + if (content_length != NULL) | |
2899 | + c->len = strtol(content_length, NULL, 10); | |
2900 | + | |
2901 | /* Now add out bound headers set by other modules */ | |
2902 | resp_hdrs = ap_overlay_tables(r->pool, r->err_headers_out, resp_hdrs); | |
2903 | -} | |
2904 | + } | |
2905 | else { | |
2906 | /* an http/0.9 response */ | |
2907 | backasswards = 1; | |
2908 | @@ -482,10 +508,11 @@ | |
2909 | ap_kill_timeout(r); | |
2910 | ||
2911 | /* | |
2912 | - * HTTP/1.1 requires us to accept 3 types of dates, but only generate | |
2913 | - * one type | |
2914 | + * HTTP/1.1 requires us to accept 3 types of dates, but only generate one | |
2915 | + * type | |
2916 | */ | |
2917 | - /* we SET the dates here, obliterating possible multiple dates, as only | |
2918 | + /* | |
2919 | + * we SET the dates here, obliterating possible multiple dates, as only | |
2920 | * one of each date makes sense in each response. | |
2921 | */ | |
2922 | if ((datestr = ap_table_get(resp_hdrs, "Date")) != NULL) | |
2923 | @@ -501,7 +528,7 @@ | |
2924 | if ((urlstr = ap_table_get(resp_hdrs, "URI")) != NULL) | |
2925 | ap_table_set(resp_hdrs, "URI", proxy_location_reverse_map(r, urlstr)); | |
2926 | if ((urlstr = ap_table_get(resp_hdrs, "Content-Location")) != NULL) | |
2927 | - ap_table_set(resp_hdrs, "Content-Location", proxy_location_reverse_map(r , urlstr)); | |
2928 | + ap_table_set(resp_hdrs, "Content-Location", proxy_location_reverse_map(r, urlstr)); | |
2929 | ||
2930 | /* check if NoCache directive on this host */ | |
2931 | if (nocache == 0) { | |
2932 | @@ -515,8 +542,9 @@ | |
2933 | } | |
2934 | } | |
2935 | ||
2936 | - /* update the cache file, possibly even fulfilling the request if | |
2937 | - * it turns out a conditional allowed us to serve the object from the | |
2938 | + /* | |
2939 | + * update the cache file, possibly even fulfilling the request if it | |
2940 | + * turns out a conditional allowed us to serve the object from the | |
2941 | * cache... | |
2942 | */ | |
2943 | i = ap_proxy_cache_update(c, resp_hdrs, !backasswards, nocache); | |
2944 | @@ -530,20 +558,22 @@ | |
2945 | } | |
2946 | ||
2947 | /* Setup the headers for our client from upstreams response-headers */ | |
2948 | - ap_overlap_tables(r->headers_out, resp_hdrs, AP_OVERLAP_TABLES_SET); | |
2949 | + ap_proxy_table_replace(r->headers_out, resp_hdrs); | |
2950 | /* Add X-Cache header - be careful not to obliterate any upstream headers */ | |
2951 | ap_table_mergen(r->headers_out, "X-Cache", | |
2952 | ap_pstrcat(r->pool, "MISS from ", | |
2953 | ap_get_server_name(r), NULL)); | |
2954 | /* The Content-Type of this response is the upstream one. */ | |
2955 | - r->content_type = ap_table_get (r->headers_out, "Content-Type"); | |
2956 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "Content-Type: %s", r->content_type); | |
2957 | + r->content_type = ap_table_get(r->headers_out, "Content-Type"); | |
2958 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "Content-Type: %s", r->content_type); | |
2959 | ||
2960 | /* finally output the headers to the client */ | |
2961 | ap_send_http_header(r); | |
2962 | ||
2963 | - /* Is it an HTTP/0.9 respose? If so, send the extra data we read | |
2964 | - from upstream as the start of the reponse to client */ | |
2965 | + /* | |
2966 | + * Is it an HTTP/0.9 respose? If so, send the extra data we read from | |
2967 | + * upstream as the start of the reponse to client | |
2968 | + */ | |
2969 | if (backasswards) { | |
2970 | ap_hard_timeout("proxy send assbackward", r); | |
2971 | ||
2972 | @@ -558,11 +588,13 @@ | |
2973 | ||
2974 | ||
2975 | #ifdef CHARSET_EBCDIC | |
2976 | - /* What we read/write after the header should not be modified | |
2977 | - * (i.e., the cache copy is ASCII, not EBCDIC, even for text/html) | |
2978 | + /* | |
2979 | + * What we read/write after the header should not be modified (i.e., the | |
2980 | + * cache copy is ASCII, not EBCDIC, even for text/html) | |
2981 | */ | |
2982 | - ap_bsetflag(f, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0); | |
2983 | - ap_bsetflag(r->connection->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0); | |
2984 | + r->ebcdic.conv_in = r->ebcdic.conv_out = 0; | |
2985 | + ap_bsetflag(f, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 0); | |
2986 | + ap_bsetflag(r->connection->client, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 0); | |
2987 | #endif | |
2988 | ||
2989 | /* send body */ | |
2990 | @@ -578,7 +610,7 @@ | |
2991 | * content length is not known. We need to make 100% sure c->len is always | |
2992 | * set correctly before we get here to correctly do keepalive. | |
2993 | */ | |
2994 | - ap_proxy_send_fb(f, r, c, c->len, 0, conf->io_buffer_size); | |
2995 | + ap_proxy_send_fb(f, r, c, c->len, 0, chunked, conf->io_buffer_size); | |
2996 | } | |
2997 | ||
2998 | /* ap_proxy_send_fb() closes the socket f for us */ | |
2999 | Index: modules/proxy/proxy_util.c | |
3000 | =================================================================== | |
3001 | RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_util.c,v | |
3002 | retrieving revision 1.109 | |
3003 | retrieving revision 1.119 | |
3004 | diff -u -b -u -r1.109 -r1.119 | |
3005 | --- modules/proxy/proxy_util.c 21 Mar 2002 11:38:03 -0000 1.109 | |
3006 | +++ modules/proxy/proxy_util.c 15 Apr 2002 09:41:22 -0000 1.119 | |
3007 | @@ -73,9 +73,10 @@ | |
3008 | /* already called in the knowledge that the characters are hex digits */ | |
3009 | int ap_proxy_hex2c(const char *x) | |
3010 | { | |
3011 | - int i, ch; | |
3012 | - | |
3013 | + int i; | |
3014 | #ifndef CHARSET_EBCDIC | |
3015 | + int ch; | |
3016 | + | |
3017 | ch = x[0]; | |
3018 | if (ap_isdigit(ch)) | |
3019 | i = ch - '0'; | |
3020 | @@ -93,9 +94,9 @@ | |
3021 | else | |
3022 | i += ch - ('a' - 10); | |
3023 | return i; | |
3024 | -#else /*CHARSET_EBCDIC*/ | |
3025 | - return (1 == sscanf(x, "%2x", &i)) ? os_toebcdic[i&0xFF] : 0; | |
3026 | -#endif /*CHARSET_EBCDIC*/ | |
3027 | +#else /* CHARSET_EBCDIC */ | |
3028 | + return (1 == sscanf(x, "%2x", &i)) ? os_toebcdic[i & 0xFF] : 0; | |
3029 | +#endif /* CHARSET_EBCDIC */ | |
3030 | } | |
3031 | ||
3032 | void ap_proxy_c2hex(int ch, char *x) | |
3033 | @@ -115,14 +116,14 @@ | |
3034 | x[2] = ('A' - 10) + i; | |
3035 | else | |
3036 | x[2] = '0' + i; | |
3037 | -#else /*CHARSET_EBCDIC*/ | |
3038 | - static const char ntoa[] = { "0123456789ABCDEF" }; | |
3039 | +#else /* CHARSET_EBCDIC */ | |
3040 | + static const char ntoa[] = {"0123456789ABCDEF"}; | |
3041 | ch = os_toascii[ch & 0xFF]; | |
3042 | x[0] = '%'; | |
3043 | - x[1] = ntoa[(ch>>4)&0x0F]; | |
3044 | - x[2] = ntoa[ch&0x0F]; | |
3045 | + x[1] = ntoa[(ch >> 4) & 0x0F]; | |
3046 | + x[2] = ntoa[ch & 0x0F]; | |
3047 | x[3] = '\0'; | |
3048 | -#endif /*CHARSET_EBCDIC*/ | |
3049 | +#endif /* CHARSET_EBCDIC */ | |
3050 | } | |
3051 | ||
3052 | /* | |
3053 | @@ -267,7 +268,8 @@ | |
3054 | /* if (i == 0) the no port was given; keep default */ | |
3055 | if (strp[i] != '\0') { | |
3056 | return "Bad port number in URL"; | |
3057 | - } else if (i > 0) { | |
3058 | + } | |
3059 | + else if (i > 0) { | |
3060 | *port = atoi(strp); | |
3061 | if (*port > 65535) | |
3062 | return "Port number in URL > 65535"; | |
3063 | @@ -299,7 +301,7 @@ | |
3064 | return NULL; | |
3065 | } | |
3066 | ||
3067 | -static const char * const lwday[7] = | |
3068 | +static const char *const lwday[7] = | |
3069 | {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; | |
3070 | ||
3071 | /* | |
3072 | @@ -365,63 +367,6 @@ | |
3073 | } | |
3074 | ||
3075 | ||
3076 | -/* NOTE: This routine is taken from http_protocol::getline() | |
3077 | - * because the old code found in the proxy module was too | |
3078 | - * difficult to understand and maintain. | |
3079 | - */ | |
3080 | -/* Get a line of protocol input, including any continuation lines | |
3081 | - * caused by MIME folding (or broken clients) if fold != 0, and place it | |
3082 | - * in the buffer s, of size n bytes, without the ending newline. | |
3083 | - * | |
3084 | - * Returns -1 on error, or the length of s. | |
3085 | - * | |
3086 | - * Note: Because bgets uses 1 char for newline and 1 char for NUL, | |
3087 | - * the most we can get is (n - 2) actual characters if it | |
3088 | - * was ended by a newline, or (n - 1) characters if the line | |
3089 | - * length exceeded (n - 1). So, if the result == (n - 1), | |
3090 | - * then the actual input line exceeded the buffer length, | |
3091 | - * and it would be a good idea for the caller to puke 400 or 414. | |
3092 | - */ | |
3093 | -static int proxy_getline(char *s, int n, BUFF *in, int fold) | |
3094 | -{ | |
3095 | - char *pos, next; | |
3096 | - int retval; | |
3097 | - int total = 0; | |
3098 | - | |
3099 | - pos = s; | |
3100 | - | |
3101 | - do { | |
3102 | - retval = ap_bgets(pos, n, in); /* retval == -1 if error, 0 if EOF */ | |
3103 | - | |
3104 | - if (retval <= 0) | |
3105 | - return ((retval < 0) && (total == 0)) ? -1 : total; | |
3106 | - | |
3107 | - /* retval is the number of characters read, not including NUL */ | |
3108 | - | |
3109 | - n -= retval; /* Keep track of how much of s is full */ | |
3110 | - pos += (retval - 1); /* and where s ends */ | |
3111 | - total += retval; /* and how long s has become */ | |
3112 | - | |
3113 | - if (*pos == '\n') { /* Did we get a full line of input? */ | |
3114 | - *pos = '\0'; | |
3115 | - --total; | |
3116 | - ++n; | |
3117 | - } | |
3118 | - else | |
3119 | - return total; /* if not, input line exceeded buffer size */ | |
3120 | - | |
3121 | - /* Continue appending if line folding is desired and | |
3122 | - * the last line was not empty and we have room in the buffer and | |
3123 | - * the next line begins with a continuation character. | |
3124 | - */ | |
3125 | - } while (fold && (retval != 1) && (n > 1) | |
3126 | - && (ap_blookc(&next, in) == 1) | |
3127 | - && ((next == ' ') || (next == '\t'))); | |
3128 | - | |
3129 | - return total; | |
3130 | -} | |
3131 | - | |
3132 | - | |
3133 | /* | |
3134 | * Reads headers from a buffer and returns an array of headers. | |
3135 | * Returns NULL on file error | |
3136 | @@ -445,37 +390,40 @@ | |
3137 | * Read header lines until we get the empty separator line, a read error, | |
3138 | * the connection closes (EOF), or we timeout. | |
3139 | */ | |
3140 | - while ((len = proxy_getline(buffer, size, f, 1)) > 0) { | |
3141 | + while ((len = ap_getline(buffer, size, f, 1)) > 0) { | |
3142 | ||
3143 | if (!(value = strchr(buffer, ':'))) { /* Find the colon separator */ | |
3144 | ||
3145 | - /* Buggy MS IIS servers sometimes return invalid headers | |
3146 | - * (an extra "HTTP/1.0 200, OK" line sprinkled in between | |
3147 | - * the usual MIME headers). Try to deal with it in a sensible | |
3148 | - * way, but log the fact. | |
3149 | - * XXX: The mask check is buggy if we ever see an HTTP/1.10 */ | |
3150 | + /* | |
3151 | + * Buggy MS IIS servers sometimes return invalid headers (an | |
3152 | + * extra "HTTP/1.0 200, OK" line sprinkled in between the usual | |
3153 | + * MIME headers). Try to deal with it in a sensible way, but log | |
3154 | + * the fact. XXX: The mask check is buggy if we ever see an | |
3155 | + * HTTP/1.10 | |
3156 | + */ | |
3157 | ||
3158 | if (!ap_checkmask(buffer, "HTTP/#.# ###*")) { | |
3159 | /* Nope, it wasn't even an extra HTTP header. Give up. */ | |
3160 | return NULL; | |
3161 | } | |
3162 | ||
3163 | - ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server, | |
3164 | - "proxy: Ignoring duplicate HTTP header " | |
3165 | - "returned by %s (%s)", r->uri, r->method); | |
3166 | + ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, r->server, | |
3167 | + "proxy: Ignoring duplicate HTTP status line " | |
3168 | + "returned by buggy server %s (%s)", r->uri, r->method); | |
3169 | continue; | |
3170 | } | |
3171 | ||
3172 | *value = '\0'; | |
3173 | ++value; | |
3174 | - /* XXX: RFC2068 defines only SP and HT as whitespace, this test is | |
3175 | + /* | |
3176 | + * XXX: RFC2068 defines only SP and HT as whitespace, this test is | |
3177 | * wrong... and so are many others probably. | |
3178 | */ | |
3179 | while (ap_isspace(*value)) | |
3180 | ++value; /* Skip to start of value */ | |
3181 | ||
3182 | /* should strip trailing whitespace as well */ | |
3183 | - for (end = &value[strlen(value)-1]; end > value && ap_isspace(*end); --end) | |
3184 | + for (end = &value[strlen(value) - 1]; end > value && ap_isspace(*end); --end) | |
3185 | *end = '\0'; | |
3186 | ||
3187 | /* make sure we add so as not to destroy duplicated headers */ | |
3188 | @@ -483,7 +431,7 @@ | |
3189 | ||
3190 | /* the header was too long; at the least we should skip extra data */ | |
3191 | if (len >= size - 1) { | |
3192 | - while ((len = proxy_getline(field, MAX_STRING_LEN, f, 1)) | |
3193 | + while ((len = ap_getline(field, MAX_STRING_LEN, f, 1)) | |
3194 | >= MAX_STRING_LEN - 1) { | |
3195 | /* soak up the extra data */ | |
3196 | } | |
3197 | @@ -494,23 +442,28 @@ | |
3198 | return resp_hdrs; | |
3199 | } | |
3200 | ||
3201 | -/* read data from f, write it to: | |
3202 | +/* read data from (socket BUFF*) f, write it to: | |
3203 | * - c->fp, if it is open | |
3204 | * - r->connection->client, if nowrite == 0 | |
3205 | */ | |
3206 | ||
3207 | -long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c, off_t len, int nowrite, size_t recv_buffer_size) | |
3208 | +long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c, off_t len, int nowrite, int chunked, size_t recv_buffer_size) | |
3209 | { | |
3210 | - int ok; | |
3211 | + int ok, end_of_chunk; | |
3212 | char *buf; | |
3213 | size_t buf_size; | |
3214 | + size_t remaining = 0; | |
3215 | long total_bytes_rcvd; | |
3216 | - register int n, o, w; | |
3217 | + register int n = 0, o, w; | |
3218 | conn_rec *con = r->connection; | |
3219 | - int alternate_timeouts = 1; /* 1 if we alternate between soft & hard timeouts */ | |
3220 | + int alternate_timeouts = 1; /* 1 if we alternate between soft & hard | |
3221 | + * timeouts */ | |
3222 | ||
3223 | /* allocate a buffer to store the bytes in */ | |
3224 | - /* make sure it is at least IOBUFSIZE, as recv_buffer_size may be zero for system default */ | |
3225 | + /* | |
3226 | + * make sure it is at least IOBUFSIZE, as recv_buffer_size may be zero | |
3227 | + * for system default | |
3228 | + */ | |
3229 | buf_size = MAX(recv_buffer_size, IOBUFSIZE); | |
3230 | buf = ap_palloc(r->pool, buf_size); | |
3231 | ||
3232 | @@ -520,15 +473,14 @@ | |
3233 | ||
3234 | #ifdef CHARSET_EBCDIC | |
3235 | /* The cache copy is ASCII, not EBCDIC, even for text/html) */ | |
3236 | - ap_bsetflag(f, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0); | |
3237 | - if (c != NULL && c->fp != NULL) | |
3238 | - ap_bsetflag(c->fp, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0); | |
3239 | - ap_bsetflag(con->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 0); | |
3240 | + ap_bsetflag(f, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 0); | |
3241 | + ap_bsetflag(con->client, B_ASCII2EBCDIC | B_EBCDIC2ASCII, 0); | |
3242 | #endif | |
3243 | ||
3244 | - /* Since we are reading from one buffer and writing to another, | |
3245 | - * it is unsafe to do a soft_timeout here, at least until the proxy | |
3246 | - * has its own timeout handler which can set both buffers to EOUT. | |
3247 | + /* | |
3248 | + * Since we are reading from one buffer and writing to another, it is | |
3249 | + * unsafe to do a soft_timeout here, at least until the proxy has its own | |
3250 | + * timeout handler which can set both buffers to EOUT. | |
3251 | */ | |
3252 | ||
3253 | ap_kill_timeout(r); | |
3254 | @@ -538,12 +490,13 @@ | |
3255 | ap_hard_timeout("proxy send body", r); | |
3256 | alternate_timeouts = 0; | |
3257 | #else | |
3258 | - /* CHECKME! Since hard_timeout won't work in unix on sends with partial | |
3259 | - * cache completion, we have to alternate between hard_timeout | |
3260 | - * for reads, and soft_timeout for send. This is because we need | |
3261 | - * to get a return from ap_bwrite to be able to continue caching. | |
3262 | - * BUT, if we *can't* continue anyway, just use hard_timeout. | |
3263 | - * (Also, if no cache file is written, use hard timeouts) | |
3264 | + /* | |
3265 | + * CHECKME! Since hard_timeout won't work in unix on sends with partial | |
3266 | + * cache completion, we have to alternate between hard_timeout for reads, | |
3267 | + * and soft_timeout for send. This is because we need to get a return | |
3268 | + * from ap_bwrite to be able to continue caching. BUT, if we *can't* | |
3269 | + * continue anyway, just use hard_timeout. (Also, if no cache file is | |
3270 | + * written, use hard timeouts) | |
3271 | */ | |
3272 | ||
3273 | if (c == NULL || c->len <= 0 || c->cache_completion == 1.0) { | |
3274 | @@ -552,22 +505,92 @@ | |
3275 | } | |
3276 | #endif | |
3277 | ||
3278 | - /* Loop and ap_bread() while we can successfully read and write, | |
3279 | - * or (after the client aborted) while we can successfully | |
3280 | - * read and finish the configured cache_completion. | |
3281 | + /* | |
3282 | + * Loop and ap_bread() while we can successfully read and write, or | |
3283 | + * (after the client aborted) while we can successfully read and finish | |
3284 | + * the configured cache_completion. | |
3285 | */ | |
3286 | - for (ok = 1; ok; ) { | |
3287 | + for (end_of_chunk = ok = 1; ok;) { | |
3288 | if (alternate_timeouts) | |
3289 | ap_hard_timeout("proxy recv body from upstream server", r); | |
3290 | ||
3291 | - /* Read block from server */ | |
3292 | + | |
3293 | + /* read a chunked block */ | |
3294 | + if (chunked) { | |
3295 | + long chunk_start = 0; | |
3296 | + n = 0; | |
3297 | + | |
3298 | + /* start of a new chunk */ | |
3299 | + if (end_of_chunk) { | |
3300 | + end_of_chunk = 0; | |
3301 | + /* get the chunk size from the stream */ | |
3302 | + chunk_start = ap_getline(buf, buf_size, f, 0); | |
3303 | + if ((chunk_start <= 0) || ((size_t)chunk_start + 1 >= buf_size) || !ap_isxdigit(*buf)) { | |
3304 | + n = -1; | |
3305 | + } | |
3306 | + /* parse the chunk size */ | |
3307 | + else { | |
3308 | + remaining = ap_get_chunk_size(buf); | |
3309 | + if (remaining == 0) { /* Last chunk indicated, get footers */ | |
3310 | + /* as we are a proxy, we discard the footers, as the headers | |
3311 | + * have already been sent at this point. | |
3312 | + */ | |
3313 | + if (NULL == ap_proxy_read_headers(r, buf, buf_size, f)) { | |
3314 | + n = -1; | |
3315 | + } | |
3316 | + } | |
3317 | + } | |
3318 | + } | |
3319 | + | |
3320 | + /* read the chunk */ | |
3321 | + if (remaining > 0) { | |
3322 | + n = ap_bread(f, buf, MIN((int)buf_size, (int)remaining)); | |
3323 | + if (n > -1) { | |
3324 | + remaining -= n; | |
3325 | + end_of_chunk = (remaining == 0); | |
3326 | + } | |
3327 | + } | |
3328 | + | |
3329 | + /* soak up trailing CRLF */ | |
3330 | + if (end_of_chunk) { | |
3331 | + int ch; /* int because it may hold an EOF */ | |
3332 | + /* | |
3333 | + * For EBCDIC, the proxy has configured the BUFF layer to | |
3334 | + * transparently pass the ascii characters thru (also writing | |
3335 | + * an ASCII copy to the cache, where appropriate). | |
3336 | + * Therefore, we see here an ASCII-CRLF (\015\012), | |
3337 | + * not an EBCDIC-CRLF (\r\n). | |
3338 | + */ | |
3339 | + if ((ch = ap_bgetc(f)) == EOF) { | |
3340 | + /* Protocol error: EOF detected within chunk */ | |
3341 | + n = -1; | |
3342 | + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r, | |
3343 | + "proxy: remote protocol error, eof while reading chunked from proxy"); | |
3344 | + } | |
3345 | + else | |
3346 | + { | |
3347 | + if (ch == '\015') { /* _ASCII_ CR */ | |
3348 | + ch = ap_bgetc(f); | |
3349 | + } | |
3350 | + if (ch != '\012') { | |
3351 | + n = -1; | |
3352 | + } | |
3353 | + } | |
3354 | + } | |
3355 | + } | |
3356 | + | |
3357 | + /* otherwise read block normally */ | |
3358 | + else { | |
3359 | if (-1 == len) { | |
3360 | n = ap_bread(f, buf, buf_size); | |
3361 | } | |
3362 | else { | |
3363 | - n = ap_bread(f, buf, MIN((off_t)buf_size, len - total_bytes_rcvd)); | |
3364 | + n = ap_bread(f, buf, MIN((int)buf_size, | |
3365 | + (int)(len - total_bytes_rcvd))); | |
3366 | + } | |
3367 | } | |
3368 | ||
3369 | + | |
3370 | if (alternate_timeouts) | |
3371 | ap_kill_timeout(r); | |
3372 | else | |
3373 | @@ -587,11 +610,12 @@ | |
3374 | total_bytes_rcvd += n; | |
3375 | ||
3376 | /* if we've received everything... */ | |
3377 | - /* in the case of slow frontends and expensive backends, | |
3378 | - * we want to avoid leaving a backend connection hanging | |
3379 | - * while the frontend takes it's time to absorb the bytes. | |
3380 | - * so: if we just read the last block, we close the backend | |
3381 | - * connection now instead of later - it's no longer needed. | |
3382 | + /* | |
3383 | + * in the case of slow frontends and expensive backends, we want to | |
3384 | + * avoid leaving a backend connection hanging while the frontend | |
3385 | + * takes it's time to absorb the bytes. so: if we just read the last | |
3386 | + * block, we close the backend connection now instead of later - it's | |
3387 | + * no longer needed. | |
3388 | */ | |
3389 | if (total_bytes_rcvd == len) { | |
3390 | ap_bclose(f); | |
3391 | @@ -599,13 +623,17 @@ | |
3392 | } | |
3393 | ||
3394 | /* Write to cache first. */ | |
3395 | - /*@@@ XXX FIXME: Assuming that writing the cache file won't time out?!!? */ | |
3396 | + /* | |
3397 | + * @@@ XXX FIXME: Assuming that writing the cache file won't time | |
3398 | + * out?!!? | |
3399 | + */ | |
3400 | if (c != NULL && c->fp != NULL) { | |
3401 | if (ap_bwrite(c->fp, &buf[0], n) != n) { | |
3402 | ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, | |
3403 | "proxy: error writing to %s", c->tempfile); | |
3404 | c = ap_proxy_cache_error(c); | |
3405 | - } else { | |
3406 | + } | |
3407 | + else { | |
3408 | c->written += n; | |
3409 | } | |
3410 | } | |
3411 | @@ -624,16 +652,17 @@ | |
3412 | ||
3413 | if (w <= 0) { | |
3414 | if (c != NULL) { | |
3415 | - /* when a send failure occurs, we need to decide | |
3416 | - * whether to continue loading and caching the | |
3417 | - * document, or to abort the whole thing | |
3418 | + /* | |
3419 | + * when a send failure occurs, we need to decide whether | |
3420 | + * to continue loading and caching the document, or to | |
3421 | + * abort the whole thing | |
3422 | */ | |
3423 | ok = (c->len > 0) && | |
3424 | (c->cache_completion > 0) && | |
3425 | (c->len * c->cache_completion < total_bytes_rcvd); | |
3426 | ||
3427 | - if (! ok) { | |
3428 | - if (c->fp!=NULL) { | |
3429 | + if (!ok) { | |
3430 | + if (c->fp != NULL) { | |
3431 | ap_pclosef(c->req->pool, ap_bfileno(c->fp, B_WR)); | |
3432 | c->fp = NULL; | |
3433 | } | |
3434 | @@ -706,7 +735,7 @@ | |
3435 | int len, i; | |
3436 | const char *p; | |
3437 | char valbuf[HUGE_STRING_LEN]; | |
3438 | - valbuf[sizeof(valbuf)-1] = 0; /* safety terminating zero */ | |
3439 | + valbuf[sizeof(valbuf) - 1] = 0; /* safety terminating zero */ | |
3440 | ||
3441 | len = strlen(key); | |
3442 | ||
3443 | @@ -734,7 +763,7 @@ | |
3444 | while (ap_isspace(*list)) { | |
3445 | list++; | |
3446 | } | |
3447 | - strncpy(valbuf, list, MIN(p-list, sizeof(valbuf)-1)); | |
3448 | + strncpy(valbuf, list, MIN(p - list, sizeof(valbuf) - 1)); | |
3449 | *val = valbuf; | |
3450 | } | |
3451 | return 1; | |
3452 | @@ -760,7 +789,7 @@ | |
3453 | static const char enc_table[32] = "abcdefghijklmnopqrstuvwxyz012345"; | |
3454 | ||
3455 | ap_MD5Init(&context); | |
3456 | - ap_MD5Update(&context, (const unsigned char *) it, strlen(it)); | |
3457 | + ap_MD5Update(&context, (const unsigned char *)it, strlen(it)); | |
3458 | ap_MD5Final(digest, &context); | |
3459 | ||
3460 | /* encode 128 bits as 26 characters, using a modified uuencoding */ | |
3461 | @@ -805,8 +834,10 @@ | |
3462 | int i, k, d; | |
3463 | unsigned int x; | |
3464 | #if defined(MPE) || (defined(AIX) && defined(__ps2__)) | |
3465 | - /* Believe it or not, AIX 1.x does not allow you to name a file '@', | |
3466 | - * so hack around it in the encoding. */ | |
3467 | + /* | |
3468 | + * Believe it or not, AIX 1.x does not allow you to name a file '@', so | |
3469 | + * hack around it in the encoding. | |
3470 | + */ | |
3471 | static const char enc_table[64] = | |
3472 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_%"; | |
3473 | #else | |
3474 | @@ -815,7 +846,7 @@ | |
3475 | #endif | |
3476 | ||
3477 | ap_MD5Init(&context); | |
3478 | - ap_MD5Update(&context, (const unsigned char *) it, strlen(it)); | |
3479 | + ap_MD5Update(&context, (const unsigned char *)it, strlen(it)); | |
3480 | ap_MD5Final(digest, &context); | |
3481 | ||
3482 | /* encode 128 bits as 22 characters, using a modified uuencoding */ | |
3483 | @@ -867,7 +898,7 @@ | |
3484 | } | |
3485 | /* no longer necessary, as the source hex is 8-byte int */ | |
3486 | /* if (j == 0xffffffff)*/ | |
3487 | -/* return -1;*/ /* so that it works with 8-byte ints */ | |
3488 | + /* return -1;*//* so that it works with 8-byte ints */ | |
3489 | /* else */ | |
3490 | return j; | |
3491 | } | |
3492 | @@ -938,7 +969,7 @@ | |
3493 | * This routine returns its own error message | |
3494 | */ | |
3495 | const char * | |
3496 | - ap_proxy_host2addr(const char *host, struct hostent *reqhp) | |
3497 | + ap_proxy_host2addr(const char *host, struct hostent * reqhp) | |
3498 | { | |
3499 | int i; | |
3500 | struct hostent *hp; | |
3501 | @@ -955,14 +986,14 @@ | |
3502 | } | |
3503 | else { | |
3504 | ptd->ipaddr = ap_inet_addr(host); | |
3505 | - hp = gethostbyaddr((char *) &ptd->ipaddr, sizeof(ptd->ipaddr), AF_INET); | |
3506 | + hp = gethostbyaddr((char *)&ptd->ipaddr, sizeof(ptd->ipaddr), AF_INET); | |
3507 | if (hp == NULL) { | |
3508 | memset(&ptd->hpbuf, 0, sizeof(ptd->hpbuf)); | |
3509 | ptd->hpbuf.h_name = 0; | |
3510 | ptd->hpbuf.h_addrtype = AF_INET; | |
3511 | ptd->hpbuf.h_length = sizeof(ptd->ipaddr); | |
3512 | ptd->hpbuf.h_addr_list = ptd->charpbuf; | |
3513 | - ptd->hpbuf.h_addr_list[0] = (char *) &ptd->ipaddr; | |
3514 | + ptd->hpbuf.h_addr_list[0] = (char *)&ptd->ipaddr; | |
3515 | ptd->hpbuf.h_addr_list[1] = 0; | |
3516 | hp = &ptd->hpbuf; | |
3517 | } | |
3518 | @@ -985,12 +1016,13 @@ | |
3519 | || url[1] != '/' || url[2] != '/') | |
3520 | return NULL; | |
3521 | ||
3522 | - url = ap_pstrdup(r->pool, &url[1]); /* make it point to "//", which is what proxy_canon_netloc expects */ | |
3523 | + url = ap_pstrdup(r->pool, &url[1]); /* make it point to "//", which is | |
3524 | + * what proxy_canon_netloc expects */ | |
3525 | ||
3526 | err = ap_proxy_canon_netloc(r->pool, &url, &user, &password, &host, &port); | |
3527 | ||
3528 | if (err != NULL) | |
3529 | - ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r, | |
3530 | + ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, r, | |
3531 | "%s", err); | |
3532 | ||
3533 | r->hostname = host; | |
3534 | @@ -1011,9 +1043,12 @@ | |
3535 | /* "partial" addresses (with less than 4 quads) correctly, i.e. */ | |
3536 | /* 192.168.123 is parsed as 192.168.0.123, which is not what I want. */ | |
3537 | /* I therefore have to parse the IP address manually: */ | |
3538 | - /*if (proxy_readmask(This->name, &This->addr.s_addr, &This->mask.s_addr) == 0) */ | |
3539 | + /* | |
3540 | + * if (proxy_readmask(This->name, &This->addr.s_addr, &This->mask.s_addr) | |
3541 | + * == 0) | |
3542 | + */ | |
3543 | /* addr and mask were set by proxy_readmask() */ | |
3544 | - /*return 1; */ | |
3545 | + /* return 1; */ | |
3546 | ||
3547 | /* Parse IP addr manually, optionally allowing */ | |
3548 | /* abbreviated net addresses like 192.168. */ | |
3549 | @@ -1070,7 +1105,10 @@ | |
3550 | while (quads > 0 && ip_addr[quads - 1] == 0) | |
3551 | --quads; | |
3552 | ||
3553 | - /* "IP Address should be given in dotted-quad form, optionally followed by a netmask (e.g., 192.168.111.0/24)"; */ | |
3554 | + /* | |
3555 | + * "IP Address should be given in dotted-quad form, optionally | |
3556 | + * followed by a netmask (e.g., 192.168.111.0/24)"; | |
3557 | + */ | |
3558 | if (quads < 1) | |
3559 | return 0; | |
3560 | ||
3561 | @@ -1157,7 +1195,7 @@ | |
3562 | ||
3563 | /* Try to deal with multiple IP addr's for a host */ | |
3564 | for (ip_listptr = the_host.h_addr_list; *ip_listptr; ++ip_listptr) { | |
3565 | - ip_list = (struct in_addr *) *ip_listptr; | |
3566 | + ip_list = (struct in_addr *)*ip_listptr; | |
3567 | if (This->addr.s_addr == (ip_list->s_addr & This->mask.s_addr)) { | |
3568 | #if DEBUGGING | |
3569 | fprintf(stderr, "3)IP-Match: %s[%s] <-> ", found, inet_ntoa(*ip_list)); | |
3570 | @@ -1256,7 +1294,7 @@ | |
3571 | if (addr[i] != '\0' || ap_proxy_host2addr(addr, &host) != NULL) | |
3572 | return 0; | |
3573 | ||
3574 | - This->hostentry = ap_pduphostent (p, &host); | |
3575 | + This->hostentry = ap_pduphostent(p, &host); | |
3576 | ||
3577 | /* Strip trailing dots */ | |
3578 | for (i = strlen(addr) - 1; i > 0 && addr[i] == '.'; --i) | |
3579 | @@ -1318,7 +1356,7 @@ | |
3580 | ||
3581 | ap_hard_timeout("proxy connect", r); | |
3582 | do { | |
3583 | - i = connect(sock, (struct sockaddr *) addr, sizeof(struct sockaddr_in)); | |
3584 | + i = connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr_in)); | |
3585 | #if defined(WIN32) || defined(NETWARE) | |
3586 | if (i == SOCKET_ERROR) | |
3587 | errno = WSAGetLastError(); | |
3588 | @@ -1351,7 +1389,8 @@ | |
3589 | c = ap_proxy_cache_error(c); | |
3590 | return 0; /* no need to continue, it failed already */ | |
3591 | } | |
3592 | - return 1; /* tell ap_table_do() to continue calling us for more headers */ | |
3593 | + return 1; /* tell ap_table_do() to continue calling us | |
3594 | + * for more headers */ | |
3595 | } | |
3596 | ||
3597 | /* send a text line to one or two BUFF's; return line length */ | |
3598 | @@ -1366,7 +1405,8 @@ | |
3599 | /* do a HTTP/1.1 age calculation */ | |
3600 | time_t ap_proxy_current_age(cache_req *c, const time_t age_value) | |
3601 | { | |
3602 | - time_t apparent_age, corrected_received_age, response_delay, corrected_initial_age, resident_time, current_age; | |
3603 | + time_t apparent_age, corrected_received_age, response_delay, corrected_initial_age, | |
3604 | + resident_time, current_age; | |
3605 | ||
3606 | /* Perform an HTTP/1.1 age calculation. (RFC2616 13.2.3) */ | |
3607 | ||
3608 | @@ -1398,7 +1438,7 @@ | |
3609 | "proxy: error opening cache file %s", | |
3610 | filename); | |
3611 | else | |
3612 | - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, r->server, "File %s not found", filename); | |
3613 | + ap_log_error(APLOG_MARK, APLOG_DEBUG | APLOG_NOERRNO, r->server, "File %s not found", filename); | |
3614 | ||
3615 | } | |
3616 | return cachefp; | |
3617 | @@ -1431,10 +1471,10 @@ | |
3618 | const char *name; | |
3619 | char *next = ap_pstrdup(p, ap_table_get(headers, "Connection")); | |
3620 | ||
3621 | + /* Some proxies (Squid, ICS) use the non-standard "Proxy-Connection" header. */ | |
3622 | ap_table_unset(headers, "Proxy-Connection"); | |
3623 | - if (!next) | |
3624 | - return; | |
3625 | ||
3626 | + if (next != NULL) { | |
3627 | while (*next) { | |
3628 | name = next; | |
3629 | while (*next && !ap_isspace(*next) && (*next != ',')) | |
3630 | @@ -1446,6 +1486,30 @@ | |
3631 | ap_table_unset(headers, name); | |
3632 | } | |
3633 | ap_table_unset(headers, "Connection"); | |
3634 | + } | |
3635 | + | |
3636 | + /* unset hop-by-hop headers defined in RFC2616 13.5.1 */ | |
3637 | + ap_table_unset(headers,"Keep-Alive"); | |
3638 | + /* | |
3639 | + * XXX: @@@ FIXME: "Proxy-Authenticate" should IMO *not* be stripped | |
3640 | + * because in a chain of proxies some "front" proxy might need | |
3641 | + * proxy authentication, while a "back-end" proxy which needs none can | |
3642 | + * simply pass the "Proxy-Authenticate" back to the client, and pass | |
3643 | + * the client's "Proxy-Authorization" to the front-end proxy. | |
3644 | + * (See the note in proxy_http.c for the "Proxy-Authorization" case.) | |
3645 | + * | |
3646 | + * MnKr 04/2002 | |
3647 | + */ | |
3648 | + ap_table_unset(headers,"Proxy-Authenticate"); | |
3649 | + ap_table_unset(headers,"TE"); | |
3650 | + ap_table_unset(headers,"Trailer"); | |
3651 | + /* it is safe to just chop the transfer-encoding header | |
3652 | + * here, because proxy doesn't support any other encodings | |
3653 | + * to the backend other than chunked. | |
3654 | + */ | |
3655 | + ap_table_unset(headers,"Transfer-Encoding"); | |
3656 | + ap_table_unset(headers,"Upgrade"); | |
3657 | + | |
3658 | } | |
3659 | ||
3660 | /* overlay one table on another | |
3661 | @@ -1467,7 +1531,7 @@ | |
3662 | */ | |
3663 | int ap_proxy_table_replace(table *base, table *overlay) | |
3664 | { | |
3665 | - table_entry *elts = (table_entry *) overlay->a.elts; | |
3666 | + table_entry *elts = (table_entry *)overlay->a.elts; | |
3667 | int i, q = 0; | |
3668 | const char *val; | |
3669 | ||
3670 | @@ -1490,40 +1554,11 @@ | |
3671 | return q; | |
3672 | } | |
3673 | ||
3674 | -/* unmerge an element in the table */ | |
3675 | -void ap_proxy_table_unmerge(pool *p, table *t, char *key) | |
3676 | -{ | |
3677 | - long int offset = 0; | |
3678 | - long int count = 0; | |
3679 | - char *value = NULL; | |
3680 | - | |
3681 | - /* get the value to unmerge */ | |
3682 | - const char *initial = ap_table_get(t, key); | |
3683 | - if (!initial) { | |
3684 | - return; | |
3685 | - } | |
3686 | - value = ap_pstrdup(p, initial); | |
3687 | - | |
3688 | - /* remove the value from the headers */ | |
3689 | - ap_table_unset(t, key); | |
3690 | - | |
3691 | - /* find each comma */ | |
3692 | - while (value[count]) { | |
3693 | - if (value[count] == ',') { | |
3694 | - value[count] = 0; | |
3695 | - ap_table_add(t, key, value + offset); | |
3696 | - offset = count + 1; | |
3697 | - } | |
3698 | - count++; | |
3699 | - } | |
3700 | - ap_table_add(t, key, value + offset); | |
3701 | -} | |
3702 | - | |
3703 | #if defined WIN32 | |
3704 | ||
3705 | static DWORD tls_index; | |
3706 | ||
3707 | -BOOL WINAPI DllMain (HINSTANCE dllhandle, DWORD reason, LPVOID reserved) | |
3708 | +BOOL WINAPI DllMain(HINSTANCE dllhandle, DWORD reason, LPVOID reserved) | |
3709 | { | |
3710 | LPVOID memptr; | |
3711 | ||
3712 | @@ -1531,13 +1566,13 @@ | |
3713 | case DLL_PROCESS_ATTACH: | |
3714 | tls_index = TlsAlloc(); | |
3715 | case DLL_THREAD_ATTACH: /* intentional no break */ | |
3716 | - TlsSetValue (tls_index, malloc (sizeof (struct per_thread_data))); | |
3717 | + TlsSetValue(tls_index, malloc(sizeof(struct per_thread_data))); | |
3718 | break; | |
3719 | case DLL_THREAD_DETACH: | |
3720 | - memptr = TlsGetValue (tls_index); | |
3721 | + memptr = TlsGetValue(tls_index); | |
3722 | if (memptr) { | |
3723 | - free (memptr); | |
3724 | - TlsSetValue (tls_index, 0); | |
3725 | + free(memptr); | |
3726 | + TlsSetValue(tls_index, 0); | |
3727 | } | |
3728 | break; | |
3729 | } | |
3730 | @@ -1551,7 +1586,7 @@ | |
3731 | { | |
3732 | #if defined(WIN32) | |
3733 | ||
3734 | - return (struct per_thread_data *) TlsGetValue (tls_index); | |
3735 | + return (struct per_thread_data *)TlsGetValue(tls_index); | |
3736 | ||
3737 | #else | |
3738 | ||
3739 |