annotate ngx_http_gunzip_filter_module.c @ 5:d8e85fd12fab

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