annotate src/http/modules/ngx_http_gunzip_filter_module.c @ 5204:a64c8a5da336

PCRE: retain input pattern for all regular expressions. Previously, input pattern was kept only for regular expressions with named captures, which resulted in error log entries without input pattern for PCRE errors that occured while processing regular expressions without them. Signed-off-by: Piotr Sikora <piotr@cloudflare.com>
author Piotr Sikora <piotr@cloudflare.com>
date Thu, 02 May 2013 03:26:36 -0700
parents 41bf14321133
children c52a761a2029
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2 /*
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4 * Copyright (C) Maxim Dounin
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 * Copyright (C) Nginx, Inc.
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6 */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 #include <ngx_config.h>
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 #include <ngx_core.h>
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11 #include <ngx_http.h>
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 #include <zlib.h>
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 typedef struct {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 ngx_flag_t enable;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18 ngx_bufs_t bufs;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 } ngx_http_gunzip_conf_t;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 typedef struct {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 ngx_chain_t *in;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24 ngx_chain_t *free;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 ngx_chain_t *busy;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 ngx_chain_t *out;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27 ngx_chain_t **last_out;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 ngx_buf_t *in_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 ngx_buf_t *out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31 ngx_int_t bufs;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 unsigned started:1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 unsigned flush:4;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 unsigned redo:1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 unsigned done:1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 unsigned nomem:1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 z_stream zstream;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 ngx_http_request_t *request;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 } ngx_http_gunzip_ctx_t;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 static ngx_int_t ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 ngx_http_gunzip_ctx_t *ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 static ngx_int_t ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 ngx_http_gunzip_ctx_t *ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 static ngx_int_t ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 ngx_http_gunzip_ctx_t *ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 static ngx_int_t ngx_http_gunzip_filter_inflate(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 ngx_http_gunzip_ctx_t *ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 static ngx_int_t ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 ngx_http_gunzip_ctx_t *ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 static void *ngx_http_gunzip_filter_alloc(void *opaque, u_int items,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 u_int size);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 static void ngx_http_gunzip_filter_free(void *opaque, void *address);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 static ngx_int_t ngx_http_gunzip_filter_init(ngx_conf_t *cf);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 static void *ngx_http_gunzip_create_conf(ngx_conf_t *cf);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 static char *ngx_http_gunzip_merge_conf(ngx_conf_t *cf,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 void *parent, void *child);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 static ngx_command_t ngx_http_gunzip_filter_commands[] = {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 { ngx_string("gunzip"),
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 ngx_conf_set_flag_slot,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 NGX_HTTP_LOC_CONF_OFFSET,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 offsetof(ngx_http_gunzip_conf_t, enable),
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 NULL },
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 { ngx_string("gunzip_buffers"),
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 ngx_conf_set_bufs_slot,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 NGX_HTTP_LOC_CONF_OFFSET,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 offsetof(ngx_http_gunzip_conf_t, bufs),
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 NULL },
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 ngx_null_command
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 };
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 static ngx_http_module_t ngx_http_gunzip_filter_module_ctx = {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 NULL, /* preconfiguration */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 ngx_http_gunzip_filter_init, /* postconfiguration */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 NULL, /* create main configuration */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 NULL, /* init main configuration */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 NULL, /* create server configuration */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 NULL, /* merge server configuration */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 ngx_http_gunzip_create_conf, /* create location configuration */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 ngx_http_gunzip_merge_conf /* merge location configuration */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 };
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 ngx_module_t ngx_http_gunzip_filter_module = {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 NGX_MODULE_V1,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 &ngx_http_gunzip_filter_module_ctx, /* module context */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 ngx_http_gunzip_filter_commands, /* module directives */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 NGX_HTTP_MODULE, /* module type */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 NULL, /* init master */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 NULL, /* init module */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 NULL, /* init process */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 NULL, /* init thread */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 NULL, /* exit thread */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 NULL, /* exit process */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 NULL, /* exit master */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 NGX_MODULE_V1_PADDING
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 };
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 ngx_http_gunzip_header_filter(ngx_http_request_t *r)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 ngx_http_gunzip_ctx_t *ctx;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 ngx_http_gunzip_conf_t *conf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 /* TODO support multiple content-codings */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 /* TODO always gunzip - due to configuration or module request */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 /* TODO ignore content encoding? */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132 if (!conf->enable
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 || r->headers_out.content_encoding == NULL
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 || r->headers_out.content_encoding->value.len != 4
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 || ngx_strncasecmp(r->headers_out.content_encoding->value.data,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136 (u_char *) "gzip", 4) != 0)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 return ngx_http_next_header_filter(r);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141 r->gzip_vary = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143 if (!r->gzip_tested) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144 if (ngx_http_gzip_ok(r) == NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145 return ngx_http_next_header_filter(r);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
147
4888
3abac956f6c8 Gunzip: fixed r->gzip_ok check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4838
diff changeset
148 } else if (r->gzip_ok) {
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 return ngx_http_next_header_filter(r);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gunzip_ctx_t));
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 if (ctx == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 ngx_http_set_ctx(r, ctx, ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159 ctx->request = r;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 r->filter_need_in_memory = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163 r->headers_out.content_encoding->hash = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164 r->headers_out.content_encoding = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 ngx_http_clear_content_length(r);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 ngx_http_clear_accept_ranges(r);
4939
41bf14321133 Gunzip: added missing ngx_http_clear_etag().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4888
diff changeset
168 ngx_http_clear_etag(r);
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 return ngx_http_next_header_filter(r);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 ngx_http_gunzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177 int rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 ngx_chain_t *cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 ngx_http_gunzip_ctx_t *ctx;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181 ctx = ngx_http_get_module_ctx(r, ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 if (ctx == NULL || ctx->done) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 return ngx_http_next_body_filter(r, in);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 "http gunzip filter");
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 if (!ctx->started) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 if (ngx_http_gunzip_filter_inflate_start(r, ctx) != NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 goto failed;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196 if (in) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 goto failed;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 if (ctx->nomem) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 /* flush busy buffers */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206 if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 goto failed;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 cl = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213 (ngx_buf_tag_t) &ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 ctx->nomem = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 for ( ;; ) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 /* cycle while we can write to a client */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 for ( ;; ) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 /* cycle while there is data to feed zlib and ... */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 rc = ngx_http_gunzip_filter_add_data(r, ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 if (rc == NGX_DECLINED) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228 break;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231 if (rc == NGX_AGAIN) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232 continue;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 /* ... there are buffers to write zlib output */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 rc = ngx_http_gunzip_filter_get_buf(r, ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 if (rc == NGX_DECLINED) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 break;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244 if (rc == NGX_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 goto failed;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 rc = ngx_http_gunzip_filter_inflate(r, ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 if (rc == NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251 break;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 if (rc == NGX_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 goto failed;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 /* rc == NGX_AGAIN */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 if (ctx->out == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262 return ctx->busy ? NGX_AGAIN : NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
265 rc = ngx_http_next_body_filter(r, ctx->out);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
266
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267 if (rc == NGX_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 goto failed;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
270
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 (ngx_buf_tag_t) &ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 ctx->last_out = &ctx->out;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 "gunzip out: %p", ctx->out);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 ctx->nomem = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 if (ctx->done) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281 return rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 /* unreachable */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 failed:
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289 ctx->done = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 int rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 ctx->zstream.next_in = Z_NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 ctx->zstream.avail_in = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 ctx->zstream.zalloc = ngx_http_gunzip_filter_alloc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 ctx->zstream.zfree = ngx_http_gunzip_filter_free;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306 ctx->zstream.opaque = ctx;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 /* windowBits +16 to decode gzip, zlib 1.2.0.4+ */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 rc = inflateInit2(&ctx->zstream, MAX_WBITS + 16);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 if (rc != Z_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 "inflateInit2() failed: %d", rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317 ctx->started = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319 ctx->last_out = &ctx->out;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 ctx->flush = Z_NO_FLUSH;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335 "gunzip in: %p", ctx->in);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337 if (ctx->in == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338 return NGX_DECLINED;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
339 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
340
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341 ctx->in_buf = ctx->in->buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 ctx->in = ctx->in->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 ctx->zstream.next_in = ctx->in_buf->pos;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348 "gunzip in_buf:%p ni:%p ai:%ud",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349 ctx->in_buf,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 ctx->zstream.next_in, ctx->zstream.avail_in);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352 if (ctx->in_buf->last_buf || ctx->in_buf->last_in_chain) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 ctx->flush = Z_FINISH;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355 } else if (ctx->in_buf->flush) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 ctx->flush = Z_SYNC_FLUSH;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
358 } else if (ctx->zstream.avail_in == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 /* ctx->flush == Z_NO_FLUSH */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
365
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368 ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 ngx_http_gunzip_conf_t *conf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 if (ctx->zstream.avail_out) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
377 conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379 if (ctx->free) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 ctx->out_buf = ctx->free->buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 ctx->free = ctx->free->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383 ctx->out_buf->flush = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385 } else if (ctx->bufs < conf->bufs.num) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 if (ctx->out_buf == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392 ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_gunzip_filter_module;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 ctx->out_buf->recycled = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 ctx->bufs++;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 } else {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397 ctx->nomem = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398 return NGX_DECLINED;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 ctx->zstream.next_out = ctx->out_buf->pos;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 ctx->zstream.avail_out = conf->bufs.size;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409 ngx_http_gunzip_filter_inflate(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
412 int rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 ngx_buf_t *b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414 ngx_chain_t *cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416 ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 "inflate in: ni:%p no:%p ai:%ud ao:%ud fl:%d redo:%d",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 ctx->zstream.next_in, ctx->zstream.next_out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
419 ctx->zstream.avail_in, ctx->zstream.avail_out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
420 ctx->flush, ctx->redo);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 rc = inflate(&ctx->zstream, ctx->flush);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424 if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426 "inflate() failed: %d, %d", ctx->flush, rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431 "inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 ctx->zstream.next_in, ctx->zstream.next_out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433 ctx->zstream.avail_in, ctx->zstream.avail_out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 "gunzip in_buf:%p pos:%p",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 ctx->in_buf, ctx->in_buf->pos);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440 if (ctx->zstream.next_in) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441 ctx->in_buf->pos = ctx->zstream.next_in;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
443 if (ctx->zstream.avail_in == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444 ctx->zstream.next_in = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448 ctx->out_buf->last = ctx->zstream.next_out;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 if (ctx->zstream.avail_out == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
451
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
452 /* zlib wants to output some more data */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
453
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
454 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
456 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
457 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
458
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459 cl->buf = ctx->out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462 ctx->last_out = &cl->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 ctx->redo = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469 ctx->redo = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 if (ctx->flush == Z_SYNC_FLUSH) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473 ctx->flush = Z_NO_FLUSH;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
474
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
475 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
477 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
478 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
479
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
480 b = ctx->out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 if (ngx_buf_size(b) == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 b = ngx_calloc_buf(ctx->request->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
485 if (b == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
486 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
487 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
489 } else {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490 ctx->zstream.avail_out = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
491 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
492
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493 b->flush = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
494
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
495 cl->buf = b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
496 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498 ctx->last_out = &cl->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
500 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
502
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503 if (rc == Z_STREAM_END && ctx->flush == Z_FINISH
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504 && ctx->zstream.avail_in == 0)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507 if (ngx_http_gunzip_filter_inflate_end(r, ctx) != NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
509 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
510
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
511 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
513
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
514 if (rc == Z_STREAM_END && ctx->zstream.avail_in > 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
515
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
516 rc = inflateReset(&ctx->zstream);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
517
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 if (rc != Z_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
519 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
520 "inflateReset() failed: %d", rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
521 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
522 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
523
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
524 ctx->redo = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
526 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
527 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
528
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529 if (ctx->in == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
530
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
531 b = ctx->out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
532
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
533 if (ngx_buf_size(b) == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
534 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
535 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
536
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
537 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
538 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
539 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
540 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
541
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
542 ctx->zstream.avail_out = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
543
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
544 cl->buf = b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
545 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
546 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
547 ctx->last_out = &cl->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
548
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
549 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
550 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
551
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
552 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
553 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
554
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
555
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
556 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
557 ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
558 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
559 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
560 int rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
561 ngx_buf_t *b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
562 ngx_chain_t *cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
563
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
564 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
565 "gunzip inflate end");
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
566
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
567 rc = inflateEnd(&ctx->zstream);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
568
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
569 if (rc != Z_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
570 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
571 "inflateEnd() failed: %d", rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
572 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
573 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
574
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
575 b = ctx->out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
576
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
577 if (ngx_buf_size(b) == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
578
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
579 b = ngx_calloc_buf(ctx->request->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
580 if (b == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
581 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
582 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
583 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
584
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
585 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
586 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
587 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
588 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
589
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
590 cl->buf = b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
591 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
592 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
593 ctx->last_out = &cl->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
594
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
595 b->last_buf = (r == r->main) ? 1 : 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
596 b->last_in_chain = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
597 b->sync = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
598
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
599 ctx->done = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
600
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
601 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
602 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
603
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
604
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
605 static void *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
606 ngx_http_gunzip_filter_alloc(void *opaque, u_int items, u_int size)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
607 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
608 ngx_http_gunzip_ctx_t *ctx = opaque;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
609
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
610 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
611 "gunzip alloc: n:%ud s:%ud",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
612 items, size);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
613
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
614 return ngx_palloc(ctx->request->pool, items * size);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
615 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
616
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
617
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
618 static void
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
619 ngx_http_gunzip_filter_free(void *opaque, void *address)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
620 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
621 #if 0
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
622 ngx_http_gunzip_ctx_t *ctx = opaque;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
623
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
624 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
625 "gunzip free: %p", address);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
626 #endif
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
627 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
628
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
629
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
630 static void *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
631 ngx_http_gunzip_create_conf(ngx_conf_t *cf)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
632 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
633 ngx_http_gunzip_conf_t *conf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
634
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
635 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gunzip_conf_t));
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
636 if (conf == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
637 return NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
638 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
639
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
640 /*
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
641 * set by ngx_pcalloc():
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
642 *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
643 * conf->bufs.num = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
644 */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
645
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
646 conf->enable = NGX_CONF_UNSET;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
647
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
648 return conf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
649 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
650
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
651
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
652 static char *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
653 ngx_http_gunzip_merge_conf(ngx_conf_t *cf, void *parent, void *child)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
654 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
655 ngx_http_gunzip_conf_t *prev = parent;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
656 ngx_http_gunzip_conf_t *conf = child;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
657
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
658 ngx_conf_merge_value(conf->enable, prev->enable, 0);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
659
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
660 ngx_conf_merge_bufs_value(conf->bufs, prev->bufs,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
661 (128 * 1024) / ngx_pagesize, ngx_pagesize);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
662
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
663 return NGX_CONF_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
664 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
665
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
666
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
667 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
668 ngx_http_gunzip_filter_init(ngx_conf_t *cf)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
669 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
670 ngx_http_next_header_filter = ngx_http_top_header_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
671 ngx_http_top_header_filter = ngx_http_gunzip_header_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
672
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
673 ngx_http_next_body_filter = ngx_http_top_body_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
674 ngx_http_top_body_filter = ngx_http_gunzip_body_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
675
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
676 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
677 }