annotate src/http/modules/ngx_http_slice_filter_module.c @ 6963:3ff293cfdab8

Slice filter: prevented slice redirection (ticket #1219). When a slice subrequest was redirected to a new location, its context was lost. After its completion, a new slice subrequest for the same slice was created. This could lead to infinite loop. Now the slice module makes sure each slice subrequest starts output with the slice context available.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 31 Mar 2017 21:47:56 +0300
parents a97ad1663ef4
children e3723f2a11b7
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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193 if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195 ctx->start = slcf->size
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 * (r->headers_out.content_offset / slcf->size);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199 ctx->end = r->headers_out.content_offset
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200 + r->headers_out.content_length_n;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202 } else {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203 ctx->end = cr.complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211 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
212 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213 ngx_int_t rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
214 ngx_chain_t *cl;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
218 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
219
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
220 if (ctx == NULL || r != r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
221 return ngx_http_next_body_filter(r, in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
222 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
224 for (cl = in; cl; cl = cl->next) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
225 if (cl->buf->last_buf) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
226 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
227 cl->buf->last_in_chain = 1;
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
228 cl->buf->sync = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
229 ctx->last = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
230 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
231 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
232
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
233 rc = ngx_http_next_body_filter(r, in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
234
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
235 if (rc == NGX_ERROR || !ctx->last) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
236 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
237 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
239 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
240 return rc;
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
241 }
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
242
6963
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
243 if (!ctx->active) {
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
244 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
245 "missing slice response");
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
246 return NGX_ERROR;
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
247 }
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
248
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
249 if (ctx->start >= ctx->end) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
250 ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
251 ngx_http_send_special(r, NGX_HTTP_LAST);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
253 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
254
6321
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
255 if (r->buffered) {
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
256 return rc;
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
257 }
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
258
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
259 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
260 NGX_HTTP_SUBREQUEST_CLONE)
d16ba0ea3434 Slice filter: fetch slices in cloned subrequests.
Roman Arutyunyan <arut@nginx.com>
parents: 6322
diff changeset
261 != NGX_OK)
d16ba0ea3434 Slice filter: fetch slices in cloned subrequests.
Roman Arutyunyan <arut@nginx.com>
parents: 6322
diff changeset
262 {
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
263 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
264 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
265
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
266 ngx_http_set_ctx(ctx->sr, ctx, ngx_http_slice_filter_module);
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
267
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
268 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
269
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
270 ctx->range.len = ngx_sprintf(ctx->range.data, "bytes=%O-%O", ctx->start,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
271 ctx->start + (off_t) slcf->size - 1)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
272 - ctx->range.data;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
273
6963
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
274 ctx->active = 0;
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
275
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
276 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
277 "http slice subrequest: \"%V\"", &ctx->range);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
278
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
281
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
282
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
283 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284 ngx_http_slice_parse_content_range(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
285 ngx_http_slice_content_range_t *cr)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
286 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
287 off_t start, end, complete_length, cutoff, cutlim;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
288 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
289 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
290
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
291 h = r->headers_out.content_range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
292
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
293 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
294 || h->value.len < 7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 || ngx_strncmp(h->value.data, "bytes ", 6) != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
296 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
297 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300 p = h->value.data + 6;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302 cutoff = NGX_MAX_OFF_T_VALUE / 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303 cutlim = NGX_MAX_OFF_T_VALUE % 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305 start = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306 end = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307 complete_length = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
316 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
320 start = start * 10 + *p++ - '0';
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
321 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
322
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
323 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
325 if (*p++ != '-') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
327 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
328
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
329 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
330
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
336 if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
340 end = end * 10 + *p++ - '0';
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
341 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
342
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 end++;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347 if (*p++ != '/') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353 if (*p != '*') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
356 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
357
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
358 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359 if (complete_length >= cutoff
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360 && (complete_length > cutoff || *p - '0' > cutlim))
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
362 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
363 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
365 complete_length = complete_length * 10 + *p++ - '0';
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
367
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368 } else {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369 complete_length = -1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 p++;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
373 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
374
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375 if (*p != '\0') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
379 cr->start = start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380 cr->end = end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381 cr->complete_length = complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
383 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
385
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
386
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 ngx_http_slice_range_variable(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389 ngx_http_variable_value_t *v, uintptr_t data)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
392 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
393 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
396
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398 if (r != r->main || r->headers_out.status) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399 v->not_found = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
405 if (slcf->size == 0) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
406 v->not_found = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
407 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
410 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
413 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
414
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
415 ngx_http_set_ctx(r, ctx, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
416
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
417 p = ngx_pnalloc(r->pool, sizeof("bytes=-") - 1 + 2 * NGX_OFF_T_LEN);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418 if (p == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
420 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
421
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
422 ctx->start = slcf->size * (ngx_http_slice_get_start(r) / slcf->size);
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->range.data = p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425 ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426 ctx->start + (off_t) slcf->size - 1)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 - p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
430 v->data = ctx->range.data;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431 v->valid = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432 v->not_found = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433 v->no_cacheable = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434 v->len = ctx->range.len;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
440 static off_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
441 ngx_http_slice_get_start(ngx_http_request_t *r)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443 off_t start, cutoff, cutlim;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
446
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
447 if (r->headers_in.if_range) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
448 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
449 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
450
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
451 h = r->headers_in.range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
452
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
453 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
454 || h->value.len < 7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
455 || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
456 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
457 return 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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
460 p = h->value.data + 6;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
461
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
462 if (ngx_strchr(p, ',')) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
463 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
464 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
468 if (*p == '-') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
469 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
470 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
471
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
472 cutoff = NGX_MAX_OFF_T_VALUE / 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473 cutlim = NGX_MAX_OFF_T_VALUE % 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
474
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475 start = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
480 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
481
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
482 start = start * 10 + *p++ - '0';
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
483 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
484
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
485 return start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
489 static void *
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
490 ngx_http_slice_create_loc_conf(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
491 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
493
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
494 slcf = ngx_palloc(cf->pool, sizeof(ngx_http_slice_loc_conf_t));
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
495 if (slcf == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
496 return NULL;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
497 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
498
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
499 slcf->size = NGX_CONF_UNSET_SIZE;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
500
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
501 return slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
502 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
503
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
504
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
505 static char *
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
506 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
507 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
508 ngx_http_slice_loc_conf_t *prev = parent;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
509 ngx_http_slice_loc_conf_t *conf = child;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511 ngx_conf_merge_size_value(conf->size, prev->size, 0);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
512
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
513 return NGX_CONF_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
514 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
515
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
516
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
518 ngx_http_slice_add_variables(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
519 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 ngx_http_variable_t *var;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
521
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
522 var = ngx_http_add_variable(cf, &ngx_http_slice_range_name, 0);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
523 if (var == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
524 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
525 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
526
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
527 var->get_handler = ngx_http_slice_range_variable;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
528
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
529 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
530 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
531
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
532
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
533 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
534 ngx_http_slice_init(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
535 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536 ngx_http_next_header_filter = ngx_http_top_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
537 ngx_http_top_header_filter = ngx_http_slice_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
539 ngx_http_next_body_filter = ngx_http_top_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
540 ngx_http_top_body_filter = ngx_http_slice_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
543 }