Mercurial > hg > nginx-quic
annotate src/http/modules/ngx_http_gzip_filter_module.c @ 7232:a7ed15573ae9
Upstream: u->conf->preserve_output flag.
The flag can be used to continue sending request body even after we've
got a response from the backend. In particular, this is needed for gRPC
proxying of bidirectional streaming RPCs, and also to send control frames
in other forms of RPCs.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sat, 17 Mar 2018 23:04:23 +0300 |
parents | 29e9571b1989 |
children | ac5a741d39cf |
rev | line source |
---|---|
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
433
diff
changeset
|
1 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
433
diff
changeset
|
2 /* |
444
42d11f017717
nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents:
441
diff
changeset
|
3 * Copyright (C) Igor Sysoev |
4412 | 4 * Copyright (C) Nginx, Inc. |
441
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
433
diff
changeset
|
5 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
433
diff
changeset
|
6 |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_config.h> |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
9 #include <ngx_core.h> |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
10 #include <ngx_http.h> |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
11 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
12 #include <zlib.h> |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
13 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
14 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
15 typedef struct { |
290
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
289
diff
changeset
|
16 ngx_flag_t enable; |
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
289
diff
changeset
|
17 ngx_flag_t no_buffer; |
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
289
diff
changeset
|
18 |
2166
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
19 ngx_hash_t types; |
452 | 20 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
21 ngx_bufs_t bufs; |
290
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
289
diff
changeset
|
22 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
23 size_t postpone_gzipping; |
589 | 24 ngx_int_t level; |
319
7a8ebba985a9
nginx-0.0.3-2004-04-16-19:27:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
315
diff
changeset
|
25 size_t wbits; |
7a8ebba985a9
nginx-0.0.3-2004-04-16-19:27:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
315
diff
changeset
|
26 size_t memlevel; |
335
d4241d7787fe
nginx-0.0.3-2004-05-14-20:51:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
327
diff
changeset
|
27 ssize_t min_length; |
2166
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
28 |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
29 ngx_array_t *types_keys; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
30 } ngx_http_gzip_conf_t; |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
31 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
32 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
33 typedef struct { |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
34 ngx_chain_t *in; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
35 ngx_chain_t *free; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
36 ngx_chain_t *busy; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
37 ngx_chain_t *out; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
38 ngx_chain_t **last_out; |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
39 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
40 ngx_chain_t *copied; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
41 ngx_chain_t *copy_buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
42 |
343
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
335
diff
changeset
|
43 ngx_buf_t *in_buf; |
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
335
diff
changeset
|
44 ngx_buf_t *out_buf; |
6bdf858bff8c
nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents:
335
diff
changeset
|
45 ngx_int_t bufs; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
46 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
47 void *preallocated; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
48 char *free_mem; |
294
5cfd65b8b0a7
nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
292
diff
changeset
|
49 ngx_uint_t allocated; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
50 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
51 int wbits; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
52 int memlevel; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
53 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
54 unsigned flush:4; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
55 unsigned redo:1; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
56 unsigned done:1; |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
57 unsigned nomem:1; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
58 unsigned gzheader:1; |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
59 unsigned buffering:1; |
7155
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
60 unsigned intel:1; |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
61 |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
62 size_t zin; |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
63 size_t zout; |
135
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
64 |
290
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
289
diff
changeset
|
65 uint32_t crc32; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
66 z_stream zstream; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
67 ngx_http_request_t *request; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
68 } ngx_http_gzip_ctx_t; |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
69 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
70 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
71 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
72 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
73 struct gztrailer { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
74 uint32_t crc32; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
75 uint32_t zlen; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
76 }; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
77 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
78 #else /* NGX_HAVE_BIG_ENDIAN || !NGX_HAVE_NONALIGNED */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
79 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
80 struct gztrailer { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
81 u_char crc32[4]; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
82 u_char zlen[4]; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
83 }; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
84 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
85 #endif |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
86 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
87 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
88 static void ngx_http_gzip_filter_memory(ngx_http_request_t *r, |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
89 ngx_http_gzip_ctx_t *ctx); |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
90 static ngx_int_t ngx_http_gzip_filter_buffer(ngx_http_gzip_ctx_t *ctx, |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
91 ngx_chain_t *in); |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
92 static ngx_int_t ngx_http_gzip_filter_deflate_start(ngx_http_request_t *r, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
93 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
94 static ngx_int_t ngx_http_gzip_filter_gzheader(ngx_http_request_t *r, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
95 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
96 static ngx_int_t ngx_http_gzip_filter_add_data(ngx_http_request_t *r, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
97 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
98 static ngx_int_t ngx_http_gzip_filter_get_buf(ngx_http_request_t *r, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
99 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
100 static ngx_int_t ngx_http_gzip_filter_deflate(ngx_http_request_t *r, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
101 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
102 static ngx_int_t ngx_http_gzip_filter_deflate_end(ngx_http_request_t *r, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
103 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
104 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
105 static void *ngx_http_gzip_filter_alloc(void *opaque, u_int items, |
497 | 106 u_int size); |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
107 static void ngx_http_gzip_filter_free(void *opaque, void *address); |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
108 static void ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r, |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
109 ngx_http_gzip_ctx_t *ctx); |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
110 |
573 | 111 static ngx_int_t ngx_http_gzip_add_variables(ngx_conf_t *cf); |
112 static ngx_int_t ngx_http_gzip_ratio_variable(ngx_http_request_t *r, | |
113 ngx_http_variable_value_t *v, uintptr_t data); | |
479 | 114 |
681 | 115 static ngx_int_t ngx_http_gzip_filter_init(ngx_conf_t *cf); |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
116 static void *ngx_http_gzip_create_conf(ngx_conf_t *cf); |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
117 static char *ngx_http_gzip_merge_conf(ngx_conf_t *cf, |
497 | 118 void *parent, void *child); |
527 | 119 static char *ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data); |
120 static char *ngx_http_gzip_hash(ngx_conf_t *cf, void *post, void *data); | |
158
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
121 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
122 |
158
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
123 static ngx_conf_num_bounds_t ngx_http_gzip_comp_level_bounds = { |
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
124 ngx_conf_check_num_bounds, 1, 9 |
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
125 }; |
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
126 |
527 | 127 static ngx_conf_post_handler_pt ngx_http_gzip_window_p = ngx_http_gzip_window; |
128 static ngx_conf_post_handler_pt ngx_http_gzip_hash_p = ngx_http_gzip_hash; | |
158
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
129 |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
130 |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
131 static ngx_command_t ngx_http_gzip_filter_commands[] = { |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
132 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
133 { ngx_string("gzip"), |
485 | 134 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF |
135 |NGX_CONF_FLAG, | |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
136 ngx_conf_set_flag_slot, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
137 NGX_HTTP_LOC_CONF_OFFSET, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
138 offsetof(ngx_http_gzip_conf_t, enable), |
412
199cd29f35a3
nginx-0.0.10-2004-08-31-19:32:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
370
diff
changeset
|
139 NULL }, |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
140 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
141 { ngx_string("gzip_buffers"), |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
142 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
143 ngx_conf_set_bufs_slot, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
144 NGX_HTTP_LOC_CONF_OFFSET, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
145 offsetof(ngx_http_gzip_conf_t, bufs), |
412
199cd29f35a3
nginx-0.0.10-2004-08-31-19:32:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
370
diff
changeset
|
146 NULL }, |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
147 |
452 | 148 { ngx_string("gzip_types"), |
149 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
2166
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
150 ngx_http_types_slot, |
452 | 151 NGX_HTTP_LOC_CONF_OFFSET, |
2166
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
152 offsetof(ngx_http_gzip_conf_t, types_keys), |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
153 &ngx_http_html_default_types[0] }, |
452 | 154 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
155 { ngx_string("gzip_comp_level"), |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
156 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
157 ngx_conf_set_num_slot, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
158 NGX_HTTP_LOC_CONF_OFFSET, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
159 offsetof(ngx_http_gzip_conf_t, level), |
412
199cd29f35a3
nginx-0.0.10-2004-08-31-19:32:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
370
diff
changeset
|
160 &ngx_http_gzip_comp_level_bounds }, |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
161 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
162 { ngx_string("gzip_window"), |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
163 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
164 ngx_conf_set_size_slot, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
165 NGX_HTTP_LOC_CONF_OFFSET, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
166 offsetof(ngx_http_gzip_conf_t, wbits), |
527 | 167 &ngx_http_gzip_window_p }, |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
168 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
169 { ngx_string("gzip_hash"), |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
170 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
171 ngx_conf_set_size_slot, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
172 NGX_HTTP_LOC_CONF_OFFSET, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
173 offsetof(ngx_http_gzip_conf_t, memlevel), |
527 | 174 &ngx_http_gzip_hash_p }, |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
175 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
176 { ngx_string("postpone_gzipping"), |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
177 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
178 ngx_conf_set_size_slot, |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
179 NGX_HTTP_LOC_CONF_OFFSET, |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
180 offsetof(ngx_http_gzip_conf_t, postpone_gzipping), |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
181 NULL }, |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
182 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
183 { ngx_string("gzip_no_buffer"), |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
184 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
185 ngx_conf_set_flag_slot, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
186 NGX_HTTP_LOC_CONF_OFFSET, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
187 offsetof(ngx_http_gzip_conf_t, no_buffer), |
412
199cd29f35a3
nginx-0.0.10-2004-08-31-19:32:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
370
diff
changeset
|
188 NULL }, |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
189 |
320
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
190 { ngx_string("gzip_min_length"), |
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
191 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
192 ngx_conf_set_size_slot, |
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
193 NGX_HTTP_LOC_CONF_OFFSET, |
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
194 offsetof(ngx_http_gzip_conf_t, min_length), |
412
199cd29f35a3
nginx-0.0.10-2004-08-31-19:32:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
370
diff
changeset
|
195 NULL }, |
314
d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
196 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
197 ngx_null_command |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
198 }; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
199 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
200 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
201 static ngx_http_module_t ngx_http_gzip_filter_module_ctx = { |
573 | 202 ngx_http_gzip_add_variables, /* preconfiguration */ |
681 | 203 ngx_http_gzip_filter_init, /* postconfiguration */ |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
204 |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
205 NULL, /* create main configuration */ |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
206 NULL, /* init main configuration */ |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
207 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
208 NULL, /* create server configuration */ |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
209 NULL, /* merge server configuration */ |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
210 |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
211 ngx_http_gzip_create_conf, /* create location configuration */ |
489 | 212 ngx_http_gzip_merge_conf /* merge location configuration */ |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
213 }; |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
214 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
215 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
216 ngx_module_t ngx_http_gzip_filter_module = { |
509 | 217 NGX_MODULE_V1, |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
218 &ngx_http_gzip_filter_module_ctx, /* module context */ |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
219 ngx_http_gzip_filter_commands, /* module directives */ |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
220 NGX_HTTP_MODULE, /* module type */ |
541 | 221 NULL, /* init master */ |
681 | 222 NULL, /* init module */ |
541 | 223 NULL, /* init process */ |
224 NULL, /* init thread */ | |
225 NULL, /* exit thread */ | |
226 NULL, /* exit process */ | |
227 NULL, /* exit master */ | |
228 NGX_MODULE_V1_PADDING | |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
229 }; |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
230 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
231 |
573 | 232 static ngx_str_t ngx_http_gzip_ratio = ngx_string("gzip_ratio"); |
509 | 233 |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
234 static ngx_http_output_header_filter_pt ngx_http_next_header_filter; |
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
235 static ngx_http_output_body_filter_pt ngx_http_next_body_filter; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
236 |
7155
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
237 static ngx_uint_t ngx_http_gzip_assume_intel; |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
238 |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
239 |
497 | 240 static ngx_int_t |
241 ngx_http_gzip_header_filter(ngx_http_request_t *r) | |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
242 { |
2051
115e6f029fcc
"gzip_vary on" always sends "Vary: Accept-Encoding" header
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
243 ngx_table_elt_t *h; |
115e6f029fcc
"gzip_vary on" always sends "Vary: Accept-Encoding" header
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
244 ngx_http_gzip_ctx_t *ctx; |
115e6f029fcc
"gzip_vary on" always sends "Vary: Accept-Encoding" header
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
245 ngx_http_gzip_conf_t *conf; |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
246 |
135
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
247 conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); |
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
248 |
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
249 if (!conf->enable |
452 | 250 || (r->headers_out.status != NGX_HTTP_OK |
251 && r->headers_out.status != NGX_HTTP_FORBIDDEN | |
252 && r->headers_out.status != NGX_HTTP_NOT_FOUND) | |
135
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
253 || (r->headers_out.content_encoding |
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
254 && r->headers_out.content_encoding->value.len) |
320
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
255 || (r->headers_out.content_length_n != -1 |
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
256 && r->headers_out.content_length_n < conf->min_length) |
3379
0c517d0cabe0
backout r3315 and test r->header_only last, since it's not actually
Igor Sysoev <igor@sysoev.ru>
parents:
3372
diff
changeset
|
257 || ngx_http_test_content_type(r, &conf->types) == NULL |
0c517d0cabe0
backout r3315 and test r->header_only last, since it's not actually
Igor Sysoev <igor@sysoev.ru>
parents:
3372
diff
changeset
|
258 || r->header_only) |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
259 { |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
260 return ngx_http_next_header_filter(r); |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
261 } |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
262 |
3313 | 263 r->gzip_vary = 1; |
264 | |
3773 | 265 #if (NGX_HTTP_DEGRADATION) |
266 { | |
267 ngx_http_core_loc_conf_t *clcf; | |
268 | |
269 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | |
270 | |
271 if (clcf->gzip_disable_degradation && ngx_http_degraded(r)) { | |
272 return ngx_http_next_header_filter(r); | |
273 } | |
274 } | |
275 #endif | |
276 | |
3313 | 277 if (!r->gzip_tested) { |
278 if (ngx_http_gzip_ok(r) != NGX_OK) { | |
279 return ngx_http_next_header_filter(r); | |
280 } | |
281 | |
282 } else if (!r->gzip_ok) { | |
283 return ngx_http_next_header_filter(r); | |
284 } | |
285 | |
501 | 286 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gzip_ctx_t)); |
287 if (ctx == NULL) { | |
288 return NGX_ERROR; | |
289 } | |
314
d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
290 |
501 | 291 ngx_http_set_ctx(r, ctx, ngx_http_gzip_filter_module); |
292 | |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
293 ctx->request = r; |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
294 ctx->buffering = (conf->postpone_gzipping != 0); |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
295 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
296 ngx_http_gzip_filter_memory(r, ctx); |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
297 |
1790
775edc46ee66
ngx_http_gzip_static_module and gzip_disable
Igor Sysoev <igor@sysoev.ru>
parents:
1626
diff
changeset
|
298 h = ngx_list_push(&r->headers_out.headers); |
775edc46ee66
ngx_http_gzip_static_module and gzip_disable
Igor Sysoev <igor@sysoev.ru>
parents:
1626
diff
changeset
|
299 if (h == NULL) { |
164
84036764e215
nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
160
diff
changeset
|
300 return NGX_ERROR; |
84036764e215
nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
160
diff
changeset
|
301 } |
135
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
302 |
1790
775edc46ee66
ngx_http_gzip_static_module and gzip_disable
Igor Sysoev <igor@sysoev.ru>
parents:
1626
diff
changeset
|
303 h->hash = 1; |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3379
diff
changeset
|
304 ngx_str_set(&h->key, "Content-Encoding"); |
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3379
diff
changeset
|
305 ngx_str_set(&h->value, "gzip"); |
1790
775edc46ee66
ngx_http_gzip_static_module and gzip_disable
Igor Sysoev <igor@sysoev.ru>
parents:
1626
diff
changeset
|
306 r->headers_out.content_encoding = h; |
775edc46ee66
ngx_http_gzip_static_module and gzip_disable
Igor Sysoev <igor@sysoev.ru>
parents:
1626
diff
changeset
|
307 |
513 | 308 r->main_filter_need_in_memory = 1; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
309 |
577 | 310 ngx_http_clear_content_length(r); |
311 ngx_http_clear_accept_ranges(r); | |
5733
e491b26fa5a1
Entity tags: downgrade strong etags to weak ones as needed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5432
diff
changeset
|
312 ngx_http_weak_etag(r); |
577 | 313 |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
314 return ngx_http_next_header_filter(r); |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
315 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
316 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
317 |
497 | 318 static ngx_int_t |
319 ngx_http_gzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in) | |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
320 { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
321 int rc; |
5876
973fded4f461
Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5733
diff
changeset
|
322 ngx_uint_t flush; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
323 ngx_chain_t *cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
324 ngx_http_gzip_ctx_t *ctx; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
325 |
243
bf2faf694c19
nginx-0.0.1-2004-01-28-23:38:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
239
diff
changeset
|
326 ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module); |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
327 |
4990
e2794322ec76
Fixed HEAD requests handling when proxying is used (closes #261).
Valentin Bartenev <vbart@nginx.com>
parents:
4965
diff
changeset
|
328 if (ctx == NULL || ctx->done || r->header_only) { |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
329 return ngx_http_next_body_filter(r, in); |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
330 } |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
331 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
332 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
333 "http gzip filter"); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
334 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
335 if (ctx->buffering) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
336 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
337 /* |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
338 * With default memory settings zlib starts to output gzipped data |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
339 * only after it has got about 90K, so it makes sense to allocate |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
340 * zlib memory (200-400K) only after we have enough data to compress. |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
341 * Although we copy buffers, nevertheless for not big responses |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
342 * this allows to allocate zlib memory, to compress and to output |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
343 * the response in one step using hot CPU cache. |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
344 */ |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
345 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
346 if (in) { |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
347 switch (ngx_http_gzip_filter_buffer(ctx, in)) { |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
348 |
2468 | 349 case NGX_OK: |
350 return NGX_OK; | |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
351 |
2468 | 352 case NGX_DONE: |
353 in = NULL; | |
354 break; | |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
355 |
2468 | 356 default: /* NGX_ERROR */ |
357 goto failed; | |
358 } | |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
359 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
360 } else { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
361 ctx->buffering = 0; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
362 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
363 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
364 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
365 if (ctx->preallocated == NULL) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
366 if (ngx_http_gzip_filter_deflate_start(r, ctx) != NGX_OK) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
367 goto failed; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
368 } |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
369 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
370 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
371 if (in) { |
2536
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2468
diff
changeset
|
372 if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
373 goto failed; |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
374 } |
5291
84155a389bcc
Gzip: clearing of c->buffered if all data are flushed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5107
diff
changeset
|
375 |
84155a389bcc
Gzip: clearing of c->buffered if all data are flushed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5107
diff
changeset
|
376 r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
377 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
378 |
5876
973fded4f461
Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5733
diff
changeset
|
379 if (ctx->nomem) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
380 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
381 /* flush busy buffers */ |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
382 |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
383 if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
384 goto failed; |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
385 } |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
386 |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
387 cl = NULL; |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
388 |
4114
5db098f97e0e
API change: ngx_chain_update_chains() now requires pool.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3773
diff
changeset
|
389 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl, |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
390 (ngx_buf_tag_t) &ngx_http_gzip_filter_module); |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
391 ctx->nomem = 0; |
5876
973fded4f461
Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5733
diff
changeset
|
392 flush = 0; |
973fded4f461
Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5733
diff
changeset
|
393 |
973fded4f461
Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5733
diff
changeset
|
394 } else { |
973fded4f461
Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5733
diff
changeset
|
395 flush = ctx->busy ? 1 : 0; |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
396 } |
141
656d468f4ead
nginx-0.0.1-2003-10-08-19:32:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
136
diff
changeset
|
397 |
135
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
398 for ( ;; ) { |
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
399 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
400 /* cycle while we can write to a client */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
401 |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
402 for ( ;; ) { |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
403 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
404 /* cycle while there is data to feed zlib and ... */ |
323
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
405 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
406 rc = ngx_http_gzip_filter_add_data(r, ctx); |
323
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
407 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
408 if (rc == NGX_DECLINED) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
409 break; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
410 } |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
411 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
412 if (rc == NGX_AGAIN) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
413 continue; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
414 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
415 |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
416 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
417 /* ... there are buffers to write zlib output */ |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
418 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
419 rc = ngx_http_gzip_filter_get_buf(r, ctx); |
501 | 420 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
421 if (rc == NGX_DECLINED) { |
323
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
422 break; |
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
423 } |
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
424 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
425 if (rc == NGX_ERROR) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
426 goto failed; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
427 } |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
428 |
479 | 429 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
430 rc = ngx_http_gzip_filter_deflate(r, ctx); |
355
0fb6c53fb135
nginx-0.0.7-2004-06-15-21:47:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
346
diff
changeset
|
431 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
432 if (rc == NGX_OK) { |
323
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
433 break; |
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
434 } |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
435 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
436 if (rc == NGX_ERROR) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
437 goto failed; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
438 } |
501 | 439 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
440 /* rc == NGX_AGAIN */ |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
441 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
442 |
5876
973fded4f461
Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5733
diff
changeset
|
443 if (ctx->out == NULL && !flush) { |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
444 ngx_http_gzip_filter_free_copy_buf(r, ctx); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
445 |
2292 | 446 return ctx->busy ? NGX_AGAIN : NGX_OK; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
447 } |
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
448 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
449 if (!ctx->gzheader) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
450 if (ngx_http_gzip_filter_gzheader(r, ctx) != NGX_OK) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
451 goto failed; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
452 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
453 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
454 |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
455 rc = ngx_http_next_body_filter(r, ctx->out); |
141
656d468f4ead
nginx-0.0.1-2003-10-08-19:32:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
136
diff
changeset
|
456 |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
457 if (rc == NGX_ERROR) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
458 goto failed; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
459 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
460 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
461 ngx_http_gzip_filter_free_copy_buf(r, ctx); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
462 |
4114
5db098f97e0e
API change: ngx_chain_update_chains() now requires pool.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3773
diff
changeset
|
463 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out, |
501 | 464 (ngx_buf_tag_t) &ngx_http_gzip_filter_module); |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
465 ctx->last_out = &ctx->out; |
327
e0f3f238db09
nginx-0.0.3-2004-04-26-17:40:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
466 |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
467 ctx->nomem = 0; |
5876
973fded4f461
Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5733
diff
changeset
|
468 flush = 0; |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
469 |
327
e0f3f238db09
nginx-0.0.3-2004-04-26-17:40:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
470 if (ctx->done) { |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
471 return rc; |
327
e0f3f238db09
nginx-0.0.3-2004-04-26-17:40:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
472 } |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
473 } |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
474 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
475 /* unreachable */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
476 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
477 failed: |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
478 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
479 ctx->done = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
480 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
481 if (ctx->preallocated) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
482 deflateEnd(&ctx->zstream); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
483 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
484 ngx_pfree(r->pool, ctx->preallocated); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
485 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
486 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
487 ngx_http_gzip_filter_free_copy_buf(r, ctx); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
488 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
489 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
490 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
491 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
492 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
493 static void |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
494 ngx_http_gzip_filter_memory(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
495 { |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
496 int wbits, memlevel; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
497 ngx_http_gzip_conf_t *conf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
498 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
499 conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
500 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
501 wbits = conf->wbits; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
502 memlevel = conf->memlevel; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
503 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
504 if (r->headers_out.content_length_n > 0) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
505 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
506 /* the actual zlib window size is smaller by 262 bytes */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
507 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
508 while (r->headers_out.content_length_n < ((1 << (wbits - 1)) - 262)) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
509 wbits--; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
510 memlevel--; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
511 } |
4965
58dfef910ccd
Gzip: fixed zlib memLevel adjusting.
Valentin Bartenev <vbart@nginx.com>
parents:
4746
diff
changeset
|
512 |
58dfef910ccd
Gzip: fixed zlib memLevel adjusting.
Valentin Bartenev <vbart@nginx.com>
parents:
4746
diff
changeset
|
513 if (memlevel < 1) { |
58dfef910ccd
Gzip: fixed zlib memLevel adjusting.
Valentin Bartenev <vbart@nginx.com>
parents:
4746
diff
changeset
|
514 memlevel = 1; |
58dfef910ccd
Gzip: fixed zlib memLevel adjusting.
Valentin Bartenev <vbart@nginx.com>
parents:
4746
diff
changeset
|
515 } |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
516 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
517 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
518 ctx->wbits = wbits; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
519 ctx->memlevel = memlevel; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
520 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
521 /* |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
522 * We preallocate a memory for zlib in one buffer (200K-400K), this |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
523 * decreases a number of malloc() and free() calls and also probably |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
524 * decreases a number of syscalls (sbrk()/mmap() and so on). |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
525 * Besides we free the memory as soon as a gzipping will complete |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
526 * and do not wait while a whole response will be sent to a client. |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
527 * |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
528 * 8K is for zlib deflate_state, it takes |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
529 * *) 5816 bytes on i386 and sparc64 (32-bit mode) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
530 * *) 5920 bytes on amd64 and sparc64 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
531 */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
532 |
7155
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
533 if (!ngx_http_gzip_assume_intel) { |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
534 ctx->allocated = 8192 + (1 << (wbits + 2)) + (1 << (memlevel + 9)); |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
535 |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
536 } else { |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
537 /* |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
538 * A zlib variant from Intel, https://github.com/jtkukunas/zlib. |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
539 * It can force window bits to 13 for fast compression level, |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
540 * on processors with SSE 4.2 it uses 64K hash instead of scaling |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
541 * it from the specified memory level, and also introduces |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
542 * 16-byte padding in one out of the two window-sized buffers. |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
543 */ |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
544 |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
545 if (conf->level == 1) { |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
546 wbits = ngx_max(wbits, 13); |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
547 } |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
548 |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
549 ctx->allocated = 8192 + 16 + (1 << (wbits + 2)) |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
550 + (1 << (ngx_max(memlevel, 8) + 8)) |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
551 + (1 << (memlevel + 8)); |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
552 ctx->intel = 1; |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
553 } |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
554 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
555 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
556 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
557 static ngx_int_t |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
558 ngx_http_gzip_filter_buffer(ngx_http_gzip_ctx_t *ctx, ngx_chain_t *in) |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
559 { |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
560 size_t size, buffered; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
561 ngx_buf_t *b, *buf; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
562 ngx_chain_t *cl, **ll; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
563 ngx_http_request_t *r; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
564 ngx_http_gzip_conf_t *conf; |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
565 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
566 r = ctx->request; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
567 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
568 r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
569 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
570 buffered = 0; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
571 ll = &ctx->in; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
572 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
573 for (cl = ctx->in; cl; cl = cl->next) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
574 buffered += cl->buf->last - cl->buf->pos; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
575 ll = &cl->next; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
576 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
577 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
578 conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
579 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
580 while (in) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
581 cl = ngx_alloc_chain_link(r->pool); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
582 if (cl == NULL) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
583 return NGX_ERROR; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
584 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
585 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
586 b = in->buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
587 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
588 size = b->last - b->pos; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
589 buffered += size; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
590 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
591 if (b->flush || b->last_buf || buffered > conf->postpone_gzipping) { |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
592 ctx->buffering = 0; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
593 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
594 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
595 if (ctx->buffering && size) { |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
596 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
597 buf = ngx_create_temp_buf(r->pool, size); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
598 if (buf == NULL) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
599 return NGX_ERROR; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
600 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
601 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
602 buf->last = ngx_cpymem(buf->pos, b->pos, size); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
603 b->pos = b->last; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
604 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
605 buf->last_buf = b->last_buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
606 buf->tag = (ngx_buf_tag_t) &ngx_http_gzip_filter_module; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
607 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
608 cl->buf = buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
609 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
610 } else { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
611 cl->buf = b; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
612 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
613 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
614 *ll = cl; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
615 ll = &cl->next; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
616 in = in->next; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
617 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
618 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
619 *ll = NULL; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
620 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
621 return ctx->buffering ? NGX_OK : NGX_DONE; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
622 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
623 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
624 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
625 static ngx_int_t |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
626 ngx_http_gzip_filter_deflate_start(ngx_http_request_t *r, |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
627 ngx_http_gzip_ctx_t *ctx) |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
628 { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
629 int rc; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
630 ngx_http_gzip_conf_t *conf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
631 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
632 conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
633 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
634 ctx->preallocated = ngx_palloc(r->pool, ctx->allocated); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
635 if (ctx->preallocated == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
636 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
637 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
638 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
639 ctx->free_mem = ctx->preallocated; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
640 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
641 ctx->zstream.zalloc = ngx_http_gzip_filter_alloc; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
642 ctx->zstream.zfree = ngx_http_gzip_filter_free; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
643 ctx->zstream.opaque = ctx; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
644 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
645 rc = deflateInit2(&ctx->zstream, (int) conf->level, Z_DEFLATED, |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
646 - ctx->wbits, ctx->memlevel, Z_DEFAULT_STRATEGY); |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
647 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
648 if (rc != Z_OK) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
649 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
650 "deflateInit2() failed: %d", rc); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
651 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
652 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
653 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
654 ctx->last_out = &ctx->out; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
655 ctx->crc32 = crc32(0L, Z_NULL, 0); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
656 ctx->flush = Z_NO_FLUSH; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
657 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
658 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
659 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
660 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
661 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
662 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
663 ngx_http_gzip_filter_gzheader(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
664 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
665 ngx_buf_t *b; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
666 ngx_chain_t *cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
667 static u_char gzheader[10] = |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
668 { 0x1f, 0x8b, Z_DEFLATED, 0, 0, 0, 0, 0, 0, 3 }; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
669 |
6973
99934aade555
Use ngx_calloc_buf() where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents:
6910
diff
changeset
|
670 b = ngx_calloc_buf(r->pool); |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
671 if (b == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
672 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
673 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
674 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
675 b->memory = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
676 b->pos = gzheader; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
677 b->last = b->pos + 10; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
678 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
679 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
680 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
681 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
682 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
683 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
684 cl->buf = b; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
685 cl->next = ctx->out; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
686 ctx->out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
687 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
688 ctx->gzheader = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
689 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
690 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
691 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
692 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
693 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
694 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
695 ngx_http_gzip_filter_add_data(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
696 { |
6910
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
697 ngx_chain_t *cl; |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
698 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
699 if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
700 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
701 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
702 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
703 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
704 "gzip in: %p", ctx->in); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
705 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
706 if (ctx->in == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
707 return NGX_DECLINED; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
708 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
709 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
710 if (ctx->copy_buf) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
711 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
712 /* |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
713 * to avoid CPU cache trashing we do not free() just quit buf, |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
714 * but postpone free()ing after zlib compressing and data output |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
715 */ |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
716 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
717 ctx->copy_buf->next = ctx->copied; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
718 ctx->copied = ctx->copy_buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
719 ctx->copy_buf = NULL; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
720 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
721 |
6910
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
722 cl = ctx->in; |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
723 ctx->in_buf = cl->buf; |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
724 ctx->in = cl->next; |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
725 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
726 if (ctx->in_buf->tag == (ngx_buf_tag_t) &ngx_http_gzip_filter_module) { |
6910
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
727 ctx->copy_buf = cl; |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
728 |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
729 } else { |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
730 ngx_free_chain(r->pool, cl); |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
731 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
732 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
733 ctx->zstream.next_in = ctx->in_buf->pos; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
734 ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
735 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
736 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
737 "gzip in_buf:%p ni:%p ai:%ud", |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
738 ctx->in_buf, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
739 ctx->zstream.next_in, ctx->zstream.avail_in); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
740 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
741 if (ctx->in_buf->last_buf) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
742 ctx->flush = Z_FINISH; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
743 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
744 } else if (ctx->in_buf->flush) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
745 ctx->flush = Z_SYNC_FLUSH; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
746 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
747 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
748 if (ctx->zstream.avail_in) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
749 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
750 ctx->crc32 = crc32(ctx->crc32, ctx->zstream.next_in, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
751 ctx->zstream.avail_in); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
752 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
753 } else if (ctx->flush == Z_NO_FLUSH) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
754 return NGX_AGAIN; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
755 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
756 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
757 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
758 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
759 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
760 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
761 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
762 ngx_http_gzip_filter_get_buf(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
763 { |
6910
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
764 ngx_chain_t *cl; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
765 ngx_http_gzip_conf_t *conf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
766 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
767 if (ctx->zstream.avail_out) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
768 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
769 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
770 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
771 conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
772 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
773 if (ctx->free) { |
6910
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
774 |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
775 cl = ctx->free; |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
776 ctx->out_buf = cl->buf; |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
777 ctx->free = cl->next; |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
778 |
da46bfc484ef
Gzip: free chain links on the hot path (ticket #1046).
Maxim Dounin <mdounin@mdounin.ru>
parents:
6480
diff
changeset
|
779 ngx_free_chain(r->pool, cl); |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
780 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
781 } else if (ctx->bufs < conf->bufs.num) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
782 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
783 ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
784 if (ctx->out_buf == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
785 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
786 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
787 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
788 ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_gzip_filter_module; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
789 ctx->out_buf->recycled = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
790 ctx->bufs++; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
791 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
792 } else { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
793 ctx->nomem = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
794 return NGX_DECLINED; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
795 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
796 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
797 ctx->zstream.next_out = ctx->out_buf->pos; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
798 ctx->zstream.avail_out = conf->bufs.size; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
799 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
800 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
801 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
802 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
803 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
804 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
805 ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
806 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
807 int rc; |
4468
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
808 ngx_buf_t *b; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
809 ngx_chain_t *cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
810 ngx_http_gzip_conf_t *conf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
811 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
812 ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
813 "deflate in: ni:%p no:%p ai:%ud ao:%ud fl:%d redo:%d", |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
814 ctx->zstream.next_in, ctx->zstream.next_out, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
815 ctx->zstream.avail_in, ctx->zstream.avail_out, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
816 ctx->flush, ctx->redo); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
817 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
818 rc = deflate(&ctx->zstream, ctx->flush); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
819 |
4468
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
820 if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
821 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
822 "deflate() failed: %d, %d", ctx->flush, rc); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
823 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
824 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
825 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
826 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
827 "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d", |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
828 ctx->zstream.next_in, ctx->zstream.next_out, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
829 ctx->zstream.avail_in, ctx->zstream.avail_out, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
830 rc); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
831 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
832 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
833 "gzip in_buf:%p pos:%p", |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
834 ctx->in_buf, ctx->in_buf->pos); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
835 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
836 if (ctx->zstream.next_in) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
837 ctx->in_buf->pos = ctx->zstream.next_in; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
838 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
839 if (ctx->zstream.avail_in == 0) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
840 ctx->zstream.next_in = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
841 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
842 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
843 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
844 ctx->out_buf->last = ctx->zstream.next_out; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
845 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
846 if (ctx->zstream.avail_out == 0) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
847 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
848 /* zlib wants to output some more gzipped data */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
849 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
850 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
851 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
852 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
853 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
854 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
855 cl->buf = ctx->out_buf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
856 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
857 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
858 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
859 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
860 ctx->redo = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
861 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
862 return NGX_AGAIN; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
863 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
864 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
865 ctx->redo = 0; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
866 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
867 if (ctx->flush == Z_SYNC_FLUSH) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
868 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
869 ctx->flush = Z_NO_FLUSH; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
870 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
871 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
872 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
873 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
874 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
875 |
4468
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
876 b = ctx->out_buf; |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
877 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
878 if (ngx_buf_size(b) == 0) { |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
879 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
880 b = ngx_calloc_buf(ctx->request->pool); |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
881 if (b == NULL) { |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
882 return NGX_ERROR; |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
883 } |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
884 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
885 } else { |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
886 ctx->zstream.avail_out = 0; |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
887 } |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
888 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
889 b->flush = 1; |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
890 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
891 cl->buf = b; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
892 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
893 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
894 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
895 |
5291
84155a389bcc
Gzip: clearing of c->buffered if all data are flushed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5107
diff
changeset
|
896 r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED; |
84155a389bcc
Gzip: clearing of c->buffered if all data are flushed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5107
diff
changeset
|
897 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
898 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
899 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
900 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
901 if (rc == Z_STREAM_END) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
902 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
903 if (ngx_http_gzip_filter_deflate_end(r, ctx) != NGX_OK) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
904 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
905 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
906 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
907 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
908 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
909 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
910 conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
911 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
912 if (conf->no_buffer && ctx->in == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
913 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
914 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
915 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
916 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
917 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
918 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
919 cl->buf = ctx->out_buf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
920 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
921 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
922 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
923 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
924 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
925 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
926 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
927 return NGX_AGAIN; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
928 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
929 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
930 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
931 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
932 ngx_http_gzip_filter_deflate_end(ngx_http_request_t *r, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
933 ngx_http_gzip_ctx_t *ctx) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
934 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
935 int rc; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
936 ngx_buf_t *b; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
937 ngx_chain_t *cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
938 struct gztrailer *trailer; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
939 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
940 ctx->zin = ctx->zstream.total_in; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
941 ctx->zout = 10 + ctx->zstream.total_out + 8; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
942 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
943 rc = deflateEnd(&ctx->zstream); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
944 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
945 if (rc != Z_OK) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
946 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
947 "deflateEnd() failed: %d", rc); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
948 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
949 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
950 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
951 ngx_pfree(r->pool, ctx->preallocated); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
952 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
953 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
954 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
955 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
956 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
957 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
958 cl->buf = ctx->out_buf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
959 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
960 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
961 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
962 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
963 if (ctx->zstream.avail_out >= 8) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
964 trailer = (struct gztrailer *) ctx->out_buf->last; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
965 ctx->out_buf->last += 8; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
966 ctx->out_buf->last_buf = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
967 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
968 } else { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
969 b = ngx_create_temp_buf(r->pool, 8); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
970 if (b == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
971 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
972 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
973 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
974 b->last_buf = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
975 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
976 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
977 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
978 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
979 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
980 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
981 cl->buf = b; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
982 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
983 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
984 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
985 trailer = (struct gztrailer *) b->pos; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
986 b->last += 8; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
987 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
988 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
989 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
990 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
991 trailer->crc32 = ctx->crc32; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
992 trailer->zlen = ctx->zin; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
993 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
994 #else |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
995 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
996 trailer->crc32[0] = (u_char) (ctx->crc32 & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
997 trailer->crc32[1] = (u_char) ((ctx->crc32 >> 8) & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
998 trailer->crc32[2] = (u_char) ((ctx->crc32 >> 16) & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
999 trailer->crc32[3] = (u_char) ((ctx->crc32 >> 24) & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1000 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1001 trailer->zlen[0] = (u_char) (ctx->zin & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1002 trailer->zlen[1] = (u_char) ((ctx->zin >> 8) & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1003 trailer->zlen[2] = (u_char) ((ctx->zin >> 16) & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1004 trailer->zlen[3] = (u_char) ((ctx->zin >> 24) & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1005 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1006 #endif |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1007 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1008 ctx->zstream.avail_in = 0; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1009 ctx->zstream.avail_out = 0; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1010 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1011 ctx->done = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1012 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1013 r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1014 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
1015 return NGX_OK; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1016 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1017 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1018 |
497 | 1019 static void * |
1020 ngx_http_gzip_filter_alloc(void *opaque, u_int items, u_int size) | |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1021 { |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1022 ngx_http_gzip_ctx_t *ctx = opaque; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1023 |
294
5cfd65b8b0a7
nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
292
diff
changeset
|
1024 void *p; |
5cfd65b8b0a7
nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
292
diff
changeset
|
1025 ngx_uint_t alloc; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1026 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1027 alloc = items * size; |
461 | 1028 |
7155
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1029 if (items == 1 && alloc % 512 != 0 && alloc < 8192) { |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1030 |
346
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
1031 /* |
461 | 1032 * The zlib deflate_state allocation, it takes about 6K, |
1033 * we allocate 8K. Other allocations are divisible by 512. | |
346
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
1034 */ |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1035 |
2425
3d60d55b9ad0
do not try to align to a page size, allocate just 8K,
Igor Sysoev <igor@sysoev.ru>
parents:
2412
diff
changeset
|
1036 alloc = 8192; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1037 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1038 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1039 if (alloc <= ctx->allocated) { |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1040 p = ctx->free_mem; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1041 ctx->free_mem += alloc; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1042 ctx->allocated -= alloc; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1043 |
257
70e1c7d2b83d
nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
243
diff
changeset
|
1044 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, |
6480 | 1045 "gzip alloc: n:%ud s:%ud a:%ui p:%p", |
257
70e1c7d2b83d
nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
243
diff
changeset
|
1046 items, size, alloc, p); |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1047 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1048 return p; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1049 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1050 |
7155
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1051 if (ctx->intel) { |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1052 ngx_log_error(NGX_LOG_ALERT, ctx->request->connection->log, 0, |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1053 "gzip filter failed to use preallocated memory: " |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1054 "%ud of %ui", items * size, ctx->allocated); |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1055 |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1056 } else { |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1057 ngx_http_gzip_assume_intel = 1; |
29e9571b1989
Gzip: support for a zlib variant from Intel.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7033
diff
changeset
|
1058 } |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1059 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1060 p = ngx_palloc(ctx->request->pool, items * size); |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1061 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1062 return p; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1063 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1064 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1065 |
497 | 1066 static void |
1067 ngx_http_gzip_filter_free(void *opaque, void *address) | |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1068 { |
282
30310107dbc9
nginx-0.0.2-2004-03-09-22:47:07 import
Igor Sysoev <igor@sysoev.ru>
parents:
265
diff
changeset
|
1069 #if 0 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1070 ngx_http_gzip_ctx_t *ctx = opaque; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1071 |
257
70e1c7d2b83d
nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
243
diff
changeset
|
1072 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, |
461 | 1073 "gzip free: %p", address); |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1074 #endif |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1075 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1076 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1077 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1078 static void |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1079 ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r, |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1080 ngx_http_gzip_ctx_t *ctx) |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1081 { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1082 ngx_chain_t *cl; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1083 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1084 for (cl = ctx->copied; cl; cl = cl->next) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1085 ngx_pfree(r->pool, cl->buf->start); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1086 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1087 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1088 ctx->copied = NULL; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1089 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1090 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1091 |
497 | 1092 static ngx_int_t |
573 | 1093 ngx_http_gzip_add_variables(ngx_conf_t *cf) |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1094 { |
880 | 1095 ngx_http_variable_t *var; |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1096 |
583 | 1097 var = ngx_http_add_variable(cf, &ngx_http_gzip_ratio, NGX_HTTP_VAR_NOHASH); |
573 | 1098 if (var == NULL) { |
1099 return NGX_ERROR; | |
1100 } | |
1101 | |
637 | 1102 var->get_handler = ngx_http_gzip_ratio_variable; |
573 | 1103 |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1104 return NGX_OK; |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1105 } |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1106 |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1107 |
497 | 1108 static ngx_int_t |
573 | 1109 ngx_http_gzip_ratio_variable(ngx_http_request_t *r, |
1110 ngx_http_variable_value_t *v, uintptr_t data) | |
1111 { | |
1112 ngx_uint_t zint, zfrac; | |
1113 ngx_http_gzip_ctx_t *ctx; | |
1114 | |
1115 ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module); | |
1116 | |
1117 if (ctx == NULL || ctx->zout == 0) { | |
1118 v->not_found = 1; | |
1119 return NGX_OK; | |
1120 } | |
1121 | |
7033
ab5117642647
Gzip: fixed style in $gzip_ratio variable handler.
Ruslan Ermilov <ru@nginx.com>
parents:
6973
diff
changeset
|
1122 v->valid = 1; |
ab5117642647
Gzip: fixed style in $gzip_ratio variable handler.
Ruslan Ermilov <ru@nginx.com>
parents:
6973
diff
changeset
|
1123 v->no_cacheable = 0; |
ab5117642647
Gzip: fixed style in $gzip_ratio variable handler.
Ruslan Ermilov <ru@nginx.com>
parents:
6973
diff
changeset
|
1124 v->not_found = 0; |
ab5117642647
Gzip: fixed style in $gzip_ratio variable handler.
Ruslan Ermilov <ru@nginx.com>
parents:
6973
diff
changeset
|
1125 |
2049 | 1126 v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN + 3); |
573 | 1127 if (v->data == NULL) { |
1128 return NGX_ERROR; | |
1129 } | |
1130 | |
1131 zint = (ngx_uint_t) (ctx->zin / ctx->zout); | |
1132 zfrac = (ngx_uint_t) ((ctx->zin * 100 / ctx->zout) % 100); | |
1133 | |
1134 if ((ctx->zin * 1000 / ctx->zout) % 10 > 4) { | |
1135 | |
1136 /* the rounding, e.g., 2.125 to 2.13 */ | |
1137 | |
1138 zfrac++; | |
1139 | |
1140 if (zfrac > 99) { | |
1141 zint++; | |
1142 zfrac = 0; | |
1143 } | |
1144 } | |
1145 | |
1146 v->len = ngx_sprintf(v->data, "%ui.%02ui", zint, zfrac) - v->data; | |
1147 | |
1148 return NGX_OK; | |
1149 } | |
1150 | |
1151 | |
497 | 1152 static void * |
1153 ngx_http_gzip_create_conf(ngx_conf_t *cf) | |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1154 { |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1155 ngx_http_gzip_conf_t *conf; |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1156 |
501 | 1157 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gzip_conf_t)); |
1158 if (conf == NULL) { | |
2912
c7d57b539248
return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents:
2542
diff
changeset
|
1159 return NULL; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1160 } |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1161 |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1162 /* |
479 | 1163 * set by ngx_pcalloc(): |
1164 * | |
1165 * conf->bufs.num = 0; | |
2166
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1166 * conf->types = { NULL }; |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1167 * conf->types_keys = NULL; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1168 */ |
320
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
1169 |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1170 conf->enable = NGX_CONF_UNSET; |
290
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
289
diff
changeset
|
1171 conf->no_buffer = NGX_CONF_UNSET; |
314
d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
1172 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1173 conf->postpone_gzipping = NGX_CONF_UNSET_SIZE; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1174 conf->level = NGX_CONF_UNSET; |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1175 conf->wbits = NGX_CONF_UNSET_SIZE; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1176 conf->memlevel = NGX_CONF_UNSET_SIZE; |
356
2e3cbc1bbe3c
nginx-0.0.7-2004-06-16-19:32:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
355
diff
changeset
|
1177 conf->min_length = NGX_CONF_UNSET; |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1178 |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1179 return conf; |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1180 } |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1181 |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1182 |
497 | 1183 static char * |
1184 ngx_http_gzip_merge_conf(ngx_conf_t *cf, void *parent, void *child) | |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1185 { |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1186 ngx_http_gzip_conf_t *prev = parent; |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1187 ngx_http_gzip_conf_t *conf = child; |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1188 |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1189 ngx_conf_merge_value(conf->enable, prev->enable, 0); |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1190 ngx_conf_merge_value(conf->no_buffer, prev->no_buffer, 0); |
314
d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
1191 |
2412
086c20fe2e97
set default gzip_buffers to 32 4k or 16 8k
Igor Sysoev <igor@sysoev.ru>
parents:
2410
diff
changeset
|
1192 ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, |
086c20fe2e97
set default gzip_buffers to 32 4k or 16 8k
Igor Sysoev <igor@sysoev.ru>
parents:
2410
diff
changeset
|
1193 (128 * 1024) / ngx_pagesize, ngx_pagesize); |
314
d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
1194 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1195 ngx_conf_merge_size_value(conf->postpone_gzipping, prev->postpone_gzipping, |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1196 0); |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1197 ngx_conf_merge_value(conf->level, prev->level, 1); |
319
7a8ebba985a9
nginx-0.0.3-2004-04-16-19:27:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
315
diff
changeset
|
1198 ngx_conf_merge_size_value(conf->wbits, prev->wbits, MAX_WBITS); |
7a8ebba985a9
nginx-0.0.3-2004-04-16-19:27:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
315
diff
changeset
|
1199 ngx_conf_merge_size_value(conf->memlevel, prev->memlevel, |
7a8ebba985a9
nginx-0.0.3-2004-04-16-19:27:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
315
diff
changeset
|
1200 MAX_MEM_LEVEL - 1); |
577 | 1201 ngx_conf_merge_value(conf->min_length, prev->min_length, 20); |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1202 |
3372
6b8e5c882e47
support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents:
3314
diff
changeset
|
1203 if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types, |
6b8e5c882e47
support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents:
3314
diff
changeset
|
1204 &prev->types_keys, &prev->types, |
2166
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1205 ngx_http_html_default_types) |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1206 != NGX_OK) |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1207 { |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1208 return NGX_CONF_ERROR; |
452 | 1209 } |
1210 | |
1211 return NGX_CONF_OK; | |
1212 } | |
1213 | |
1214 | |
681 | 1215 static ngx_int_t |
1216 ngx_http_gzip_filter_init(ngx_conf_t *cf) | |
1217 { | |
1218 ngx_http_next_header_filter = ngx_http_top_header_filter; | |
1219 ngx_http_top_header_filter = ngx_http_gzip_header_filter; | |
1220 | |
1221 ngx_http_next_body_filter = ngx_http_top_body_filter; | |
1222 ngx_http_top_body_filter = ngx_http_gzip_body_filter; | |
1223 | |
1224 return NGX_OK; | |
1225 } | |
1226 | |
1227 | |
497 | 1228 static char * |
527 | 1229 ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data) |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1230 { |
2290 | 1231 size_t *np = data; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1232 |
2290 | 1233 size_t wbits, wsize; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1234 |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1235 wbits = 15; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1236 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1237 for (wsize = 32 * 1024; wsize > 256; wsize >>= 1) { |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1238 |
158
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
1239 if (wsize == *np) { |
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
1240 *np = wbits; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1241 |
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1242 return NGX_CONF_OK; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1243 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1244 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1245 wbits--; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1246 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1247 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1248 return "must be 512, 1k, 2k, 4k, 8k, 16k, or 32k"; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1249 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1250 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1251 |
497 | 1252 static char * |
527 | 1253 ngx_http_gzip_hash(ngx_conf_t *cf, void *post, void *data) |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1254 { |
2290 | 1255 size_t *np = data; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1256 |
2290 | 1257 size_t memlevel, hsize; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1258 |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1259 memlevel = 9; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1260 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1261 for (hsize = 128 * 1024; hsize > 256; hsize >>= 1) { |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1262 |
158
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
1263 if (hsize == *np) { |
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
1264 *np = memlevel; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1265 |
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1266 return NGX_CONF_OK; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1267 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1268 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1269 memlevel--; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1270 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1271 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1272 return "must be 512, 1k, 2k, 4k, 8k, 16k, 32k, 64k, or 128k"; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1273 } |