annotate src/http/modules/ngx_http_slice_filter_module.c @ 9274:46ecad404a29 default tip

Mail: reset imap tag to empty after authentication attempt. We need to reset the imap tag to empty after an authentication attempt completes, otherwise if the next line parsed is incomplete with no tag (e.g. empty line) then we use the "tag" from the previous buffer which is now definitely wrong and has been partially overwritten with the most recently read data (e.g. CRLF). An example before this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: S: obar BAD invalid command Then with this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: * BAD invalid command
author Rob Mueller <robm@fastmailteam.com>
date Wed, 15 May 2024 10:06:00 +0300
parents 32a343635b50
children
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
7684
32a343635b50 Slice filter: clear original Accept-Ranges.
Roman Arutyunyan <arut@nginx.com>
parents: 7070
diff changeset
183 if (r->headers_out.accept_ranges) {
32a343635b50 Slice filter: clear original Accept-Ranges.
Roman Arutyunyan <arut@nginx.com>
parents: 7070
diff changeset
184 r->headers_out.accept_ranges->hash = 0;
32a343635b50 Slice filter: clear original Accept-Ranges.
Roman Arutyunyan <arut@nginx.com>
parents: 7070
diff changeset
185 r->headers_out.accept_ranges = NULL;
32a343635b50 Slice filter: clear original Accept-Ranges.
Roman Arutyunyan <arut@nginx.com>
parents: 7070
diff changeset
186 }
32a343635b50 Slice filter: clear original Accept-Ranges.
Roman Arutyunyan <arut@nginx.com>
parents: 7070
diff changeset
187
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 r->allow_ranges = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189 r->subrequest_ranges = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190 r->single_range = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 rc = ngx_http_next_header_filter(r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 if (r != r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197
7070
f583559aadc7 Upstream: keep request body file from removal if requested.
Roman Arutyunyan <arut@nginx.com>
parents: 7067
diff changeset
198 r->preserve_body = 1;
f583559aadc7 Upstream: keep request body file from removal if requested.
Roman Arutyunyan <arut@nginx.com>
parents: 7067
diff changeset
199
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200 if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202 ctx->start = slcf->size
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203 * (r->headers_out.content_offset / slcf->size);
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 ctx->end = r->headers_out.content_offset
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207 + r->headers_out.content_length_n;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209 } else {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 ctx->end = cr.complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
214 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
218 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
219 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
220 ngx_int_t rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
221 ngx_chain_t *cl;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
222 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
224
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
225 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
226
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
227 if (ctx == NULL || r != r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
228 return ngx_http_next_body_filter(r, in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
229 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
230
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
231 for (cl = in; cl; cl = cl->next) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
232 if (cl->buf->last_buf) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
233 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
234 cl->buf->last_in_chain = 1;
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
235 cl->buf->sync = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
236 ctx->last = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
237 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
239
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
240 rc = ngx_http_next_body_filter(r, in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
241
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
242 if (rc == NGX_ERROR || !ctx->last) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
243 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
244 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
245
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
246 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
247 return rc;
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
248 }
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
249
6963
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
250 if (!ctx->active) {
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
251 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
252 "missing slice response");
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
253 return NGX_ERROR;
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
254 }
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
255
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
256 if (ctx->start >= ctx->end) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
257 ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
258 ngx_http_send_special(r, NGX_HTTP_LAST);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
259 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
260 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
261
6321
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
262 if (r->buffered) {
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
263 return rc;
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
264 }
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
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 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
267 NGX_HTTP_SUBREQUEST_CLONE)
d16ba0ea3434 Slice filter: fetch slices in cloned subrequests.
Roman Arutyunyan <arut@nginx.com>
parents: 6322
diff changeset
268 != NGX_OK)
d16ba0ea3434 Slice filter: fetch slices in cloned subrequests.
Roman Arutyunyan <arut@nginx.com>
parents: 6322
diff changeset
269 {
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
270 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
271 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
272
6962
a97ad1663ef4 Slice filter: allowed at most one subrequest at a time.
Roman Arutyunyan <arut@nginx.com>
parents: 6907
diff changeset
273 ngx_http_set_ctx(ctx->sr, ctx, ngx_http_slice_filter_module);
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
274
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
275 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
276
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
277 ctx->range.len = ngx_sprintf(ctx->range.data, "bytes=%O-%O", ctx->start,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
278 ctx->start + (off_t) slcf->size - 1)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279 - ctx->range.data;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280
6963
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
281 ctx->active = 0;
3ff293cfdab8 Slice filter: prevented slice redirection (ticket #1219).
Roman Arutyunyan <arut@nginx.com>
parents: 6962
diff changeset
282
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
283 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284 "http slice subrequest: \"%V\"", &ctx->range);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
285
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
286 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
287 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
288
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
289
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
290 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
291 ngx_http_slice_parse_content_range(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
292 ngx_http_slice_content_range_t *cr)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
293 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
294 off_t start, end, complete_length, cutoff, cutlim;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
296 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
297
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298 h = r->headers_out.content_range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301 || h->value.len < 7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302 || ngx_strncmp(h->value.data, "bytes ", 6) != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307 p = h->value.data + 6;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309 cutoff = NGX_MAX_OFF_T_VALUE / 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310 cutlim = NGX_MAX_OFF_T_VALUE % 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312 start = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313 end = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314 complete_length = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
316 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318 if (*p < '0' || *p > '9') {
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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
322 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
323 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
325 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6963
diff changeset
327 start = start * 10 + (*p++ - '0');
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
328 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
329
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
330 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332 if (*p++ != '-') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
336 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 if (*p < '0' || *p > '9') {
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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
342 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6963
diff changeset
347 end = end * 10 + (*p++ - '0');
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350 end++;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354 if (*p++ != '/') {
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 == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360 if (*p != '*') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361 if (*p < '0' || *p > '9') {
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 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366 if (complete_length >= cutoff
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
367 && (complete_length > cutoff || *p - '0' > cutlim))
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6963
diff changeset
372 complete_length = complete_length * 10 + (*p++ - '0');
6317
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 } else {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376 complete_length = -1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377 p++;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
379
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382 if (*p != '\0') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
383 return NGX_ERROR;
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 cr->start = start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387 cr->end = end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 cr->complete_length = complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
392
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
393
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395 ngx_http_slice_range_variable(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
396 ngx_http_variable_value_t *v, uintptr_t data)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
405 if (r != r->main || r->headers_out.status) {
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 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412 if (slcf->size == 0) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
413 v->not_found = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
414 return NGX_OK;
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 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418 if (ctx == 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 ngx_http_set_ctx(r, ctx, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 p = ngx_pnalloc(r->pool, sizeof("bytes=-") - 1 + 2 * NGX_OFF_T_LEN);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425 if (p == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429 ctx->start = slcf->size * (ngx_http_slice_get_start(r) / slcf->size);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
430
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431 ctx->range.data = p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432 ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433 ctx->start + (off_t) slcf->size - 1)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434 - p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437 v->data = ctx->range.data;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438 v->valid = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439 v->not_found = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
440 v->no_cacheable = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
441 v->len = ctx->range.len;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
446
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
447 static off_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
448 ngx_http_slice_get_start(ngx_http_request_t *r)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
449 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
450 off_t start, cutoff, cutlim;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
451 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
452 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
453
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
454 if (r->headers_in.if_range) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
455 return 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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
458 h = r->headers_in.range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
459
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
460 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
461 || h->value.len < 7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
462 || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
463 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
464 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467 p = h->value.data + 6;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
468
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
469 if (ngx_strchr(p, ',')) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
470 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
471 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
472
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
474
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475 if (*p == '-') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 cutoff = NGX_MAX_OFF_T_VALUE / 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
480 cutlim = NGX_MAX_OFF_T_VALUE % 10;
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 = 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 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
485 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488
7067
e3723f2a11b7 Parenthesized ASCII-related calculations.
Valentin Bartenev <vbart@nginx.com>
parents: 6963
diff changeset
489 start = start * 10 + (*p++ - '0');
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
490 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
491
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492 return start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
493 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
494
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
495
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
496 static void *
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
497 ngx_http_slice_create_loc_conf(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
498 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
499 ngx_http_slice_loc_conf_t *slcf;
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 = ngx_palloc(cf->pool, sizeof(ngx_http_slice_loc_conf_t));
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
502 if (slcf == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
503 return NULL;
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 slcf->size = NGX_CONF_UNSET_SIZE;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
507
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
508 return slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
509 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
512 static char *
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
513 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
514 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
515 ngx_http_slice_loc_conf_t *prev = parent;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
516 ngx_http_slice_loc_conf_t *conf = child;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
518 ngx_conf_merge_size_value(conf->size, prev->size, 0);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
519
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 return NGX_CONF_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
521 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
522
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
523
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
524 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
525 ngx_http_slice_add_variables(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
526 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
527 ngx_http_variable_t *var;
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 = ngx_http_add_variable(cf, &ngx_http_slice_range_name, 0);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
530 if (var == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
531 return NGX_ERROR;
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 var->get_handler = ngx_http_slice_range_variable;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
535
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
537 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
539
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
540 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541 ngx_http_slice_init(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
543 ngx_http_next_header_filter = ngx_http_top_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
544 ngx_http_top_header_filter = ngx_http_slice_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
545
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
546 ngx_http_next_body_filter = ngx_http_top_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
547 ngx_http_top_body_filter = ngx_http_slice_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
548
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
549 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
550 }