annotate src/http/modules/ngx_http_gunzip_filter_module.c @ 5503:d049b0ea00a3

SSL: ssl_session_tickets directive. This adds support so it's possible to explicitly disable SSL Session Tickets. In order to have good Forward Secrecy support either the session ticket key has to be reloaded by using nginx' binary upgrade process or using an external key file and reloading the configuration. This directive adds another possibility to have good support by disabling session tickets altogether. If session tickets are enabled and the process lives for a long a time, an attacker can grab the session ticket from the process and use that to decrypt any traffic that occured during the entire lifetime of the process.
author Dirkjan Bussink <d.bussink@gmail.com>
date Fri, 10 Jan 2014 16:12:40 +0100
parents 6aa75f4982ce
children e491b26fa5a1
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
5432
c52a761a2029 Gzip, gunzip: flush pending data when incoming chain is NULL.
Yichun Zhang <agentzh@gmail.com>
parents: 4939
diff changeset
202 if (ctx->nomem || in == NULL) {
4837
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) {
5435
2bb2571d6e34 Gunzip: "error" logging level on inflate() errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5432
diff changeset
425 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
4837
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
5436
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
503 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
504
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
505 if (rc != Z_STREAM_END) {
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
506 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
507 "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
508 return NGX_ERROR;
6aa75f4982ce Gunzip: proper error handling on gunzipping an empty response.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5435
diff changeset
509 }
4837
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 if (ngx_http_gunzip_filter_inflate_end(r, ctx) != NGX_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512 return NGX_ERROR;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
515 return NGX_OK;
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 if (rc == Z_STREAM_END && ctx->zstream.avail_in > 0) {
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 rc = inflateReset(&ctx->zstream);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
521
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
522 if (rc != Z_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
523 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
524 "inflateReset() failed: %d", rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
526 }
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 ctx->redo = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
530 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
531 }
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 (ctx->in == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
534
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
535 b = ctx->out_buf;
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 if (ngx_buf_size(b) == 0) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
538 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
539 }
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 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
542 if (cl == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
543 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
544 }
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 ctx->zstream.avail_out = 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
547
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
548 cl->buf = b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
549 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
550 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
551 ctx->last_out = &cl->next;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
552
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
553 return NGX_OK;
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 return NGX_AGAIN;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
557 }
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
560 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
561 ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
562 ngx_http_gunzip_ctx_t *ctx)
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 int rc;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
565 ngx_buf_t *b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
566 ngx_chain_t *cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
567
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
568 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
569 "gunzip inflate end");
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
570
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
571 rc = inflateEnd(&ctx->zstream);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
572
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
573 if (rc != Z_OK) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
574 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
575 "inflateEnd() failed: %d", rc);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
576 return NGX_ERROR;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
577 }
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 = ctx->out_buf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
580
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
581 if (ngx_buf_size(b) == 0) {
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 b = ngx_calloc_buf(ctx->request->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
584 if (b == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
585 return NGX_ERROR;
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 }
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 cl = ngx_alloc_chain_link(r->pool);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
590 if (cl == 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 cl->buf = b;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
595 cl->next = NULL;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
596 *ctx->last_out = cl;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
597 ctx->last_out = &cl->next;
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 b->last_buf = (r == r->main) ? 1 : 0;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
600 b->last_in_chain = 1;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
601 b->sync = 1;
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 ctx->done = 1;
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 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
606 }
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
609 static void *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
610 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
611 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
612 ngx_http_gunzip_ctx_t *ctx = opaque;
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
615 "gunzip alloc: n:%ud s:%ud",
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
616 items, 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 return ngx_palloc(ctx->request->pool, items * size);
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
621
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
622 static void
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
623 ngx_http_gunzip_filter_free(void *opaque, void *address)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
624 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
625 #if 0
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
626 ngx_http_gunzip_ctx_t *ctx = opaque;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
629 "gunzip free: %p", address);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
630 #endif
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
631 }
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
634 static void *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
635 ngx_http_gunzip_create_conf(ngx_conf_t *cf)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
636 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
637 ngx_http_gunzip_conf_t *conf;
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 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gunzip_conf_t));
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
640 if (conf == NULL) {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
641 return NULL;
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
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 * set by ngx_pcalloc():
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
646 *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
647 * conf->bufs.num = 0;
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 conf->enable = NGX_CONF_UNSET;
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 return conf;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
653 }
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 static char *
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
657 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
658 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
659 ngx_http_gunzip_conf_t *prev = parent;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
660 ngx_http_gunzip_conf_t *conf = child;
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 ngx_conf_merge_value(conf->enable, prev->enable, 0);
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
663
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
664 ngx_conf_merge_bufs_value(conf->bufs, prev->bufs,
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
665 (128 * 1024) / ngx_pagesize, ngx_pagesize);
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 return NGX_CONF_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
668 }
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
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
671 static ngx_int_t
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
672 ngx_http_gunzip_filter_init(ngx_conf_t *cf)
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
673 {
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
674 ngx_http_next_header_filter = ngx_http_top_header_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
675 ngx_http_top_header_filter = ngx_http_gunzip_header_filter;
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 ngx_http_next_body_filter = ngx_http_top_body_filter;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
678 ngx_http_top_body_filter = ngx_http_gunzip_body_filter;
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 return NGX_OK;
f9ae534ebf4b Gunzip filter import.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
681 }