Mercurial > hg > ngx_http_bytes_filter_module
annotate ngx_http_bytes_filter_module.c @ 3:3e8648918913
Body filter buffers fixup, currently limited to one range only.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 03 Jul 2008 04:21:17 +0400 |
parents | 13a2fbcc8bc4 |
children | ab9f96327bb6 |
rev | line source |
---|---|
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
1 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
2 /* |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
3 * Copyright (C) Maxim Dounin |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
4 */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
5 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
6 #include <ngx_config.h> |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
7 #include <ngx_core.h> |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
8 #include <ngx_http.h> |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
9 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
10 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
11 typedef struct { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
12 ngx_flag_t enable; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
13 } ngx_http_bytes_conf_t; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
14 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
15 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
16 typedef struct { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
17 off_t start; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
18 off_t end; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
19 } ngx_http_bytes_t; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
20 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
21 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
22 typedef struct { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
23 off_t offset; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
24 ngx_array_t ranges; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
25 } ngx_http_bytes_ctx_t; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
26 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
27 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
28 static void *ngx_http_bytes_create_conf(ngx_conf_t *cf); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
29 static char *ngx_http_bytes_merge_conf(ngx_conf_t *cf, void *parent, |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
30 void *child); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
31 static ngx_int_t ngx_http_bytes_init(ngx_conf_t *cf); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
32 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
34 static ngx_command_t ngx_http_bytes_commands[] = { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
35 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
36 { ngx_string("bytes"), |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
37 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
38 ngx_conf_set_flag_slot, |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
39 NGX_HTTP_LOC_CONF_OFFSET, |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
40 offsetof(ngx_http_bytes_conf_t, enable), |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
41 NULL }, |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
42 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
43 ngx_null_command |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
44 }; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
45 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
46 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
47 static ngx_http_module_t ngx_http_bytes_module_ctx = { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
48 NULL, /* preconfiguration */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
49 ngx_http_bytes_init, /* postconfiguration */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
50 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
51 NULL, /* create main configuration */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
52 NULL, /* init main configuration */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
53 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
54 NULL, /* create server configuration */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
55 NULL, /* merge server configuration */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
56 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
57 ngx_http_bytes_create_conf, /* create location configuration */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
58 ngx_http_bytes_merge_conf /* merge location configuration */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
59 }; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
60 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
61 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
62 ngx_module_t ngx_http_bytes_filter_module = { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
63 NGX_MODULE_V1, |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
64 &ngx_http_bytes_module_ctx, /* module context */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
65 ngx_http_bytes_commands, /* module directives */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
66 NGX_HTTP_MODULE, /* module type */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
67 NULL, /* init master */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
68 NULL, /* init module */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
69 NULL, /* init process */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
70 NULL, /* init thread */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
71 NULL, /* exit thread */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
72 NULL, /* exit process */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
73 NULL, /* exit master */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
74 NGX_MODULE_V1_PADDING |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
75 }; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
76 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
77 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
78 static ngx_http_output_header_filter_pt ngx_http_next_header_filter; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
79 static ngx_http_output_body_filter_pt ngx_http_next_body_filter; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
80 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
81 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
82 static ngx_int_t |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
83 ngx_http_bytes_header_filter(ngx_http_request_t *r) |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
84 { |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
85 u_char *p, *last; |
2
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
86 off_t start, end, len; |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
87 ngx_uint_t suffix, bad; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
88 ngx_http_bytes_t *range; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
89 ngx_http_bytes_conf_t *conf; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
90 ngx_http_bytes_ctx_t *ctx; |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
91 enum { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
92 sw_start = 0, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
93 sw_first_byte_pos, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
94 sw_first_byte_pos_n, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
95 sw_last_byte_pos, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
96 sw_last_byte_pos_n, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
97 sw_done |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
98 } state = 0; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
99 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
100 conf = ngx_http_get_module_loc_conf(r, ngx_http_bytes_filter_module); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
101 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
102 if (!conf->enable || r->args.len == 0) { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
103 return ngx_http_next_header_filter(r); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
104 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
105 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
106 p = (u_char *) ngx_strnstr(r->args.data, "bytes=", r->args.len); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
107 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 if (p == NULL) { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
109 return ngx_http_next_header_filter(r); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
110 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
111 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
112 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
113 "bytes header filter: r %p", r); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
114 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
115 p += sizeof("bytes=") - 1; |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
116 last = r->args.data + r->args.len; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
117 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 /* create context */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
120 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_bytes_ctx_t)); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
121 if (ctx == NULL) { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
122 return NGX_ERROR; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
123 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
124 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
125 if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_bytes_t)) |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
126 == NGX_ERROR) |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
127 { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
128 return NGX_ERROR; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
129 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
130 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
131 /* |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
132 * bytes= contain ranges compatible with RFC 2616, "14.35.1 Byte Ranges", |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
133 * but no whitespaces permitted |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
134 */ |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
135 |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
136 bad = 0; |
2
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
137 len = 0; |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
138 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
139 while (p < last) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
140 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
141 switch (state) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
142 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
143 case sw_start: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
144 case sw_first_byte_pos: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
145 if (*p == '-') { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
146 p++; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
147 suffix = 1; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
148 state = sw_last_byte_pos; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
149 break; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
150 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
151 suffix = 0; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
152 start = 0; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
153 state = sw_first_byte_pos_n; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
154 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
155 /* fall through */ |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
156 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
157 case sw_first_byte_pos_n: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
158 if (*p == '-') { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
159 p++; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
160 state = sw_last_byte_pos; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
161 break; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
162 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
163 if (*p < '0' || *p > '9') { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
164 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
165 "bytes header filter: unexpected char '%c'" |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
166 " (expected first-byte-pos)", *p); |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
167 bad = 1; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
168 break; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
169 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
170 start = start * 10 + *p - '0'; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
171 p++; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
172 break; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
173 |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
174 case sw_last_byte_pos: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
175 if (*p == ',' || *p == '&' || *p == ';') { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
176 /* no last byte pos, assume end of file */ |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
177 end = r->headers_out.content_length_n - 1; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
178 state = sw_done; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
179 break; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
180 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
181 end = 0; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
182 state = sw_last_byte_pos_n; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
183 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
184 /* fall though */ |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
185 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
186 case sw_last_byte_pos_n: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
187 if (*p == ',' || *p == '&' || *p == ';') { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
188 state = sw_done; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
189 break; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
190 } |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
191 if (*p < '0' || *p > '9') { |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
192 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
193 "bytes header filter: unexpected char '%c'" |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
194 " (expected last-byte-pos)", *p); |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
195 bad = 1; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
196 break; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
197 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
198 end = end * 10 + *p - '0'; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
199 p++; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
200 break; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
201 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
202 case sw_done: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
203 range = ngx_array_push(&ctx->ranges); |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
204 if (range == NULL) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
205 return NGX_ERROR; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
206 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
207 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
208 if (suffix) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
209 start = r->headers_out.content_length_n - end; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
210 end = r->headers_out.content_length_n - 1; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
211 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
212 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
213 /* note: range->end isn't inclusive, while last-byte-pos is */ |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
214 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
215 range->start = start; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
216 range->end = end + 1; |
2
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
217 len += range->end - range->start; |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
218 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
219 if (*p == ',') { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
220 p++; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
221 state = sw_first_byte_pos; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
222 break; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
223 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
224 |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
225 goto done; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
226 |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
227 } |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
228 |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
229 if (bad) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
230 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
231 "bytes header filter: invalid range specification"); |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
232 return ngx_http_next_header_filter(r); |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
233 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
234 } |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
235 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
236 switch (state) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
237 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
238 case sw_last_byte_pos: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
239 end = r->headers_out.content_length_n - 1; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
240 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
241 /* fall through */ |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
242 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
243 case sw_last_byte_pos_n: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
244 range = ngx_array_push(&ctx->ranges); |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
245 if (range == NULL) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
246 return NGX_ERROR; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
247 } |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
248 |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
249 if (suffix) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
250 start = r->headers_out.content_length_n - end; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
251 end = r->headers_out.content_length_n - 1; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
252 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
253 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
254 range->start = start; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
255 range->end = end + 1; |
2
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
256 len += range->end - range->start; |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
257 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
258 break; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
259 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
260 default: |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
261 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
262 "bytes header filter: invalid range specification"); |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
263 return ngx_http_next_header_filter(r); |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
264 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
265 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
266 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
267 done: |
2
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
268 r->headers_out.content_length_n = len; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
269 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
270 ngx_http_set_ctx(r, ctx, ngx_http_bytes_filter_module); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
271 |
2
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
272 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
273 "bytes header filter: new length %O", |
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
274 r->headers_out.content_length_n); |
13a2fbcc8bc4
Change Content-Length to match total requested length.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
275 |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
276 return ngx_http_next_header_filter(r); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
277 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
278 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
279 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
280 static ngx_int_t |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
281 ngx_http_bytes_body_filter(ngx_http_request_t *r, ngx_chain_t *in) |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
282 { |
3
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
283 off_t size; |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
284 ngx_uint_t i; |
3
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
285 ngx_chain_t *cl, **ll; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
286 ngx_buf_t *buf; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
287 ngx_http_bytes_ctx_t *ctx; |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
288 ngx_http_bytes_t *range; |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
289 |
3
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
290 if (in == NULL) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
291 return ngx_http_next_body_filter(r, in); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
292 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
293 |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
294 ctx = ngx_http_get_module_ctx(r, ngx_http_bytes_filter_module); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
295 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
296 if (ctx == NULL) { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
297 return ngx_http_next_body_filter(r, in); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
298 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
299 |
3
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
300 buf = in->buf; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
301 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
302 if (ngx_buf_special(buf)) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
303 return ngx_http_next_body_filter(r, in); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
304 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
305 |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
306 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
307 "bytes body filter: r %p, in %p", r, in); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
308 |
1
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
309 range = ctx->ranges.elts; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
310 |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
311 for (i = 0; i < ctx->ranges.nelts; i++) { |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
312 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
313 "bytes body filter: %O-%O", range->start, range->end); |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
314 range++; |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
315 } |
6b995d5251ec
Implement bytes= argument parsing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
0
diff
changeset
|
316 |
3
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
317 range = ctx->ranges.elts; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
318 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
319 #if 0 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
320 /* ... temp, rewrite */ |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
321 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
322 if (ctx->ranges.nelts == 1) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
323 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
324 if (buf->in_file) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
325 buf->file_pos = range->start; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
326 buf->file_last = range->end; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
327 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
328 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
329 if (ngx_buf_in_memory(buf)) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
330 buf->pos = buf->start + (size_t) range->start; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
331 buf->last = buf->start + (size_t) range->end; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
332 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
333 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
334 return ngx_http_next_body_filter(r, in); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
335 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
336 #endif |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
337 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
338 /* ... */ |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
339 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
340 for (ll = &in, cl = in; cl; ll = &cl->next, cl = cl->next) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
341 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
342 buf = cl->buf; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
343 size = ngx_buf_size(buf); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
344 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
345 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
346 "bytes body filter: b %d", size); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
347 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
348 if (ngx_buf_special(buf)) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
349 /* pass out anyway */ |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
350 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
351 "bytes body filter: special buffer"); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
352 continue; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
353 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
354 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
355 if (range->start > ctx->offset + size) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
356 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
357 "bytes body filter: fully ignored buffer"); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
358 *ll = cl->next; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
359 buf->pos = buf->last; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
360 continue; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
361 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
362 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
363 /* XXX multiple ranges */ |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
364 /* XXX we should create new buffers/links for multiple ranges */ |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
365 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
366 if (buf->in_file) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
367 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
368 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
369 "bytes body filter: in file, %O-%O", |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
370 buf->file_pos, buf->file_last); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
371 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
372 if (range->start > ctx->offset) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
373 buf->file_pos += range->start - ctx->offset; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
374 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
375 if (range->end - ctx->offset < size) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
376 buf->file_last -= size - (range->end - ctx->offset); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
377 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
378 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
379 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
380 "bytes body filter: in file fixed, %O-%O", |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
381 buf->file_pos, buf->file_last); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
382 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
383 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
384 if (ngx_buf_in_memory(buf)) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
385 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
386 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
387 "bytes body filter: in memory, %p-%p", |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
388 buf->pos, buf->last); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
389 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
390 if (range->start > ctx->offset) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
391 buf->pos += (size_t) (range->start - ctx->offset); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
392 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
393 if (range->end - ctx->offset < size) { |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
394 buf->last -= (size_t) (size - (range->end - ctx->offset)); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
395 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
396 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
397 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
398 "bytes body filter: in memory fixed, %p-%p", |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
399 buf->pos, buf->last); |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
400 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
401 |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
402 ctx->offset += size; |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
403 } |
3e8648918913
Body filter buffers fixup, currently limited to one range only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
404 |
0
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
405 return ngx_http_next_body_filter(r, in); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
406 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
407 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
408 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
409 static void * |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
410 ngx_http_bytes_create_conf(ngx_conf_t *cf) |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
411 { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
412 ngx_http_bytes_conf_t *conf; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
413 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
414 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_bytes_conf_t)); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
415 if (conf == NULL) { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
416 return NGX_CONF_ERROR; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
417 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
418 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
419 conf->enable = NGX_CONF_UNSET; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
420 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
421 return conf; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
422 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
423 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
424 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
425 static char * |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
426 ngx_http_bytes_merge_conf(ngx_conf_t *cf, void *parent, void *child) |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
427 { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
428 ngx_http_bytes_conf_t *prev = parent; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
429 ngx_http_bytes_conf_t *conf = child; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
430 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
431 ngx_conf_merge_value(conf->enable, prev->enable, 0); |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
432 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
433 return NGX_CONF_OK; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
434 } |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
435 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
436 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
437 static ngx_int_t |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
438 ngx_http_bytes_init(ngx_conf_t *cf) |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
439 { |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
440 ngx_http_next_header_filter = ngx_http_top_header_filter; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
441 ngx_http_top_header_filter = ngx_http_bytes_header_filter; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
442 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
443 ngx_http_next_body_filter = ngx_http_top_body_filter; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
444 ngx_http_top_body_filter = ngx_http_bytes_body_filter; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
445 |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
446 return NGX_OK; |
8aec31ab4d52
Bytes filter module skeleton, currently does nothing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
447 } |