annotate src/http/modules/ngx_http_gunzip_filter_module.c @ 7732:59e1c73fe02b

SSL: ssl_reject_handshake directive (ticket #195). In some cases it might be needed to reject SSL handshake based on SNI server name provided, for example, to make sure an invalid certificate is not returned to clients trying to contact a name-based virtual server without SSL configured. Previously, a "ssl_ciphers aNULL;" was used for this. This workaround, however, is not compatible with TLSv1.3, in particular, when using BoringSSL, where it is not possible to configure TLSv1.3 ciphers at all. With this change, the ssl_reject_handshake directive is introduced, which instructs nginx to reject SSL handshakes with an "unrecognized_name" alert in a particular server block. For example, to reject handshake with names other than example.com, one can use the following configuration: server { listen 443 ssl; ssl_reject_handshake on; } server { listen 443 ssl; server_name example.com; ssl_certificate example.com.crt; ssl_certificate_key example.com.key; } The following configuration can be used to reject all SSL handshakes without SNI server name provided: server { listen 443 ssl; ssl_reject_handshake on; } server { listen 443 ssl; server_name ~^; ssl_certificate example.crt; ssl_certificate_key example.key; } Additionally, the ssl_reject_handshake directive makes configuring certificates for the default server block optional. If no certificates are configured in the default server for a given listening socket, certificates must be defined in all non-default server blocks with the listening socket in question.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 22 Oct 2020 18:02:28 +0300
parents 973fded4f461
children
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);
5733
e491b26fa5a1 Entity tags: downgrade strong etags to weak ones as needed.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5436
diff changeset
168 ngx_http_weak_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;
5876
973fded4f461 Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5733
diff changeset
178 ngx_uint_t flush;
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 ngx_chain_t *cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 ngx_http_gunzip_ctx_t *ctx;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 ctx = ngx_http_get_module_ctx(r, ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 if (ctx == NULL || ctx->done) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 return ngx_http_next_body_filter(r, in);
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 "http gunzip filter");
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 if (!ctx->started) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 if (ngx_http_gunzip_filter_inflate_start(r, ctx) != NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 goto failed;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 if (in) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 goto failed;
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
5876
973fded4f461 Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5733
diff changeset
203 if (ctx->nomem) {
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205 /* flush busy buffers */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 goto failed;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 cl = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 (ngx_buf_tag_t) &ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215 ctx->nomem = 0;
5876
973fded4f461 Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5733
diff changeset
216 flush = 0;
973fded4f461 Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5733
diff changeset
217
973fded4f461 Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5733
diff changeset
218 } else {
973fded4f461 Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5733
diff changeset
219 flush = ctx->busy ? 1 : 0;
4837
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 for ( ;; ) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 /* cycle while we can write to a client */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 for ( ;; ) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228 /* cycle while there is data to feed zlib and ... */
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 rc = ngx_http_gunzip_filter_add_data(r, ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232 if (rc == NGX_DECLINED) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 break;
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 if (rc == NGX_AGAIN) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237 continue;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 }
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 /* ... there are buffers to write zlib output */
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 rc = ngx_http_gunzip_filter_get_buf(r, ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 if (rc == NGX_DECLINED) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246 break;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249 if (rc == NGX_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 goto failed;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251 }
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 rc = ngx_http_gunzip_filter_inflate(r, ctx);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 if (rc == NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256 break;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259 if (rc == NGX_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 goto failed;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263 /* rc == NGX_AGAIN */
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
5876
973fded4f461 Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5733
diff changeset
266 if (ctx->out == NULL && !flush) {
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267 return ctx->busy ? NGX_AGAIN : NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 }
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 rc = ngx_http_next_body_filter(r, ctx->out);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 if (rc == NGX_ERROR) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 goto failed;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277 (ngx_buf_tag_t) &ngx_http_gunzip_filter_module);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 ctx->last_out = &ctx->out;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281 "gunzip out: %p", ctx->out);
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 ctx->nomem = 0;
5876
973fded4f461 Gzip, gunzip: flush busy buffers if any.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5733
diff changeset
284 flush = 0;
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286 if (ctx->done) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 return rc;
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 }
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 /* unreachable */
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 failed:
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 ctx->done = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 return NGX_ERROR;
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
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 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 int rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307 ctx->zstream.next_in = Z_NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 ctx->zstream.avail_in = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310 ctx->zstream.zalloc = ngx_http_gunzip_filter_alloc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 ctx->zstream.zfree = ngx_http_gunzip_filter_free;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 ctx->zstream.opaque = ctx;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 /* windowBits +16 to decode gzip, zlib 1.2.0.4+ */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 rc = inflateInit2(&ctx->zstream, MAX_WBITS + 16);
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 if (rc != Z_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319 "inflateInit2() failed: %d", rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 return NGX_ERROR;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323 ctx->started = 1;
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 ctx->last_out = &ctx->out;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326 ctx->flush = Z_NO_FLUSH;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328 return NGX_OK;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333 ngx_http_gunzip_filter_add_data(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336 if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338 }
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341 "gunzip in: %p", ctx->in);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 if (ctx->in == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 return NGX_DECLINED;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 }
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 ctx->in_buf = ctx->in->buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348 ctx->in = ctx->in->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 ctx->zstream.next_in = ctx->in_buf->pos;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351 ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354 "gunzip in_buf:%p ni:%p ai:%ud",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355 ctx->in_buf,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 ctx->zstream.next_in, ctx->zstream.avail_in);
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 if (ctx->in_buf->last_buf || ctx->in_buf->last_in_chain) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 ctx->flush = Z_FINISH;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361 } else if (ctx->in_buf->flush) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362 ctx->flush = Z_SYNC_FLUSH;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 } else if (ctx->zstream.avail_in == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
365 /* ctx->flush == Z_NO_FLUSH */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 return NGX_OK;
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
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 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 ngx_http_gunzip_ctx_t *ctx)
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 ngx_http_gunzip_conf_t *conf;
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->zstream.avail_out) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 }
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 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
384
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385 if (ctx->free) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386 ctx->out_buf = ctx->free->buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 ctx->free = ctx->free->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389 ctx->out_buf->flush = 0;
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 } else if (ctx->bufs < conf->bufs.num) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 if (ctx->out_buf == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398 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
399 ctx->out_buf->recycled = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400 ctx->bufs++;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 } else {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403 ctx->nomem = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404 return NGX_DECLINED;
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 ctx->zstream.next_out = ctx->out_buf->pos;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 ctx->zstream.avail_out = conf->bufs.size;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410 return NGX_OK;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415 ngx_http_gunzip_filter_inflate(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 int rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
419 ngx_buf_t *b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
420 ngx_chain_t *cl;
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 ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423 "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
424 ctx->zstream.next_in, ctx->zstream.next_out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 ctx->zstream.avail_in, ctx->zstream.avail_out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426 ctx->flush, ctx->redo);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 rc = inflate(&ctx->zstream, ctx->flush);
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 if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
5435
2bb2571d6e34 Gunzip: "error" logging level on inflate() errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5432
diff changeset
431 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 "inflate() failed: %d, %d", ctx->flush, rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 }
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_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 "inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 ctx->zstream.next_in, ctx->zstream.next_out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439 ctx->zstream.avail_in, ctx->zstream.avail_out,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440 rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
443 "gunzip in_buf:%p pos:%p",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444 ctx->in_buf, ctx->in_buf->pos);
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 if (ctx->zstream.next_in) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447 ctx->in_buf->pos = ctx->zstream.next_in;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 if (ctx->zstream.avail_in == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 ctx->zstream.next_in = NULL;
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 }
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 ctx->out_buf->last = ctx->zstream.next_out;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
456 if (ctx->zstream.avail_out == 0) {
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 /* zlib wants to output some more data */
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462 return NGX_ERROR;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465 cl->buf = ctx->out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468 ctx->last_out = &cl->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470 ctx->redo = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473 }
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 ctx->redo = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
477 if (ctx->flush == Z_SYNC_FLUSH) {
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 ctx->flush = Z_NO_FLUSH;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
480
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
485
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
486 b = ctx->out_buf;
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 if (ngx_buf_size(b) == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
489
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490 b = ngx_calloc_buf(ctx->request->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
491 if (b == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
492 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493 }
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 } else {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
496 ctx->zstream.avail_out = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499 b->flush = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
500
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501 cl->buf = b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
502 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504 ctx->last_out = &cl->next;
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 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508
5436
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
509 if (ctx->flush == Z_FINISH && ctx->zstream.avail_in == 0) {
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
510
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
511 if (rc != Z_STREAM_END) {
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
512 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
513 "inflate() returned %d on response end", rc);
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
514 return NGX_ERROR;
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
515 }
4837
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
516
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
517 if (ngx_http_gunzip_filter_inflate_end(r, ctx) != NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
519 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
520
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
521 return NGX_OK;
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 if (rc == Z_STREAM_END && ctx->zstream.avail_in > 0) {
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 rc = inflateReset(&ctx->zstream);
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 if (rc != Z_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
530 "inflateReset() failed: %d", rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
531 return NGX_ERROR;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
534 ctx->redo = 1;
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 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
537 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
538
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
539 if (ctx->in == NULL) {
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 b = ctx->out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
542
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
543 if (ngx_buf_size(b) == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
544 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
545 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
546
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
547 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
548 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
549 return NGX_ERROR;
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 ctx->zstream.avail_out = 0;
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 cl->buf = b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
555 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
556 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
557 ctx->last_out = &cl->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
558
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
559 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
560 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
561
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
562 return NGX_AGAIN;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
565
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
566 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
567 ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
568 ngx_http_gunzip_ctx_t *ctx)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
569 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
570 int rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
571 ngx_buf_t *b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
572 ngx_chain_t *cl;
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
575 "gunzip inflate end");
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 rc = inflateEnd(&ctx->zstream);
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 if (rc != Z_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
580 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
581 "inflateEnd() failed: %d", rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
582 return NGX_ERROR;
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 b = ctx->out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
586
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
587 if (ngx_buf_size(b) == 0) {
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 b = ngx_calloc_buf(ctx->request->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
590 if (b == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
591 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
592 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
593 }
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 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
596 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
597 return NGX_ERROR;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
600 cl->buf = b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
601 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
602 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
603 ctx->last_out = &cl->next;
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 b->last_buf = (r == r->main) ? 1 : 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
606 b->last_in_chain = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
607 b->sync = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
608
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
609 ctx->done = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
610
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
611 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
612 }
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
615 static void *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
616 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
617 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
618 ngx_http_gunzip_ctx_t *ctx = opaque;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
619
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
620 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
621 "gunzip alloc: n:%ud s:%ud",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
622 items, size);
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 return ngx_palloc(ctx->request->pool, items * size);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
625 }
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
626
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 static void
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
629 ngx_http_gunzip_filter_free(void *opaque, void *address)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
630 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
631 #if 0
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
632 ngx_http_gunzip_ctx_t *ctx = opaque;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
633
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
634 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
635 "gunzip free: %p", address);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
636 #endif
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
637 }
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 static void *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
641 ngx_http_gunzip_create_conf(ngx_conf_t *cf)
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 ngx_http_gunzip_conf_t *conf;
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 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gunzip_conf_t));
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
646 if (conf == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
647 return NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
648 }
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 * set by ngx_pcalloc():
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
652 *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
653 * conf->bufs.num = 0;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
656 conf->enable = NGX_CONF_UNSET;
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 return conf;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
661
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
662 static char *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
663 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
664 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
665 ngx_http_gunzip_conf_t *prev = parent;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
666 ngx_http_gunzip_conf_t *conf = child;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
667
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
668 ngx_conf_merge_value(conf->enable, prev->enable, 0);
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_conf_merge_bufs_value(conf->bufs, prev->bufs,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
671 (128 * 1024) / ngx_pagesize, ngx_pagesize);
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 return NGX_CONF_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
674 }
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
677 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
678 ngx_http_gunzip_filter_init(ngx_conf_t *cf)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
679 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
680 ngx_http_next_header_filter = ngx_http_top_header_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
681 ngx_http_top_header_filter = ngx_http_gunzip_header_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
682
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
683 ngx_http_next_body_filter = ngx_http_top_body_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
684 ngx_http_top_body_filter = ngx_http_gunzip_body_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
685
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
686 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
687 }