annotate src/http/modules/ngx_http_slice_filter_module.c @ 7676:d225b70d38b6

Proxy: detection of data after final chunk. Previously, additional data after final chunk was either ignored (in the same buffer, or during unbuffered proxying) or sent to the client (in the next buffer already if it was already read from the socket). Now additional data are properly detected and ignored in all cases. Additionally, a warning is now logged and keepalive is disabled in the connection.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 06 Jul 2020 18:36:20 +0300
parents f583559aadc7
children 32a343635b50
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
13 typedef struct {
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
14 size_t size;
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
15 } ngx_http_slice_loc_conf_t;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
16
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
17
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
18 typedef struct {
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
19 off_t start;
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
20 off_t end;
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
21 ngx_str_t range;
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
22 ngx_str_t etag;
6963
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
23 unsigned last:1;
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
24 unsigned active:1;
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
25 ngx_http_request_t *sr;
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
26 } ngx_http_slice_ctx_t;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
28
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
29 typedef struct {
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
30 off_t start;
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
31 off_t end;
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
32 off_t complete_length;
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33 } ngx_http_slice_content_range_t;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
35
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
36 static ngx_int_t ngx_http_slice_header_filter(ngx_http_request_t *r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
37 static ngx_int_t ngx_http_slice_body_filter(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
38 ngx_chain_t *in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39 static ngx_int_t ngx_http_slice_parse_content_range(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
40 ngx_http_slice_content_range_t *cr);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
41 static ngx_int_t ngx_http_slice_range_variable(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42 ngx_http_variable_value_t *v, uintptr_t data);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 static off_t ngx_http_slice_get_start(ngx_http_request_t *r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
44 static void *ngx_http_slice_create_loc_conf(ngx_conf_t *cf);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45 static char *ngx_http_slice_merge_loc_conf(ngx_conf_t *cf, void *parent,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46 void *child);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47 static ngx_int_t ngx_http_slice_add_variables(ngx_conf_t *cf);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48 static ngx_int_t ngx_http_slice_init(ngx_conf_t *cf);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
51 static ngx_command_t ngx_http_slice_filter_commands[] = {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
53 { ngx_string("slice"),
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
55 ngx_conf_set_size_slot,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56 NGX_HTTP_LOC_CONF_OFFSET,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57 offsetof(ngx_http_slice_loc_conf_t, size),
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 NULL },
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60 ngx_null_command
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61 };
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 static ngx_http_module_t ngx_http_slice_filter_module_ctx = {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65 ngx_http_slice_add_variables, /* preconfiguration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 ngx_http_slice_init, /* postconfiguration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 NULL, /* create main configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69 NULL, /* init main configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 NULL, /* create server configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 NULL, /* merge server configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74 ngx_http_slice_create_loc_conf, /* create location configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75 ngx_http_slice_merge_loc_conf /* merge location configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76 };
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 ngx_module_t ngx_http_slice_filter_module = {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80 NGX_MODULE_V1,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 &ngx_http_slice_filter_module_ctx, /* module context */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82 ngx_http_slice_filter_commands, /* module directives */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83 NGX_HTTP_MODULE, /* module type */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 NULL, /* init master */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85 NULL, /* init module */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86 NULL, /* init process */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 NULL, /* init thread */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88 NULL, /* exit thread */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 NULL, /* exit process */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90 NULL, /* exit master */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91 NGX_MODULE_V1_PADDING
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92 };
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95 static ngx_str_t ngx_http_slice_range_name = ngx_string("slice_range");
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98 static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102 ngx_http_slice_header_filter(ngx_http_request_t *r)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104 off_t end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 ngx_int_t rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109 ngx_http_slice_content_range_t cr;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
111 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
113 return ngx_http_next_header_filter(r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
114 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116 if (r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
117 if (r == r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
118 ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119 return ngx_http_next_header_filter(r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 "unexpected status code %ui in slice response",
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124 r->headers_out.status);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128 h = r->headers_out.etag;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 if (ctx->etag.len) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132 || h->value.len != ctx->etag.len
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133 || ngx_strncmp(h->value.data, ctx->etag.data, ctx->etag.len)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134 != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
137 "etag mismatch in slice response");
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
138 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
139 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142 if (h) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143 ctx->etag = h->value;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
145
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146 if (ngx_http_slice_parse_content_range(r, &cr) != NGX_OK) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
147 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
148 "invalid range in slice response");
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
149 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
150 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
152 if (cr.complete_length == -1) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
153 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
154 "no complete length in slice response");
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
155 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
156 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
158 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
159 "http slice response range: %O-%O/%O",
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
160 cr.start, cr.end, cr.complete_length);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
161
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
162 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
163
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
164 end = ngx_min(cr.start + (off_t) slcf->size, cr.complete_length);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
165
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
166 if (cr.start != ctx->start || cr.end != end) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
167 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
168 "unexpected range in slice response: %O-%O",
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
169 cr.start, cr.end);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
171 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
173 ctx->start = end;
6963
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
174 ctx->active = 1;
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
176 r->headers_out.status = NGX_HTTP_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
177 r->headers_out.status_line.len = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178 r->headers_out.content_length_n = cr.complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179 r->headers_out.content_offset = cr.start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 r->headers_out.content_range->hash = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181 r->headers_out.content_range = NULL;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183 r->allow_ranges = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184 r->subrequest_ranges = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185 r->single_range = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187 rc = ngx_http_next_header_filter(r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189 if (r != r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192
7070
f583559aadc7 Upstream: keep request body file from removal if requested.
Roman Arutyunyan <arut@nginx.com>
parents: 7067
diff changeset
193 r->preserve_body = 1;
f583559aadc7 Upstream: keep request body file from removal if requested.
Roman Arutyunyan <arut@nginx.com>
parents: 7067
diff changeset
194
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195 if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 ctx->start = slcf->size
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198 * (r->headers_out.content_offset / slcf->size);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 ctx->end = r->headers_out.content_offset
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202 + r->headers_out.content_length_n;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204 } else {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205 ctx->end = cr.complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213 ngx_http_slice_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
214 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215 ngx_int_t rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216 ngx_chain_t *cl;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
218 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
219
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
220 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
221
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
222 if (ctx == NULL || r != r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223 return ngx_http_next_body_filter(r, in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
224 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
225
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
226 for (cl = in; cl; cl = cl->next) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
227 if (cl->buf->last_buf) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
228 cl->buf->last_buf = 0;
6322
4f0f4f02c98f Slice filter: terminate first slice with last_in_chain flag.
Roman Arutyunyan <arut@nginx.com>
parents: 6321
diff changeset
229 cl->buf->last_in_chain = 1;
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
230 cl->buf->sync = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
231 ctx->last = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
232 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
233 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
234
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
235 rc = ngx_http_next_body_filter(r, in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
236
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
237 if (rc == NGX_ERROR || !ctx->last) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
239 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
240
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
241 if (ctx->sr && !ctx->sr->done) {
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
242 return rc;
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
243 }
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
244
6963
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
245 if (!ctx->active) {
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
246 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
247 "missing slice response");
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
248 return NGX_ERROR;
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
249 }
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
250
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
251 if (ctx->start >= ctx->end) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252 ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
253 ngx_http_send_special(r, NGX_HTTP_LAST);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
254 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
255 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
256
6321
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
257 if (r->buffered) {
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
258 return rc;
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
259 }
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
260
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
261 if (ngx_http_subrequest(r, &r->uri, &r->args, &ctx->sr, NULL,
6907
d16ba0ea3434 Slice filter: fetch slices in cloned subrequests.
Roman Arutyunyan <arut@nginx.com>
parents: 6322
diff changeset
262 NGX_HTTP_SUBREQUEST_CLONE)
d16ba0ea3434 Slice filter: fetch slices in cloned subrequests.
Roman Arutyunyan <arut@nginx.com>
parents: 6322
diff changeset
263 != NGX_OK)
d16ba0ea3434 Slice filter: fetch slices in cloned subrequests.
Roman Arutyunyan <arut@nginx.com>
parents: 6322
diff changeset
264 {
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
265 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
266 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
267
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
268 ngx_http_set_ctx(ctx->sr, ctx, ngx_http_slice_filter_module);
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
269
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
270 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
271
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
272 ctx->range.len = ngx_sprintf(ctx->range.data, "bytes=%O-%O", ctx->start,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
273 ctx->start + (off_t) slcf->size - 1)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
274 - ctx->range.data;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
275
6963
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
276 ctx->active = 0;
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
277
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
278 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279 "http slice subrequest: \"%V\"", &ctx->range);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
281 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
282 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
283
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
285 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
286 ngx_http_slice_parse_content_range(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
287 ngx_http_slice_content_range_t *cr)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
288 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
289 off_t start, end, complete_length, cutoff, cutlim;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
290 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
291 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
292
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
293 h = r->headers_out.content_range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
294
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
296 || h->value.len < 7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
297 || ngx_strncmp(h->value.data, "bytes ", 6) != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302 p = h->value.data + 6;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304 cutoff = NGX_MAX_OFF_T_VALUE / 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305 cutlim = NGX_MAX_OFF_T_VALUE % 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307 start = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308 end = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309 complete_length = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
316
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
320 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
321
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6963
diff changeset
322 start = start * 10 + (*p++ - '0');
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
323 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
325 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
327 if (*p++ != '-') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
328 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
329 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
330
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
336
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
340 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
341
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6963
diff changeset
342 end = end * 10 + (*p++ - '0');
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 end++;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349 if (*p++ != '/') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355 if (*p != '*') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
356 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
357 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
358 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361 if (complete_length >= cutoff
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
362 && (complete_length > cutoff || *p - '0' > cutlim))
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
363 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
365 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6963
diff changeset
367 complete_length = complete_length * 10 + (*p++ - '0');
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 } else {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371 complete_length = -1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372 p++;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
373 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
374
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377 if (*p != '\0') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
379 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381 cr->start = start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382 cr->end = end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
383 cr->complete_length = complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
385 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
386 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390 ngx_http_slice_range_variable(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391 ngx_http_variable_value_t *v, uintptr_t data)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
392 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
393 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
396
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400 if (r != r->main || r->headers_out.status) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401 v->not_found = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
405 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
406
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
407 if (slcf->size == 0) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 v->not_found = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
410 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
413 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
414 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
415 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
416
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
417 ngx_http_set_ctx(r, ctx, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419 p = ngx_pnalloc(r->pool, sizeof("bytes=-") - 1 + 2 * NGX_OFF_T_LEN);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
420 if (p == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
421 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
422 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 ctx->start = slcf->size * (ngx_http_slice_get_start(r) / slcf->size);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426 ctx->range.data = p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428 ctx->start + (off_t) slcf->size - 1)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429 - p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
430 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432 v->data = ctx->range.data;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433 v->valid = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434 v->not_found = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435 v->no_cacheable = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436 v->len = ctx->range.len;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
440
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
441
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442 static off_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443 ngx_http_slice_get_start(ngx_http_request_t *r)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445 off_t start, cutoff, cutlim;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
446 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
447 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
448
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
449 if (r->headers_in.if_range) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
450 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
451 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
452
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
453 h = r->headers_in.range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
454
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
455 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
456 || h->value.len < 7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
457 || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
458 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
459 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
460 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
461
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
462 p = h->value.data + 6;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
463
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
464 if (ngx_strchr(p, ',')) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
468 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
469
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
470 if (*p == '-') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
471 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
472 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
474 cutoff = NGX_MAX_OFF_T_VALUE / 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475 cutlim = NGX_MAX_OFF_T_VALUE % 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477 start = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
480 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
481 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
482 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
483
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6963
diff changeset
484 start = start * 10 + (*p++ - '0');
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
485 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487 return start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
489
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
490
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
491 static void *
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492 ngx_http_slice_create_loc_conf(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
493 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
494 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
495
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
496 slcf = ngx_palloc(cf->pool, sizeof(ngx_http_slice_loc_conf_t));
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
497 if (slcf == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
498 return NULL;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
499 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
500
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
501 slcf->size = NGX_CONF_UNSET_SIZE;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
502
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
503 return slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
504 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
505
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
506
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
507 static char *
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
508 ngx_http_slice_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
509 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510 ngx_http_slice_loc_conf_t *prev = parent;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511 ngx_http_slice_loc_conf_t *conf = child;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
512
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
513 ngx_conf_merge_size_value(conf->size, prev->size, 0);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
514
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
515 return NGX_CONF_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
516 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
518
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
519 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 ngx_http_slice_add_variables(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
521 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
522 ngx_http_variable_t *var;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
523
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
524 var = ngx_http_add_variable(cf, &ngx_http_slice_range_name, 0);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
525 if (var == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
526 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
527 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
528
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
529 var->get_handler = ngx_http_slice_range_variable;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
530
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
531 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
532 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
533
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
534
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
535 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536 ngx_http_slice_init(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
537 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538 ngx_http_next_header_filter = ngx_http_top_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
539 ngx_http_top_header_filter = ngx_http_slice_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
540
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541 ngx_http_next_body_filter = ngx_http_top_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542 ngx_http_top_body_filter = ngx_http_slice_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
543
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
544 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
545 }