annotate src/http/modules/ngx_http_range_filter_module.c @ 391:1d9bef53cd8e

Range filter: late_ranges functionality. Add one more filtering point after postpone filter. This allows to serve range capable replies with subrequests. It's not as efficient as range filtering for static data (i.e. doesn't save us from reading data from disk if some filter needs them in memory), but it may save some network bandwidth for us and for our users.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 21 Jul 2008 05:33:01 +0400
parents a5f67d82aea3
children 77df96611112
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12 /*
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 * the single part format:
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 * "HTTP/1.0 206 Partial Content" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 * ... header ...
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 * "Content-Type: image/jpeg" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 * "Content-Length: SIZE" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 * "Content-Range: bytes START-END/SIZE" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 * CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 * ... data ...
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 * the mutlipart format:
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 * "HTTP/1.0 206 Partial Content" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 * ... header ...
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 * "Content-Type: multipart/byteranges; boundary=0123456789" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 * CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 * CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 * "--0123456789" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 * "Content-Type: image/jpeg" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 * "Content-Range: bytes START0-END0/SIZE" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 * CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 * ... data ...
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 * CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 * "--0123456789" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 * "Content-Type: image/jpeg" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 * "Content-Range: bytes START1-END1/SIZE" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 * CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 * ... data ...
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 * CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 * "--0123456789--" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 typedef struct {
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
48 off_t start;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
49 off_t end;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
50 ngx_str_t content_range;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
51 } ngx_http_range_t;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
52
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
53
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
54 typedef struct {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
55 off_t offset;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
56 ngx_str_t boundary_header;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
57 ngx_array_t ranges;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 } ngx_http_range_filter_ctx_t;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
61 static ngx_int_t ngx_http_range_header_filter_init(ngx_conf_t *cf);
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
62 static ngx_int_t ngx_http_range_body_filter_init(ngx_conf_t *cf);
391
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
63 static ngx_int_t ngx_http_range_late_filter_init(ngx_conf_t *cf);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66 static ngx_http_module_t ngx_http_range_header_filter_module_ctx = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
67 NULL, /* preconfiguration */
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
68 ngx_http_range_header_filter_init, /* postconfiguration */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 NULL, /* create main configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 NULL, /* init main configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 NULL, /* create server configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 NULL, /* merge server configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 NULL, /* create location configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 NULL, /* merge location configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 };
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 ngx_module_t ngx_http_range_header_filter_module = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
82 NGX_MODULE_V1,
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 &ngx_http_range_header_filter_module_ctx, /* module context */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 NULL, /* module directives */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 NGX_HTTP_MODULE, /* module type */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
86 NULL, /* init master */
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
87 NULL, /* init module */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
88 NULL, /* init process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
89 NULL, /* init thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
90 NULL, /* exit thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
91 NULL, /* exit process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
92 NULL, /* exit master */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
93 NGX_MODULE_V1_PADDING
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 };
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 static ngx_http_module_t ngx_http_range_body_filter_module_ctx = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
98 NULL, /* preconfiguration */
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
99 ngx_http_range_body_filter_init, /* postconfiguration */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 NULL, /* create main configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 NULL, /* init main configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 NULL, /* create server configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 NULL, /* merge server configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 NULL, /* create location configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 NULL, /* merge location configuration */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 };
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 ngx_module_t ngx_http_range_body_filter_module = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
113 NGX_MODULE_V1,
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 &ngx_http_range_body_filter_module_ctx, /* module context */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 NULL, /* module directives */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 NGX_HTTP_MODULE, /* module type */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
117 NULL, /* init master */
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
118 NULL, /* init module */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
119 NULL, /* init process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
120 NULL, /* init thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
121 NULL, /* exit thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
122 NULL, /* exit process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
123 NULL, /* exit master */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
124 NGX_MODULE_V1_PADDING
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 };
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127
391
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
128 static ngx_http_module_t ngx_http_range_late_filter_module_ctx = {
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
129 NULL, /* preconfiguration */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
130 ngx_http_range_late_filter_init, /* postconfiguration */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
131
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
132 NULL, /* create main configuration */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
133 NULL, /* init main configuration */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
134
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
135 NULL, /* create server configuration */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
136 NULL, /* merge server configuration */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
137
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
138 NULL, /* create location configuration */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
139 NULL, /* merge location configuration */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
140 };
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
141
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
142
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
143 ngx_module_t ngx_http_range_late_filter_module = {
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
144 NGX_MODULE_V1,
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
145 &ngx_http_range_late_filter_module_ctx, /* module context */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
146 NULL, /* module directives */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
147 NGX_HTTP_MODULE, /* module type */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
148 NULL, /* init master */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
149 NULL, /* init module */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
150 NULL, /* init process */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
151 NULL, /* init thread */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
152 NULL, /* exit thread */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
153 NULL, /* exit process */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
154 NULL, /* exit master */
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
155 NGX_MODULE_V1_PADDING
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
156 };
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
157
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
158
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
391
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
160 static ngx_http_output_body_filter_pt ngx_http_next_body_early_filter;
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
161 static ngx_http_output_body_filter_pt ngx_http_next_body_late_filter;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 static ngx_int_t
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165 ngx_http_range_header_filter(ngx_http_request_t *r)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 u_char *p;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 size_t len;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 off_t start, end;
346
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
170 time_t if_range;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 ngx_int_t rc;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 ngx_uint_t suffix, i;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 ngx_atomic_uint_t boundary;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 ngx_table_elt_t *content_range;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 ngx_http_range_t *range;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 ngx_http_range_filter_ctx_t *ctx;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 if (r->http_version < NGX_HTTP_VERSION_10
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 || r->headers_out.status != NGX_HTTP_OK
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
180 || r != r->main
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 || r->headers_out.content_length_n == -1
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
182 || !r->allow_ranges)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187 if (r->headers_in.range == NULL
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 || r->headers_in.range->value.len < 7
286
5bef04fc3fd5 nginx 0.5.13
Igor Sysoev <http://sysoev.ru>
parents: 282
diff changeset
189 || ngx_strncasecmp(r->headers_in.range->value.data,
5bef04fc3fd5 nginx 0.5.13
Igor Sysoev <http://sysoev.ru>
parents: 282
diff changeset
190 (u_char *) "bytes=", 6)
5bef04fc3fd5 nginx 0.5.13
Igor Sysoev <http://sysoev.ru>
parents: 282
diff changeset
191 != 0)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 {
346
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
193 goto next_filter;
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
194 }
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
195
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
196 if (r->headers_in.if_range && r->headers_out.last_modified_time != -1) {
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
197
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
198 if_range = ngx_http_parse_time(r->headers_in.if_range->value.data,
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
199 r->headers_in.if_range->value.len);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200
346
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
201 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
202 "http ir:%d lm:%d",
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
203 if_range, r->headers_out.last_modified_time);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204
346
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
205 if (if_range != r->headers_out.last_modified_time) {
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
206 goto next_filter;
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
207 }
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
210 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t));
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
211 if (ctx == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
212 return NGX_ERROR;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
213 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
214
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
215 if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_range_t))
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
216 == NGX_ERROR)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221 rc = 0;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 range = NULL;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 p = r->headers_in.range->value.data + 6;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225 for ( ;; ) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 start = 0;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 end = 0;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 suffix = 0;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230 while (*p == ' ') { p++; }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 if (*p != '-') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 if (*p < '0' || *p > '9') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 while (*p >= '0' && *p <= '9') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239 start = start * 10 + *p++ - '0';
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 while (*p == ' ') { p++; }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 if (*p++ != '-') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 if (start >= r->headers_out.content_length_n) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 while (*p == ' ') { p++; }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 if (*p == ',' || *p == '\0') {
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
257 range = ngx_array_push(&ctx->ranges);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 if (range == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 range->start = start;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 range->end = r->headers_out.content_length_n;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 if (*p++ != ',') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 continue;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272 } else {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273 suffix = 1;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274 p++;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277 if (*p < '0' || *p > '9') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
278 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282 while (*p >= '0' && *p <= '9') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283 end = end * 10 + *p++ - '0';
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 while (*p == ' ') { p++; }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288 if (*p != ',' && *p != '\0') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 if (suffix) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 start = r->headers_out.content_length_n - end;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295 end = r->headers_out.content_length_n - 1;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298 if (start > end) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 rc = NGX_HTTP_RANGE_NOT_SATISFIABLE;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
303 range = ngx_array_push(&ctx->ranges);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304 if (range == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308 range->start = start;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 if (end >= r->headers_out.content_length_n) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311 /*
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312 * Download Accelerator sends the last byte position
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313 * that equals to the file length
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315 range->end = r->headers_out.content_length_n;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317 } else {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318 range->end = end + 1;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 if (*p++ != ',') {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 break;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326 if (rc) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328 /* rc == NGX_HTTP_RANGE_NOT_SATISFIABLE */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 r->headers_out.status = rc;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 content_range = ngx_list_push(&r->headers_out.headers);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 if (content_range == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337 r->headers_out.content_range = content_range;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
339 content_range->hash = 1;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 content_range->key.len = sizeof("Content-Range") - 1;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341 content_range->key.data = (u_char *) "Content-Range";
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
343 content_range->value.data = ngx_pnalloc(r->pool,
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344 sizeof("bytes */") - 1 + NGX_OFF_T_LEN);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345 if (content_range->value.data == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349 content_range->value.len = ngx_sprintf(content_range->value.data,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 "bytes */%O",
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351 r->headers_out.content_length_n)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352 - content_range->value.data;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 102
diff changeset
354 ngx_http_clear_content_length(r);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 return rc;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
359 ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
360
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
361 r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
363 if (ctx->ranges.nelts == 1) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365 content_range = ngx_list_push(&r->headers_out.headers);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 if (content_range == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370 r->headers_out.content_range = content_range;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
372 content_range->hash = 1;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 content_range->key.len = sizeof("Content-Range") - 1;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 content_range->key.data = (u_char *) "Content-Range";
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 content_range->value.data =
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
377 ngx_pnalloc(r->pool, sizeof("bytes -/") - 1 + 3 * NGX_OFF_T_LEN);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378 if (content_range->value.data == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 /* "Content-Range: bytes SSSS-EEEE/TTTT" header */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 content_range->value.len = ngx_sprintf(content_range->value.data,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385 "bytes %O-%O/%O",
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386 range->start, range->end - 1,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387 r->headers_out.content_length_n)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388 - content_range->value.data;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390 r->headers_out.content_length_n = range->end - range->start;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
391
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
392 if (r->headers_out.content_length) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
393 r->headers_out.content_length->hash = 0;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
394 r->headers_out.content_length = NULL;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
395 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
396
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 return ngx_http_next_header_filter(r);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401 /* TODO: what if no content_type ?? */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403 len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404 + sizeof(CRLF "Content-Type: ") - 1
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
405 + r->headers_out.content_type.len
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406 + sizeof(CRLF "Content-Range: bytes ") - 1;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408 if (r->headers_out.charset.len) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409 len += sizeof("; charset=") - 1 + r->headers_out.charset.len;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
412 ctx->boundary_header.data = ngx_pnalloc(r->pool, len);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413 if (ctx->boundary_header.data == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 boundary = ngx_next_temp_number(0);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
418
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419 /*
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
420 * The boundary header of the range:
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421 * CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422 * "--0123456789" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 * "Content-Type: image/jpeg" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424 * "Content-Range: bytes "
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425 */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
427 if (r->headers_out.charset.len) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428 ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
429 CRLF "--%0muA" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
430 "Content-Type: %V; charset=%V" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431 "Content-Range: bytes ",
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
432 boundary,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
433 &r->headers_out.content_type,
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
434 &r->headers_out.charset)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435 - ctx->boundary_header.data;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
437 r->headers_out.charset.len = 0;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439 } else {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440 ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441 CRLF "--%0muA" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442 "Content-Type: %V" CRLF
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443 "Content-Range: bytes ",
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444 boundary,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
445 &r->headers_out.content_type)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446 - ctx->boundary_header.data;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
447 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
449 r->headers_out.content_type.data =
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
450 ngx_pnalloc(r->pool,
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
451 sizeof("Content-Type: multipart/byteranges; boundary=") - 1
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
452 + NGX_ATOMIC_T_LEN);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
454 if (r->headers_out.content_type.data == NULL) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 /* "Content-Type: multipart/byteranges; boundary=0123456789" */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
459
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
460 r->headers_out.content_type.len =
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
461 ngx_sprintf(r->headers_out.content_type.data,
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 "multipart/byteranges; boundary=%0muA",
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 boundary)
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
464 - r->headers_out.content_type.data;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
465
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 /* the size of the last boundary CRLF "--0123456789--" CRLF */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN + sizeof("--" CRLF) - 1;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
471 range = ctx->ranges.elts;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
472 for (i = 0; i < ctx->ranges.nelts; i++) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
474 /* the size of the range: "SSSS-EEEE/TTTT" CRLF CRLF */
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476 range[i].content_range.data =
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
477 ngx_pnalloc(r->pool, 3 * NGX_OFF_T_LEN + 2 + 4);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
478
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
479 if (range[i].content_range.data == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
481 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
483 range[i].content_range.len = ngx_sprintf(range[i].content_range.data,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
484 "%O-%O/%O" CRLF CRLF,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
485 range[i].start, range[i].end - 1,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486 r->headers_out.content_length_n)
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487 - range[i].content_range.data;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489 len += ctx->boundary_header.len + range[i].content_range.len
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490 + (size_t) (range[i].end - range[i].start);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 r->headers_out.content_length_n = len;
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
494
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
495 if (r->headers_out.content_length) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
496 r->headers_out.content_length->hash = 0;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
497 r->headers_out.content_length = NULL;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
498 }
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
499
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
500 return ngx_http_next_header_filter(r);
346
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
501
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
502 next_filter:
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
503
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
504 r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers);
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
505 if (r->headers_out.accept_ranges == NULL) {
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
506 return NGX_ERROR;
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
507 }
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
508
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
509 r->headers_out.accept_ranges->hash = 1;
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
510 r->headers_out.accept_ranges->key.len = sizeof("Accept-Ranges") - 1;
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
511 r->headers_out.accept_ranges->key.data = (u_char *) "Accept-Ranges";
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
512 r->headers_out.accept_ranges->value.len = sizeof("bytes") - 1;
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
513 r->headers_out.accept_ranges->value.data = (u_char *) "bytes";
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
514
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 300
diff changeset
515 return ngx_http_next_header_filter(r);
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
519 static ngx_int_t
391
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
520 ngx_http_range_body_generic_filter(ngx_http_request_t *r, ngx_chain_t *in,
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
521 ngx_http_output_body_filter_pt ngx_http_next_body_filter)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
522 {
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
523 off_t start, last;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
524 ngx_buf_t *b, *buf;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
525 ngx_uint_t i;
390
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
526 ngx_chain_t *out, *cl, *hcl, *rcl, *dcl, **ll;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
527 ngx_http_range_t *range;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
528 ngx_http_range_filter_ctx_t *ctx;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
529
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
530 if (in == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
531 return ngx_http_next_body_filter(r, in);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
532 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
533
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
534 ctx = ngx_http_get_module_ctx(r, ngx_http_range_body_filter_module);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
535
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
536 if (ctx == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
537 return ngx_http_next_body_filter(r, in);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
538 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
539
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
540 buf = in->buf;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
541
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
542 if (ngx_buf_special(in->buf)) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
543 return ngx_http_next_body_filter(r, in);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545
390
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
546 range = ctx->ranges.elts;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
547
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
548 if (ctx->ranges.nelts > 1) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
549 goto multipart;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
550 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
551
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
552 /*
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
553 * the optimized version for the responses
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
554 * that are passed in the single buffer
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
555 */
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
556
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
557 out = NULL;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
558 ll = &out;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
559
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
560 for (cl = in; cl; cl = cl->next) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
561
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
562 buf = cl->buf;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
563
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
564 start = ctx->offset;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
565 last = ctx->offset + ngx_buf_size(buf);
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
566
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
567 ctx->offset = last;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
568
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
569 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
570 "range body filter: %O-%O", start, last);
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
571
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
572 if (ngx_buf_special(buf)) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
573 /* pass anyway */
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
574 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
575 "range body filter: pass special");
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
576 *ll = cl;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
577 ll = &cl->next;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
578 continue;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
579 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
580
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
581 if (range->end <= start || range->start >= last) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
582 /* skip buffer */
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
583 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
584 "range body filter: skip");
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
585 buf->pos = buf->last;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
586 continue;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
587 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
588
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
589 if (range->start > start) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
590 if (buf->in_file) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
591 buf->file_pos += range->start - start;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
592 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
593 if (ngx_buf_in_memory(buf)) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
594 buf->pos += (size_t) (range->start - start);
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
595 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
596 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
597
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
598 if (range->end <= last) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
599 if (buf->in_file) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
600 buf->file_last -= last - range->end;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
601 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
602 if (ngx_buf_in_memory(buf)) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
603 buf->last -= (size_t) (last - range->end);
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
604 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
605
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
606 /* we are done */
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
607
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
608 buf->last_buf = 1;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
609 *ll = cl;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
610 cl->next = NULL;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
611
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
612 break;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
613 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
614
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
615 *ll = cl;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
616 ll = &cl->next;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
617 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
618
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
619 if (out == NULL) {
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
620 return NGX_OK;
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
621 }
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
622
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
623 return ngx_http_next_body_filter(r, out);
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
624
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
625 multipart:
a5f67d82aea3 Range filter: support for multiple buffers (single range only).
Maxim Dounin <mdounin@mdounin.ru>
parents: 382
diff changeset
626
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
627 if (ctx->offset) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
628 goto overlapped;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
629 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
630
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
631 if (!buf->last_buf) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
632
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
633 if (buf->in_file) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
634 start = buf->file_pos + ctx->offset;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
635 last = buf->file_last + ctx->offset;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
636
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
637 } else {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
638 start = buf->pos - buf->start + ctx->offset;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
639 last = buf->last - buf->start + ctx->offset;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
640 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
641
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
642 for (i = 0; i < ctx->ranges.nelts; i++) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
643 if (start > range[i].start || last < range[i].end) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
644 goto overlapped;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
645 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
646 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
647 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
648
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
649 ctx->offset = ngx_buf_size(buf);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
650
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
651 ll = &out;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
652
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
653 for (i = 0; i < ctx->ranges.nelts; i++) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
654
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
655 /*
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
656 * The boundary header of the range:
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
657 * CRLF
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
658 * "--0123456789" CRLF
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
659 * "Content-Type: image/jpeg" CRLF
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
660 * "Content-Range: bytes "
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
661 */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
662
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
663 b = ngx_calloc_buf(r->pool);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
664 if (b == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
665 return NGX_ERROR;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
666 }
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
667
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
668 b->memory = 1;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
669 b->pos = ctx->boundary_header.data;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
670 b->last = ctx->boundary_header.data + ctx->boundary_header.len;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
671
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
672 hcl = ngx_alloc_chain_link(r->pool);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
673 if (hcl == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
674 return NGX_ERROR;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
675 }
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
676
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
677 hcl->buf = b;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
678
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
679
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
680 /* "SSSS-EEEE/TTTT" CRLF CRLF */
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
681
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
682 b = ngx_calloc_buf(r->pool);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
683 if (b == NULL) {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
684 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
685 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
686
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
687 b->temporary = 1;
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
688 b->pos = range[i].content_range.data;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
689 b->last = range[i].content_range.data + range[i].content_range.len;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
690
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
691 rcl = ngx_alloc_chain_link(r->pool);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
692 if (rcl == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
693 return NGX_ERROR;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
694 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
695
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
696 rcl->buf = b;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
697
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
698
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
699 /* the range data */
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
700
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
701 b = ngx_calloc_buf(r->pool);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
702 if (b == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
703 return NGX_ERROR;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
704 }
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
705
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
706 b->in_file = buf->in_file;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
707 b->temporary = buf->temporary;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
708 b->memory = buf->memory;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
709 b->mmap = buf->mmap;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
710 b->file = buf->file;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
711
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
712 if (buf->in_file) {
282
675a39fd14cd nginx 0.5.11
Igor Sysoev <http://sysoev.ru>
parents: 272
diff changeset
713 b->file_pos = range[i].start;
675a39fd14cd nginx 0.5.11
Igor Sysoev <http://sysoev.ru>
parents: 272
diff changeset
714 b->file_last = range[i].end;
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
715 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
716
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
717 if (ngx_buf_in_memory(buf)) {
282
675a39fd14cd nginx 0.5.11
Igor Sysoev <http://sysoev.ru>
parents: 272
diff changeset
718 b->pos = buf->start + (size_t) range[i].start;
675a39fd14cd nginx 0.5.11
Igor Sysoev <http://sysoev.ru>
parents: 272
diff changeset
719 b->last = buf->start + (size_t) range[i].end;
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
720 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
721
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
722 dcl = ngx_alloc_chain_link(r->pool);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
723 if (dcl == NULL) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
724 return NGX_ERROR;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
725 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
726
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
727 dcl->buf = b;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
728
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
729 *ll = hcl;
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
730 hcl->next = rcl;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
731 rcl->next = dcl;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
732 ll = &dcl->next;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
733 }
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
734
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
735 /* the last boundary CRLF "--0123456789--" CRLF */
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
736
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
737 b = ngx_calloc_buf(r->pool);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
738 if (b == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
739 return NGX_ERROR;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
740 }
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
741
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
742 b->temporary = 1;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
743 b->last_buf = 1;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
744
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
745 b->pos = ngx_pnalloc(r->pool, sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
746 + sizeof("--" CRLF) - 1);
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
747 if (b->pos == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
748 return NGX_ERROR;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
749 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
750
300
cba14c1e2a4b nginx 0.5.20
Igor Sysoev <http://sysoev.ru>
parents: 286
diff changeset
751 b->last = ngx_cpymem(b->pos, ctx->boundary_header.data,
cba14c1e2a4b nginx 0.5.20
Igor Sysoev <http://sysoev.ru>
parents: 286
diff changeset
752 sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN);
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
753 *b->last++ = '-'; *b->last++ = '-';
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
754 *b->last++ = CR; *b->last++ = LF;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
755
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
756 hcl = ngx_alloc_chain_link(r->pool);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
757 if (hcl == NULL) {
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
758 return NGX_ERROR;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
759 }
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
760
272
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
761 hcl->buf = b;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
762 hcl->next = NULL;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
763
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
764 *ll = hcl;
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
765
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
766 return ngx_http_next_body_filter(r, out);
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
767
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
768 overlapped:
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
769
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
770 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
771 "range in overlapped buffers");
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
772
29a6403156b0 nginx 0.5.6
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
773 return NGX_ERROR;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
774 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
775
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
776
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
777 static ngx_int_t
391
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
778 ngx_http_range_body_early_filter(ngx_http_request_t *r, ngx_chain_t *in)
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
779 {
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
780 if (!r->allow_ranges || r->late_ranges) {
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
781 return ngx_http_next_body_early_filter(r, in);
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
782 }
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
783
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
784 return ngx_http_range_body_generic_filter(r, in,
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
785 ngx_http_next_body_early_filter);
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
786 }
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
787
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
788
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
789 static ngx_int_t
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
790 ngx_http_range_body_late_filter(ngx_http_request_t *r, ngx_chain_t *in)
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
791 {
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
792 if (!r->allow_ranges || !r->late_ranges) {
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
793 return ngx_http_next_body_late_filter(r, in);
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
794 }
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
795
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
796 return ngx_http_range_body_generic_filter(r, in,
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
797 ngx_http_next_body_late_filter);
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
798 }
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
799
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
800
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
801 static ngx_int_t
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
802 ngx_http_range_header_filter_init(ngx_conf_t *cf)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
803 {
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
804 ngx_http_next_header_filter = ngx_http_top_header_filter;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
805 ngx_http_top_header_filter = ngx_http_range_header_filter;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
806
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
807 return NGX_OK;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
808 }
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
809
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
810
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
811 static ngx_int_t
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
812 ngx_http_range_body_filter_init(ngx_conf_t *cf)
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
813 {
391
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
814 ngx_http_next_body_early_filter = ngx_http_top_body_filter;
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
815 ngx_http_top_body_filter = ngx_http_range_body_early_filter;
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
816
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
817 return NGX_OK;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
818 }
391
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
819
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
820
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
821 static ngx_int_t
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
822 ngx_http_range_late_filter_init(ngx_conf_t *cf)
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
823 {
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
824 ngx_http_next_body_late_filter = ngx_http_top_body_filter;
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
825 ngx_http_top_body_filter = ngx_http_range_body_late_filter;
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
826
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
827 return NGX_OK;
1d9bef53cd8e Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents: 390
diff changeset
828 }