annotate src/http/modules/ngx_http_slice_filter_module.c @ 6755:e2f13011343e stable-1.10

HTTP/2: fixed the "http request count is zero" alert. When the stream is terminated the HEADERS frame can still wait in the output queue. This frame can't be removed and must be sent to the client anyway, since HTTP/2 uses stateful compression for headers. So in order to postpone closing and freeing memory of such stream the special close stream handler is set to the write event. After the HEADERS frame is sent the write event is called and the stream will be finally closed. Some events like receiving a RST_STREAM can trigger the read handler of such stream in closing state and cause unexpected processing that can result in another attempt to finalize the request. To prevent it the read handler is now set to ngx_http_empty_handler. Thanks to Amazon.
author Valentin Bartenev <vbart@nginx.com>
date Thu, 16 Jun 2016 20:55:11 +0300
parents 4f0f4f02c98f
children d16ba0ea3434
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 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
14 size_t size;
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 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
19 off_t start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
20 off_t end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
21 ngx_str_t range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
22 ngx_str_t etag;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
23 ngx_uint_t last; /* unsigned last:1; */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
24 } ngx_http_slice_ctx_t;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
25
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
26
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27 typedef struct {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
28 off_t start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
29 off_t end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
30 off_t complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
31 } ngx_http_slice_content_range_t;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34 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
35 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
36 ngx_chain_t *in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
37 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
38 ngx_http_slice_content_range_t *cr);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39 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
40 ngx_http_variable_value_t *v, uintptr_t data);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
41 static off_t ngx_http_slice_get_start(ngx_http_request_t *r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42 static void *ngx_http_slice_create_loc_conf(ngx_conf_t *cf);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 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
44 void *child);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45 static ngx_int_t ngx_http_slice_add_variables(ngx_conf_t *cf);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46 static ngx_int_t ngx_http_slice_init(ngx_conf_t *cf);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49 static ngx_command_t ngx_http_slice_filter_commands[] = {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
51 { ngx_string("slice"),
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52 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
53 ngx_conf_set_size_slot,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54 NGX_HTTP_LOC_CONF_OFFSET,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
55 offsetof(ngx_http_slice_loc_conf_t, size),
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56 NULL },
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 ngx_null_command
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59 };
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 static ngx_http_module_t ngx_http_slice_filter_module_ctx = {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 ngx_http_slice_add_variables, /* preconfiguration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 ngx_http_slice_init, /* postconfiguration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 NULL, /* create main configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67 NULL, /* init main configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69 NULL, /* create server configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70 NULL, /* merge server configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 ngx_http_slice_create_loc_conf, /* create location configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 ngx_http_slice_merge_loc_conf /* merge location configuration */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74 };
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77 ngx_module_t ngx_http_slice_filter_module = {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78 NGX_MODULE_V1,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 &ngx_http_slice_filter_module_ctx, /* module context */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80 ngx_http_slice_filter_commands, /* module directives */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 NGX_HTTP_MODULE, /* module type */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82 NULL, /* init master */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83 NULL, /* init module */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 NULL, /* init process */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85 NULL, /* init thread */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86 NULL, /* exit thread */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 NULL, /* exit process */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88 NULL, /* exit master */
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 NGX_MODULE_V1_PADDING
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90 };
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93 static ngx_str_t ngx_http_slice_range_name = ngx_string("slice_range");
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_http_output_header_filter_pt ngx_http_next_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96 static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 ngx_http_slice_header_filter(ngx_http_request_t *r)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102 off_t end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103 ngx_int_t rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107 ngx_http_slice_content_range_t cr;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
111 return ngx_http_next_header_filter(r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
113
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
114 if (r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115 if (r == r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116 ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
117 return ngx_http_next_header_filter(r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
118 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121 "unexpected status code %ui in slice response",
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122 r->headers_out.status);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126 h = r->headers_out.etag;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128 if (ctx->etag.len) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 || h->value.len != ctx->etag.len
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131 || ngx_strncmp(h->value.data, ctx->etag.data, ctx->etag.len)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132 != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 "etag mismatch in slice response");
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
137 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
138 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
139
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140 if (h) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141 ctx->etag = h->value;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144 if (ngx_http_slice_parse_content_range(r, &cr) != NGX_OK) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
145 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146 "invalid range in slice response");
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
147 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
148 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
149
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
150 if (cr.complete_length == -1) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
152 "no complete length in slice response");
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
153 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
154 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
155
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
156 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157 "http slice response range: %O-%O/%O",
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
158 cr.start, cr.end, cr.complete_length);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
159
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
160 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
161
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
162 end = ngx_min(cr.start + (off_t) slcf->size, cr.complete_length);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
163
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
164 if (cr.start != ctx->start || cr.end != end) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
165 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
166 "unexpected range in slice response: %O-%O",
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
167 cr.start, cr.end);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
168 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
169 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
171 ctx->start = end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
173 r->headers_out.status = NGX_HTTP_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
174 r->headers_out.status_line.len = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175 r->headers_out.content_length_n = cr.complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
176 r->headers_out.content_offset = cr.start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
177 r->headers_out.content_range->hash = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178 r->headers_out.content_range = NULL;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 r->allow_ranges = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181 r->subrequest_ranges = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182 r->single_range = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184 rc = ngx_http_next_header_filter(r);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186 if (r != r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190 if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191 if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 ctx->start = slcf->size
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193 * (r->headers_out.content_offset / slcf->size);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 ctx->end = r->headers_out.content_offset
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 + r->headers_out.content_length_n;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199 } else {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200 ctx->end = cr.complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203 return rc;
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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208 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
209 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 ngx_int_t rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211 ngx_chain_t *cl;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212 ngx_http_request_t *sr;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
214 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
218 if (ctx == NULL || r != r->main) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
219 return ngx_http_next_body_filter(r, in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
220 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
221
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
222 for (cl = in; cl; cl = cl->next) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223 if (cl->buf->last_buf) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
224 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
225 cl->buf->last_in_chain = 1;
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
226 cl->buf->sync = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
227 ctx->last = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
228 }
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 rc = ngx_http_next_body_filter(r, in);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
232
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
233 if (rc == NGX_ERROR || !ctx->last) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
234 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
235 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
236
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
237 if (ctx->start >= ctx->end) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238 ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
239 ngx_http_send_special(r, NGX_HTTP_LAST);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
240 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
241 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
242
6321
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
243 if (r->buffered) {
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
244 return rc;
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
245 }
bc9ea464e354 Slice filter: never run subrequests when main request is buffered.
Roman Arutyunyan <arut@nginx.com>
parents: 6317
diff changeset
246
6317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
247 if (ngx_http_subrequest(r, &r->uri, &r->args, &sr, NULL, 0) != NGX_OK) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
248 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
249 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
250
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
251 ngx_http_set_ctx(sr, ctx, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
253 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
254
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
255 ctx->range.len = ngx_sprintf(ctx->range.data, "bytes=%O-%O", ctx->start,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
256 ctx->start + (off_t) slcf->size - 1)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
257 - ctx->range.data;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
258
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
259 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
260 "http slice subrequest: \"%V\"", &ctx->range);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
261
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
262 return rc;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
263 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
264
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
265
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
266 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
267 ngx_http_slice_parse_content_range(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
268 ngx_http_slice_content_range_t *cr)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
269 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
270 off_t start, end, complete_length, cutoff, cutlim;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
271 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
272 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
273
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
274 h = r->headers_out.content_range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
275
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
276 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
277 || h->value.len < 7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
278 || ngx_strncmp(h->value.data, "bytes ", 6) != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280 return NGX_ERROR;
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 p = h->value.data + 6;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
285 cutoff = NGX_MAX_OFF_T_VALUE / 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
286 cutlim = NGX_MAX_OFF_T_VALUE % 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
287
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
288 start = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
289 end = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
290 complete_length = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
291
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
292 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
293
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
294 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
296 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
297
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303 start = start * 10 + *p++ - '0';
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308 if (*p++ != '-') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
316 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319 if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
320 return NGX_ERROR;
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 end = end * 10 + *p++ - '0';
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
325
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326 end++;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
327
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
328 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
329
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
330 if (*p++ != '/') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
336 if (*p != '*') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 if (*p < '0' || *p > '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
340
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
341 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
342 if (complete_length >= cutoff
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 && (complete_length > cutoff || *p - '0' > cutlim))
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348 complete_length = complete_length * 10 + *p++ - '0';
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 } else {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352 complete_length = -1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353 p++;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
356 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
357
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
358 if (*p != '\0') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
362 cr->start = start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
363 cr->end = end;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364 cr->complete_length = complete_length;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
365
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
367 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371 ngx_http_slice_range_variable(ngx_http_request_t *r,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372 ngx_http_variable_value_t *v, uintptr_t data)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
373 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
374 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375 ngx_http_slice_ctx_t *ctx;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378 ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
379
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381 if (r != r->main || r->headers_out.status) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382 v->not_found = 1;
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 slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 if (slcf->size == 0) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389 v->not_found = 1;
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 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t));
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394 if (ctx == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
396 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398 ngx_http_set_ctx(r, ctx, ngx_http_slice_filter_module);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400 p = ngx_pnalloc(r->pool, sizeof("bytes=-") - 1 + 2 * NGX_OFF_T_LEN);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401 if (p == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
405 ctx->start = slcf->size * (ngx_http_slice_get_start(r) / slcf->size);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
406
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
407 ctx->range.data = p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start,
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409 ctx->start + (off_t) slcf->size - 1)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
410 - p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
413 v->data = ctx->range.data;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
414 v->valid = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
415 v->not_found = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
416 v->no_cacheable = 1;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
417 v->len = ctx->range.len;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419 return NGX_OK;
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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423 static off_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 ngx_http_slice_get_start(ngx_http_request_t *r)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426 off_t start, cutoff, cutlim;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 u_char *p;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428 ngx_table_elt_t *h;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
430 if (r->headers_in.if_range) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434 h = r->headers_in.range;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436 if (h == NULL
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437 || h->value.len < 7
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438 || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
440 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
441 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443 p = h->value.data + 6;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445 if (ngx_strchr(p, ',')) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
446 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
447 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
448
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
449 while (*p == ' ') { p++; }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
450
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
451 if (*p == '-') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
452 return 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
453 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
454
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
455 cutoff = NGX_MAX_OFF_T_VALUE / 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
456 cutlim = NGX_MAX_OFF_T_VALUE % 10;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
457
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
458 start = 0;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
459
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
460 while (*p >= '0' && *p <= '9') {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
461 if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
462 return 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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465 start = start * 10 + *p++ - '0';
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
468 return start;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
469 }
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 static void *
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473 ngx_http_slice_create_loc_conf(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
474 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475 ngx_http_slice_loc_conf_t *slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477 slcf = ngx_palloc(cf->pool, sizeof(ngx_http_slice_loc_conf_t));
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478 if (slcf == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 return NULL;
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 slcf->size = NGX_CONF_UNSET_SIZE;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
483
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
484 return slcf;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
485 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488 static char *
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
489 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
490 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
491 ngx_http_slice_loc_conf_t *prev = parent;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492 ngx_http_slice_loc_conf_t *conf = child;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
493
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
494 ngx_conf_merge_size_value(conf->size, prev->size, 0);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
495
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
496 return NGX_CONF_OK;
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
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
500 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
501 ngx_http_slice_add_variables(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
502 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
503 ngx_http_variable_t *var;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
504
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
505 var = ngx_http_add_variable(cf, &ngx_http_slice_range_name, 0);
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
506 if (var == NULL) {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
507 return NGX_ERROR;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
508 }
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
509
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510 var->get_handler = ngx_http_slice_range_variable;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
512 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
513 }
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 static ngx_int_t
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517 ngx_http_slice_init(ngx_conf_t *cf)
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
518 {
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
519 ngx_http_next_header_filter = ngx_http_top_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 ngx_http_top_header_filter = ngx_http_slice_header_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
521
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
522 ngx_http_next_body_filter = ngx_http_top_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
523 ngx_http_top_body_filter = ngx_http_slice_body_filter;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
524
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
525 return NGX_OK;
29f35e60840b Slice filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
526 }