Mercurial > hg > nginx-quic
annotate src/http/modules/ngx_http_gzip_filter_module.c @ 6081:12ab5cd445c0 stable-1.6
Core: fixed potential buffer overrun when initializing hash.
Initial size as calculated from the number of elements may be bigger
than max_size. If this happens, make sure to set size to max_size.
Reported by Chris West.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Tue, 24 Feb 2015 18:37:14 +0300 |
parents | c52a761a2029 |
children | e491b26fa5a1 |
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; |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
60 |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
61 size_t zin; |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
62 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
|
63 |
290
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
289
diff
changeset
|
64 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
|
65 z_stream zstream; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
66 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
|
67 } 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
|
68 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
69 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
70 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
71 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
72 struct gztrailer { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
73 uint32_t crc32; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
74 uint32_t zlen; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
75 }; |
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 #else /* NGX_HAVE_BIG_ENDIAN || !NGX_HAVE_NONALIGNED */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
78 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
79 struct gztrailer { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
80 u_char crc32[4]; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
81 u_char zlen[4]; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
82 }; |
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 #endif |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
85 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
86 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
87 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
|
88 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
|
89 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
|
90 ngx_chain_t *in); |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
91 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
|
92 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
93 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
|
94 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
95 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
|
96 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
97 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
|
98 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
99 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
|
100 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
101 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
|
102 ngx_http_gzip_ctx_t *ctx); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
103 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
104 static void *ngx_http_gzip_filter_alloc(void *opaque, u_int items, |
497 | 105 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
|
106 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
|
107 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
|
108 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
|
109 |
573 | 110 static ngx_int_t ngx_http_gzip_add_variables(ngx_conf_t *cf); |
111 static ngx_int_t ngx_http_gzip_ratio_variable(ngx_http_request_t *r, | |
112 ngx_http_variable_value_t *v, uintptr_t data); | |
479 | 113 |
681 | 114 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
|
115 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
|
116 static char *ngx_http_gzip_merge_conf(ngx_conf_t *cf, |
497 | 117 void *parent, void *child); |
527 | 118 static char *ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data); |
119 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
|
120 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
121 |
158
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
122 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
|
123 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
|
124 }; |
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
125 |
527 | 126 static ngx_conf_post_handler_pt ngx_http_gzip_window_p = ngx_http_gzip_window; |
127 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
|
128 |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
129 |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
130 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
|
131 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
132 { ngx_string("gzip"), |
485 | 133 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF |
134 |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
|
135 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
|
136 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
|
137 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
|
138 NULL }, |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
139 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
140 { 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
|
141 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
|
142 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
|
143 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
|
144 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
|
145 NULL }, |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
146 |
452 | 147 { ngx_string("gzip_types"), |
148 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
|
149 ngx_http_types_slot, |
452 | 150 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
|
151 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
|
152 &ngx_http_html_default_types[0] }, |
452 | 153 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
154 { 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
|
155 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
|
156 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
|
157 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
|
158 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
|
159 &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
|
160 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
161 { 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
|
162 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
|
163 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
|
164 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
|
165 offsetof(ngx_http_gzip_conf_t, wbits), |
527 | 166 &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
|
167 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
168 { 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
|
169 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
|
170 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
|
171 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
|
172 offsetof(ngx_http_gzip_conf_t, memlevel), |
527 | 173 &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
|
174 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
175 { ngx_string("postpone_gzipping"), |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
176 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
|
177 ngx_conf_set_size_slot, |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
178 NGX_HTTP_LOC_CONF_OFFSET, |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
179 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
|
180 NULL }, |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
181 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
182 { 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
|
183 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
|
184 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
|
185 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
|
186 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
|
187 NULL }, |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
188 |
320
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
189 { 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
|
190 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
|
191 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
|
192 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
|
193 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
|
194 NULL }, |
314
d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
195 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
177
diff
changeset
|
196 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
|
197 }; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
198 |
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 static ngx_http_module_t ngx_http_gzip_filter_module_ctx = { |
573 | 201 ngx_http_gzip_add_variables, /* preconfiguration */ |
681 | 202 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
|
203 |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
204 NULL, /* create main configuration */ |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
205 NULL, /* init main configuration */ |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
206 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
207 NULL, /* create server configuration */ |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
208 NULL, /* merge server configuration */ |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
209 |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
210 ngx_http_gzip_create_conf, /* create location configuration */ |
489 | 211 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
|
212 }; |
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 ngx_module_t ngx_http_gzip_filter_module = { |
509 | 216 NGX_MODULE_V1, |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
217 &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
|
218 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
|
219 NGX_HTTP_MODULE, /* module type */ |
541 | 220 NULL, /* init master */ |
681 | 221 NULL, /* init module */ |
541 | 222 NULL, /* init process */ |
223 NULL, /* init thread */ | |
224 NULL, /* exit thread */ | |
225 NULL, /* exit process */ | |
226 NULL, /* exit master */ | |
227 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
|
228 }; |
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 |
573 | 231 static ngx_str_t ngx_http_gzip_ratio = ngx_string("gzip_ratio"); |
509 | 232 |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
233 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
|
234 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
|
235 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
236 |
497 | 237 static ngx_int_t |
238 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
|
239 { |
2051
115e6f029fcc
"gzip_vary on" always sends "Vary: Accept-Encoding" header
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
240 ngx_table_elt_t *h; |
115e6f029fcc
"gzip_vary on" always sends "Vary: Accept-Encoding" header
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
241 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
|
242 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
|
243 |
135
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
244 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
|
245 |
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
246 if (!conf->enable |
452 | 247 || (r->headers_out.status != NGX_HTTP_OK |
248 && r->headers_out.status != NGX_HTTP_FORBIDDEN | |
249 && 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
|
250 || (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
|
251 && 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
|
252 || (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
|
253 && 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
|
254 || 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
|
255 || 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
|
256 { |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
257 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
|
258 } |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
259 |
3313 | 260 r->gzip_vary = 1; |
261 | |
3773 | 262 #if (NGX_HTTP_DEGRADATION) |
263 { | |
264 ngx_http_core_loc_conf_t *clcf; | |
265 | |
266 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | |
267 | |
268 if (clcf->gzip_disable_degradation && ngx_http_degraded(r)) { | |
269 return ngx_http_next_header_filter(r); | |
270 } | |
271 } | |
272 #endif | |
273 | |
3313 | 274 if (!r->gzip_tested) { |
275 if (ngx_http_gzip_ok(r) != NGX_OK) { | |
276 return ngx_http_next_header_filter(r); | |
277 } | |
278 | |
279 } else if (!r->gzip_ok) { | |
280 return ngx_http_next_header_filter(r); | |
281 } | |
282 | |
501 | 283 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gzip_ctx_t)); |
284 if (ctx == NULL) { | |
285 return NGX_ERROR; | |
286 } | |
314
d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
287 |
501 | 288 ngx_http_set_ctx(r, ctx, ngx_http_gzip_filter_module); |
289 | |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
290 ctx->request = r; |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
291 ctx->buffering = (conf->postpone_gzipping != 0); |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
292 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
293 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
|
294 |
1790
775edc46ee66
ngx_http_gzip_static_module and gzip_disable
Igor Sysoev <igor@sysoev.ru>
parents:
1626
diff
changeset
|
295 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
|
296 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
|
297 return NGX_ERROR; |
84036764e215
nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
160
diff
changeset
|
298 } |
135
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
299 |
1790
775edc46ee66
ngx_http_gzip_static_module and gzip_disable
Igor Sysoev <igor@sysoev.ru>
parents:
1626
diff
changeset
|
300 h->hash = 1; |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3379
diff
changeset
|
301 ngx_str_set(&h->key, "Content-Encoding"); |
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3379
diff
changeset
|
302 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
|
303 r->headers_out.content_encoding = h; |
775edc46ee66
ngx_http_gzip_static_module and gzip_disable
Igor Sysoev <igor@sysoev.ru>
parents:
1626
diff
changeset
|
304 |
513 | 305 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
|
306 |
577 | 307 ngx_http_clear_content_length(r); |
308 ngx_http_clear_accept_ranges(r); | |
4746
4a18bf1833a9
Entity tags: clear on entity changes.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4468
diff
changeset
|
309 ngx_http_clear_etag(r); |
577 | 310 |
155
46eb23d9471d
nginx-0.0.1-2003-10-22-20:38:26 import
Igor Sysoev <igor@sysoev.ru>
parents:
154
diff
changeset
|
311 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
|
312 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
313 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
314 |
497 | 315 static ngx_int_t |
316 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
|
317 { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
318 int rc; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
319 ngx_chain_t *cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
320 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
|
321 |
243
bf2faf694c19
nginx-0.0.1-2004-01-28-23:38:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
239
diff
changeset
|
322 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
|
323 |
4990
e2794322ec76
Fixed HEAD requests handling when proxying is used (closes #261).
Valentin Bartenev <vbart@nginx.com>
parents:
4965
diff
changeset
|
324 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
|
325 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
|
326 } |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
327 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
328 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
|
329 "http gzip filter"); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
330 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
331 if (ctx->buffering) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
332 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
333 /* |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
334 * 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
|
335 * 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
|
336 * 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
|
337 * 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
|
338 * 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
|
339 * 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
|
340 */ |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
341 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
342 if (in) { |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
343 switch (ngx_http_gzip_filter_buffer(ctx, in)) { |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
344 |
2468 | 345 case NGX_OK: |
346 return NGX_OK; | |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
347 |
2468 | 348 case NGX_DONE: |
349 in = NULL; | |
350 break; | |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
351 |
2468 | 352 default: /* NGX_ERROR */ |
353 goto failed; | |
354 } | |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
355 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
356 } else { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
357 ctx->buffering = 0; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
358 } |
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 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
361 if (ctx->preallocated == NULL) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
362 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
|
363 goto failed; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
364 } |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
365 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
366 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
367 if (in) { |
2536
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2468
diff
changeset
|
368 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
|
369 goto failed; |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
370 } |
5291
84155a389bcc
Gzip: clearing of c->buffered if all data are flushed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5107
diff
changeset
|
371 |
84155a389bcc
Gzip: clearing of c->buffered if all data are flushed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5107
diff
changeset
|
372 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
|
373 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
374 |
5432
c52a761a2029
Gzip, gunzip: flush pending data when incoming chain is NULL.
Yichun Zhang <agentzh@gmail.com>
parents:
5291
diff
changeset
|
375 if (ctx->nomem || in == NULL) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
376 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
377 /* flush busy buffers */ |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
378 |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
379 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
|
380 goto failed; |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
381 } |
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 cl = NULL; |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
384 |
4114
5db098f97e0e
API change: ngx_chain_update_chains() now requires pool.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3773
diff
changeset
|
385 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
|
386 (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
|
387 ctx->nomem = 0; |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
388 } |
141
656d468f4ead
nginx-0.0.1-2003-10-08-19:32:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
136
diff
changeset
|
389 |
135
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
390 for ( ;; ) { |
e29909bd9b8a
nginx-0.0.1-2003-09-28-23:29:06 import
Igor Sysoev <igor@sysoev.ru>
parents:
134
diff
changeset
|
391 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
392 /* cycle while we can write to a client */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
393 |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
394 for ( ;; ) { |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
395 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
396 /* 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
|
397 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
398 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
|
399 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
400 if (rc == NGX_DECLINED) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
401 break; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
402 } |
133
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 if (rc == NGX_AGAIN) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
405 continue; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
406 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
407 |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
408 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
409 /* ... 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
|
410 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
411 rc = ngx_http_gzip_filter_get_buf(r, ctx); |
501 | 412 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
413 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
|
414 break; |
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
415 } |
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
416 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
417 if (rc == NGX_ERROR) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
418 goto failed; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
419 } |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
420 |
479 | 421 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
422 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
|
423 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
424 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
|
425 break; |
ba876b26b76d
nginx-0.0.3-2004-04-21-22:54:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
322
diff
changeset
|
426 } |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
427 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
428 if (rc == NGX_ERROR) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
429 goto failed; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
430 } |
501 | 431 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
432 /* rc == NGX_AGAIN */ |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
433 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
434 |
1626 | 435 if (ctx->out == NULL) { |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
436 ngx_http_gzip_filter_free_copy_buf(r, ctx); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
437 |
2292 | 438 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
|
439 } |
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
440 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
441 if (!ctx->gzheader) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
442 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
|
443 goto failed; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
444 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
445 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
446 |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
447 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
|
448 |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
449 if (rc == NGX_ERROR) { |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
450 goto failed; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
451 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
452 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
453 ngx_http_gzip_filter_free_copy_buf(r, ctx); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
454 |
4114
5db098f97e0e
API change: ngx_chain_update_chains() now requires pool.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3773
diff
changeset
|
455 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out, |
501 | 456 (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
|
457 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
|
458 |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
459 ctx->nomem = 0; |
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
460 |
327
e0f3f238db09
nginx-0.0.3-2004-04-26-17:40:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
461 if (ctx->done) { |
2287
baa61933d5ed
use nomem flag to flush busy bufs,
Igor Sysoev <igor@sysoev.ru>
parents:
2166
diff
changeset
|
462 return rc; |
327
e0f3f238db09
nginx-0.0.3-2004-04-26-17:40:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
463 } |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
464 } |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
465 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
466 /* unreachable */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
467 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
468 failed: |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
469 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
470 ctx->done = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
471 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
472 if (ctx->preallocated) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
473 deflateEnd(&ctx->zstream); |
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 ngx_pfree(r->pool, ctx->preallocated); |
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 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
478 ngx_http_gzip_filter_free_copy_buf(r, ctx); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
479 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
480 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
481 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
482 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
483 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
484 static void |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
485 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
|
486 { |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
487 int wbits, memlevel; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
488 ngx_http_gzip_conf_t *conf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
489 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
490 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
|
491 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
492 wbits = conf->wbits; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
493 memlevel = conf->memlevel; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
494 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
495 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
|
496 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
497 /* 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
|
498 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
499 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
|
500 wbits--; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
501 memlevel--; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
502 } |
4965
58dfef910ccd
Gzip: fixed zlib memLevel adjusting.
Valentin Bartenev <vbart@nginx.com>
parents:
4746
diff
changeset
|
503 |
58dfef910ccd
Gzip: fixed zlib memLevel adjusting.
Valentin Bartenev <vbart@nginx.com>
parents:
4746
diff
changeset
|
504 if (memlevel < 1) { |
58dfef910ccd
Gzip: fixed zlib memLevel adjusting.
Valentin Bartenev <vbart@nginx.com>
parents:
4746
diff
changeset
|
505 memlevel = 1; |
58dfef910ccd
Gzip: fixed zlib memLevel adjusting.
Valentin Bartenev <vbart@nginx.com>
parents:
4746
diff
changeset
|
506 } |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
507 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
508 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
509 ctx->wbits = wbits; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
510 ctx->memlevel = memlevel; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
511 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
512 /* |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
513 * 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
|
514 * 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
|
515 * 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
|
516 * 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
|
517 * 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
|
518 * |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
519 * 8K is for zlib deflate_state, it takes |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
520 * *) 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
|
521 * *) 5920 bytes on amd64 and sparc64 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
522 */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
523 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
524 ctx->allocated = 8192 + (1 << (wbits + 2)) + (1 << (memlevel + 9)); |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
525 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
526 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
527 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
528 static ngx_int_t |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
529 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
|
530 { |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
531 size_t size, buffered; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
532 ngx_buf_t *b, *buf; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
533 ngx_chain_t *cl, **ll; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
534 ngx_http_request_t *r; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
535 ngx_http_gzip_conf_t *conf; |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
536 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
537 r = ctx->request; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
538 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
539 r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
540 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
541 buffered = 0; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
542 ll = &ctx->in; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
543 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
544 for (cl = ctx->in; cl; cl = cl->next) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
545 buffered += cl->buf->last - cl->buf->pos; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
546 ll = &cl->next; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
547 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
548 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
549 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
|
550 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
551 while (in) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
552 cl = ngx_alloc_chain_link(r->pool); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
553 if (cl == NULL) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
554 return NGX_ERROR; |
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 b = in->buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
558 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
559 size = b->last - b->pos; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
560 buffered += size; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
561 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
562 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
|
563 ctx->buffering = 0; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
564 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
565 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
566 if (ctx->buffering && size) { |
2410
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 buf = ngx_create_temp_buf(r->pool, size); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
569 if (buf == NULL) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
570 return NGX_ERROR; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
571 } |
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 buf->last = ngx_cpymem(buf->pos, b->pos, size); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
574 b->pos = b->last; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
575 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
576 buf->last_buf = b->last_buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
577 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
|
578 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
579 cl->buf = buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
580 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
581 } else { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
582 cl->buf = b; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
583 } |
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 *ll = cl; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
586 ll = &cl->next; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
587 in = in->next; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
588 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
589 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
590 *ll = NULL; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
591 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
592 return ctx->buffering ? NGX_OK : NGX_DONE; |
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 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
595 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
596 static ngx_int_t |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
597 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
|
598 ngx_http_gzip_ctx_t *ctx) |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
599 { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
600 int rc; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
601 ngx_http_gzip_conf_t *conf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
602 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
603 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
|
604 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
605 ctx->preallocated = ngx_palloc(r->pool, ctx->allocated); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
606 if (ctx->preallocated == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
607 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
608 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
609 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
610 ctx->free_mem = ctx->preallocated; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
611 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
612 ctx->zstream.zalloc = ngx_http_gzip_filter_alloc; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
613 ctx->zstream.zfree = ngx_http_gzip_filter_free; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
614 ctx->zstream.opaque = ctx; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
615 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
616 rc = deflateInit2(&ctx->zstream, (int) conf->level, Z_DEFLATED, |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
617 - ctx->wbits, ctx->memlevel, Z_DEFAULT_STRATEGY); |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
618 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
619 if (rc != Z_OK) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
620 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
|
621 "deflateInit2() failed: %d", rc); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
622 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
623 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
624 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
625 ctx->last_out = &ctx->out; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
626 ctx->crc32 = crc32(0L, Z_NULL, 0); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
627 ctx->flush = Z_NO_FLUSH; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
628 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
629 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
630 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
631 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
632 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
633 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
634 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
|
635 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
636 ngx_buf_t *b; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
637 ngx_chain_t *cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
638 static u_char gzheader[10] = |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
639 { 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
|
640 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
641 b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
642 if (b == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
643 return NGX_ERROR; |
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 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
646 b->memory = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
647 b->pos = gzheader; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
648 b->last = b->pos + 10; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
649 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
650 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
651 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
652 return NGX_ERROR; |
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 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
655 cl->buf = b; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
656 cl->next = ctx->out; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
657 ctx->out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
658 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
659 ctx->gzheader = 1; |
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 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
662 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
663 |
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 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
666 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
|
667 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
668 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
|
669 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
670 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
671 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
672 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
|
673 "gzip in: %p", ctx->in); |
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 if (ctx->in == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
676 return NGX_DECLINED; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
677 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
678 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
679 if (ctx->copy_buf) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
680 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
681 /* |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
682 * 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
|
683 * but postpone free()ing after zlib compressing and data output |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
684 */ |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
685 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
686 ctx->copy_buf->next = ctx->copied; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
687 ctx->copied = ctx->copy_buf; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
688 ctx->copy_buf = NULL; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
689 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
690 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
691 ctx->in_buf = ctx->in->buf; |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
692 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
693 if (ctx->in_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
|
694 ctx->copy_buf = ctx->in; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
695 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
696 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
697 ctx->in = ctx->in->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
698 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
699 ctx->zstream.next_in = ctx->in_buf->pos; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
700 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
|
701 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
702 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
|
703 "gzip in_buf:%p ni:%p ai:%ud", |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
704 ctx->in_buf, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
705 ctx->zstream.next_in, ctx->zstream.avail_in); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
706 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
707 if (ctx->in_buf->last_buf) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
708 ctx->flush = Z_FINISH; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
709 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
710 } else if (ctx->in_buf->flush) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
711 ctx->flush = Z_SYNC_FLUSH; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
712 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
713 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
714 if (ctx->zstream.avail_in) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
715 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
716 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
|
717 ctx->zstream.avail_in); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
718 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
719 } else if (ctx->flush == Z_NO_FLUSH) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
720 return NGX_AGAIN; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
721 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
722 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
723 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
724 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
725 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
726 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
727 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
728 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
|
729 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
730 ngx_http_gzip_conf_t *conf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
731 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
732 if (ctx->zstream.avail_out) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
733 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
734 } |
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 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
|
737 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
738 if (ctx->free) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
739 ctx->out_buf = ctx->free->buf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
740 ctx->free = ctx->free->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
741 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
742 } else if (ctx->bufs < conf->bufs.num) { |
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 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
|
745 if (ctx->out_buf == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
746 return NGX_ERROR; |
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 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
749 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
|
750 ctx->out_buf->recycled = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
751 ctx->bufs++; |
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 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
754 ctx->nomem = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
755 return NGX_DECLINED; |
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 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
758 ctx->zstream.next_out = ctx->out_buf->pos; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
759 ctx->zstream.avail_out = conf->bufs.size; |
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 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
762 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
763 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
764 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
765 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
766 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
|
767 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
768 int rc; |
4468
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
769 ngx_buf_t *b; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
770 ngx_chain_t *cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
771 ngx_http_gzip_conf_t *conf; |
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 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
|
774 "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
|
775 ctx->zstream.next_in, ctx->zstream.next_out, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
776 ctx->zstream.avail_in, ctx->zstream.avail_out, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
777 ctx->flush, ctx->redo); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
778 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
779 rc = deflate(&ctx->zstream, ctx->flush); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
780 |
4468
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
781 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
|
782 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
|
783 "deflate() failed: %d, %d", ctx->flush, rc); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
784 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
785 } |
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 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
|
788 "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
|
789 ctx->zstream.next_in, ctx->zstream.next_out, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
790 ctx->zstream.avail_in, ctx->zstream.avail_out, |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
791 rc); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
792 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
793 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
|
794 "gzip in_buf:%p pos:%p", |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
795 ctx->in_buf, ctx->in_buf->pos); |
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 if (ctx->zstream.next_in) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
798 ctx->in_buf->pos = ctx->zstream.next_in; |
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 if (ctx->zstream.avail_in == 0) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
801 ctx->zstream.next_in = NULL; |
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 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
805 ctx->out_buf->last = ctx->zstream.next_out; |
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 if (ctx->zstream.avail_out == 0) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
808 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
809 /* zlib wants to output some more gzipped data */ |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
810 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
811 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
812 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
813 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
814 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
815 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
816 cl->buf = ctx->out_buf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
817 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
818 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
819 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
820 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
821 ctx->redo = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
822 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
823 return NGX_AGAIN; |
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 ctx->redo = 0; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
827 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
828 if (ctx->flush == Z_SYNC_FLUSH) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
829 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
830 ctx->flush = Z_NO_FLUSH; |
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 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
833 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
834 return NGX_ERROR; |
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 |
4468
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
837 b = ctx->out_buf; |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
838 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
839 if (ngx_buf_size(b) == 0) { |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
840 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
841 b = ngx_calloc_buf(ctx->request->pool); |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
842 if (b == NULL) { |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
843 return NGX_ERROR; |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
844 } |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
845 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
846 } else { |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
847 ctx->zstream.avail_out = 0; |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
848 } |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
849 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
850 b->flush = 1; |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
851 |
93dd50a9dc70
Gzip filter: handling of empty flush buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
852 cl->buf = b; |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
853 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
854 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
855 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
856 |
5291
84155a389bcc
Gzip: clearing of c->buffered if all data are flushed.
Maxim Dounin <mdounin@mdounin.ru>
parents:
5107
diff
changeset
|
857 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
|
858 |
2291
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
859 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
860 } |
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 if (rc == Z_STREAM_END) { |
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 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
|
865 return NGX_ERROR; |
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 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
868 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
869 } |
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 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
|
872 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
873 if (conf->no_buffer && ctx->in == NULL) { |
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 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
876 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
877 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
878 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
879 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
880 cl->buf = ctx->out_buf; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
881 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
882 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
883 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
884 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
885 return NGX_OK; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
886 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
887 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
888 return NGX_AGAIN; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
889 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
890 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
891 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
892 static ngx_int_t |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
893 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
|
894 ngx_http_gzip_ctx_t *ctx) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
895 { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
896 int rc; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
897 ngx_buf_t *b; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
898 ngx_chain_t *cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
899 struct gztrailer *trailer; |
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 ctx->zin = ctx->zstream.total_in; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
902 ctx->zout = 10 + ctx->zstream.total_out + 8; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
903 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
904 rc = deflateEnd(&ctx->zstream); |
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 if (rc != Z_OK) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
907 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
|
908 "deflateEnd() failed: %d", rc); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
909 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
910 } |
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 ngx_pfree(r->pool, ctx->preallocated); |
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 if (ctx->zstream.avail_out >= 8) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
925 trailer = (struct gztrailer *) ctx->out_buf->last; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
926 ctx->out_buf->last += 8; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
927 ctx->out_buf->last_buf = 1; |
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 } else { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
930 b = ngx_create_temp_buf(r->pool, 8); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
931 if (b == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
932 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
933 } |
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 b->last_buf = 1; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
936 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
937 cl = ngx_alloc_chain_link(r->pool); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
938 if (cl == NULL) { |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
939 return NGX_ERROR; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
940 } |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
941 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
942 cl->buf = b; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
943 cl->next = NULL; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
944 *ctx->last_out = cl; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
945 ctx->last_out = &cl->next; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
946 trailer = (struct gztrailer *) b->pos; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
947 b->last += 8; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
948 } |
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 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
951 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
952 trailer->crc32 = ctx->crc32; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
953 trailer->zlen = ctx->zin; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
954 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
955 #else |
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 trailer->crc32[0] = (u_char) (ctx->crc32 & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
958 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
|
959 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
|
960 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
|
961 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
962 trailer->zlen[0] = (u_char) (ctx->zin & 0xff); |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
963 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
|
964 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
|
965 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
|
966 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
967 #endif |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
968 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
969 ctx->zstream.avail_in = 0; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
970 ctx->zstream.avail_out = 0; |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
971 |
e9a1cddf2aaa
*) split ngx_http_gzip_body_filter()
Igor Sysoev <igor@sysoev.ru>
parents:
2290
diff
changeset
|
972 ctx->done = 1; |
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 r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED; |
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 return NGX_OK; |
133
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
977 } |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
978 |
b27548f540ad
nginx-0.0.1-2003-09-24-23:51:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
979 |
497 | 980 static void * |
981 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
|
982 { |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
983 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
|
984 |
294
5cfd65b8b0a7
nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
292
diff
changeset
|
985 void *p; |
5cfd65b8b0a7
nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
292
diff
changeset
|
986 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
|
987 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
988 alloc = items * size; |
461 | 989 |
2425
3d60d55b9ad0
do not try to align to a page size, allocate just 8K,
Igor Sysoev <igor@sysoev.ru>
parents:
2412
diff
changeset
|
990 if (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
|
991 |
346
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
992 /* |
461 | 993 * The zlib deflate_state allocation, it takes about 6K, |
994 * 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
|
995 */ |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
996 |
2425
3d60d55b9ad0
do not try to align to a page size, allocate just 8K,
Igor Sysoev <igor@sysoev.ru>
parents:
2412
diff
changeset
|
997 alloc = 8192; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
998 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
999 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1000 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
|
1001 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
|
1002 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
|
1003 ctx->allocated -= alloc; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1004 |
257
70e1c7d2b83d
nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
243
diff
changeset
|
1005 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, |
461 | 1006 "gzip alloc: n:%ud s:%ud a:%ud p:%p", |
257
70e1c7d2b83d
nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
243
diff
changeset
|
1007 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
|
1008 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1009 return p; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1010 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1011 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1012 ngx_log_error(NGX_LOG_ALERT, ctx->request->connection->log, 0, |
461 | 1013 "gzip filter failed to use preallocated memory: %ud of %ud", |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1014 items * size, ctx->allocated); |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1015 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1016 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
|
1017 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1018 return p; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1019 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1020 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1021 |
497 | 1022 static void |
1023 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
|
1024 { |
282
30310107dbc9
nginx-0.0.2-2004-03-09-22:47:07 import
Igor Sysoev <igor@sysoev.ru>
parents:
265
diff
changeset
|
1025 #if 0 |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1026 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
|
1027 |
257
70e1c7d2b83d
nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
243
diff
changeset
|
1028 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, |
461 | 1029 "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
|
1030 #endif |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1031 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1032 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1033 |
2410
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1034 static void |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1035 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
|
1036 ngx_http_gzip_ctx_t *ctx) |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1037 { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1038 ngx_chain_t *cl; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1039 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1040 for (cl = ctx->copied; cl; cl = cl->next) { |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1041 ngx_pfree(r->pool, cl->buf->start); |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1042 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1043 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1044 ctx->copied = NULL; |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1045 } |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1046 |
bbfaeb220e90
postpone zlib memory allocation
Igor Sysoev <igor@sysoev.ru>
parents:
2292
diff
changeset
|
1047 |
497 | 1048 static ngx_int_t |
573 | 1049 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
|
1050 { |
880 | 1051 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
|
1052 |
583 | 1053 var = ngx_http_add_variable(cf, &ngx_http_gzip_ratio, NGX_HTTP_VAR_NOHASH); |
573 | 1054 if (var == NULL) { |
1055 return NGX_ERROR; | |
1056 } | |
1057 | |
637 | 1058 var->get_handler = ngx_http_gzip_ratio_variable; |
573 | 1059 |
177
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1060 return NGX_OK; |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1061 } |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1062 |
4db54fdbcbe7
nginx-0.0.1-2003-11-10-20:17:31 import
Igor Sysoev <igor@sysoev.ru>
parents:
166
diff
changeset
|
1063 |
497 | 1064 static ngx_int_t |
573 | 1065 ngx_http_gzip_ratio_variable(ngx_http_request_t *r, |
1066 ngx_http_variable_value_t *v, uintptr_t data) | |
1067 { | |
1068 ngx_uint_t zint, zfrac; | |
1069 ngx_http_gzip_ctx_t *ctx; | |
1070 | |
577 | 1071 v->valid = 1; |
1565 | 1072 v->no_cacheable = 0; |
573 | 1073 v->not_found = 0; |
1074 | |
1075 ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module); | |
1076 | |
1077 if (ctx == NULL || ctx->zout == 0) { | |
1078 v->not_found = 1; | |
1079 return NGX_OK; | |
1080 } | |
1081 | |
2049 | 1082 v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN + 3); |
573 | 1083 if (v->data == NULL) { |
1084 return NGX_ERROR; | |
1085 } | |
1086 | |
1087 zint = (ngx_uint_t) (ctx->zin / ctx->zout); | |
1088 zfrac = (ngx_uint_t) ((ctx->zin * 100 / ctx->zout) % 100); | |
1089 | |
1090 if ((ctx->zin * 1000 / ctx->zout) % 10 > 4) { | |
1091 | |
1092 /* the rounding, e.g., 2.125 to 2.13 */ | |
1093 | |
1094 zfrac++; | |
1095 | |
1096 if (zfrac > 99) { | |
1097 zint++; | |
1098 zfrac = 0; | |
1099 } | |
1100 } | |
1101 | |
1102 v->len = ngx_sprintf(v->data, "%ui.%02ui", zint, zfrac) - v->data; | |
1103 | |
1104 return NGX_OK; | |
1105 } | |
1106 | |
1107 | |
497 | 1108 static void * |
1109 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
|
1110 { |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1111 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
|
1112 |
501 | 1113 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gzip_conf_t)); |
1114 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
|
1115 return NULL; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1116 } |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1117 |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1118 /* |
479 | 1119 * set by ngx_pcalloc(): |
1120 * | |
1121 * 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
|
1122 * conf->types = { NULL }; |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1123 * 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
|
1124 */ |
320
d621239c30f7
nginx-0.0.3-2004-04-18-23:06:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
319
diff
changeset
|
1125 |
134
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1126 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
|
1127 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
|
1128 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1129 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
|
1130 conf->level = NGX_CONF_UNSET; |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1131 conf->wbits = NGX_CONF_UNSET_SIZE; |
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1132 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
|
1133 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
|
1134 |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1135 return conf; |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1136 } |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1137 |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1138 |
497 | 1139 static char * |
1140 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
|
1141 { |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1142 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
|
1143 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
|
1144 |
d57c6835225c
nginx-0.0.1-2003-09-26-09:45:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
133
diff
changeset
|
1145 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
|
1146 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
|
1147 |
2412
086c20fe2e97
set default gzip_buffers to 32 4k or 16 8k
Igor Sysoev <igor@sysoev.ru>
parents:
2410
diff
changeset
|
1148 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
|
1149 (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
|
1150 |
2542
925b5df2e0c2
fix postponed zlib memory allocation, introduced in r2411
Igor Sysoev <igor@sysoev.ru>
parents:
2536
diff
changeset
|
1151 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
|
1152 0); |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1153 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
|
1154 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
|
1155 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
|
1156 MAX_MEM_LEVEL - 1); |
577 | 1157 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
|
1158 |
3372
6b8e5c882e47
support "*" in gzip_types, ssi_types, etc
Igor Sysoev <igor@sysoev.ru>
parents:
3314
diff
changeset
|
1159 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
|
1160 &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
|
1161 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
|
1162 != NGX_OK) |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1163 { |
723df5089c05
use hash in gzip_types, ssi_types, and sub_filter_types
Igor Sysoev <igor@sysoev.ru>
parents:
2051
diff
changeset
|
1164 return NGX_CONF_ERROR; |
452 | 1165 } |
1166 | |
1167 return NGX_CONF_OK; | |
1168 } | |
1169 | |
1170 | |
681 | 1171 static ngx_int_t |
1172 ngx_http_gzip_filter_init(ngx_conf_t *cf) | |
1173 { | |
1174 ngx_http_next_header_filter = ngx_http_top_header_filter; | |
1175 ngx_http_top_header_filter = ngx_http_gzip_header_filter; | |
1176 | |
1177 ngx_http_next_body_filter = ngx_http_top_body_filter; | |
1178 ngx_http_top_body_filter = ngx_http_gzip_body_filter; | |
1179 | |
1180 return NGX_OK; | |
1181 } | |
1182 | |
1183 | |
497 | 1184 static char * |
527 | 1185 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
|
1186 { |
2290 | 1187 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
|
1188 |
2290 | 1189 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
|
1190 |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1191 wbits = 15; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1192 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1193 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
|
1194 |
158
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
1195 if (wsize == *np) { |
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
1196 *np = wbits; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1197 |
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1198 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
|
1199 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1200 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1201 wbits--; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1202 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1203 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1204 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
|
1205 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1206 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1207 |
497 | 1208 static char * |
527 | 1209 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
|
1210 { |
2290 | 1211 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
|
1212 |
2290 | 1213 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
|
1214 |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1215 memlevel = 9; |
156
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1216 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1217 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
|
1218 |
158
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
1219 if (hsize == *np) { |
d377ee423603
nginx-0.0.1-2003-10-24-10:53:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
157
diff
changeset
|
1220 *np = memlevel; |
430
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1221 |
1fa5daf7558e
nginx-0.0.11-2004-09-19-22:27:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
1222 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
|
1223 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1224 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1225 memlevel--; |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1226 } |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1227 |
afc333135a6b
nginx-0.0.1-2003-10-23-10:13:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
155
diff
changeset
|
1228 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
|
1229 } |