annotate src/http/modules/ngx_http_flv_module.c @ 8124:f5515e727656

Fixed "zero size buf" alerts with subrequests. Since 4611:2b6cb7528409 responses from the gzip static, flv, and mp4 modules can be used with subrequests, though empty files were not properly handled. Empty gzipped, flv, and mp4 files thus resulted in "zero size buf in output" alerts. While valid corresponding files are not expected to be empty, such files shouldn't result in alerts. Fix is to set b->sync on such empty subrequest responses, similarly to what ngx_http_send_special() does. Additionally, the static module, the ngx_http_send_response() function, and file cache are modified to do the same instead of not sending the response body at all in such cases, since not sending the response body at all is believed to be at least questionable, and might break various filters which do not expect such behaviour.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 28 Jan 2023 05:23:33 +0300
parents 1c3b78d7cdc9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4297
diff changeset
4 * Copyright (C) Nginx, Inc.
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 static char *ngx_http_flv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 static ngx_command_t ngx_http_flv_commands[] = {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 { ngx_string("flv"),
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 ngx_http_flv,
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 0,
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 0,
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 NULL },
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 ngx_null_command
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 };
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
4297
2f8e9469b436 Fixed flv header to match specification.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3527
diff changeset
27 static u_char ngx_flv_header[] = "FLV\x1\x5\0\0\0\x9\0\0\0\0";
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 static ngx_http_module_t ngx_http_flv_module_ctx = {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 NULL, /* preconfiguration */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 NULL, /* postconfiguration */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 NULL, /* create main configuration */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 NULL, /* init main configuration */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 NULL, /* create server configuration */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 NULL, /* merge server configuration */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 NULL, /* create location configuration */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 NULL /* merge location configuration */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 };
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 ngx_module_t ngx_http_flv_module = {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 NGX_MODULE_V1,
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 &ngx_http_flv_module_ctx, /* module context */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 ngx_http_flv_commands, /* module directives */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 NGX_HTTP_MODULE, /* module type */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 NULL, /* init master */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 NULL, /* init module */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 NULL, /* init process */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 NULL, /* init thread */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 NULL, /* exit thread */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 NULL, /* exit process */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 NULL, /* exit master */
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 NGX_MODULE_V1_PADDING
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 };
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 static ngx_int_t
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 ngx_http_flv_handler(ngx_http_request_t *r)
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 {
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
64 u_char *last;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 off_t start, len;
774
589841f06b87 previous commit broke two modules
Igor Sysoev <igor@sysoev.ru>
parents: 764
diff changeset
66 size_t root;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 ngx_int_t rc;
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
68 ngx_uint_t level, i;
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
69 ngx_str_t path, value;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 ngx_log_t *log;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 ngx_buf_t *b;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 ngx_chain_t out[2];
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
73 ngx_open_file_info_t of;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 ngx_http_core_loc_conf_t *clcf;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 return NGX_HTTP_NOT_ALLOWED;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 if (r->uri.data[r->uri.len - 1] == '/') {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 return NGX_DECLINED;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1048
diff changeset
84 rc = ngx_http_discard_request_body(r);
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
1374
aabbf66b61ea omit unnecessary conditions
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
86 if (rc != NGX_OK) {
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 return rc;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
90 last = ngx_http_map_uri_to_path(r, &path, &root, 0);
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
91 if (last == NULL) {
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 return NGX_HTTP_INTERNAL_SERVER_ERROR;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 log = r->connection->log;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
97 path.len = last - path.data;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
99 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
100 "http flv filename: \"%V\"", &path);
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
101
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
102 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103
2068
75a8d34459c5 ngx_memzero() ngx_open_file_info_t
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
104 ngx_memzero(&of, sizeof(ngx_open_file_info_t));
75a8d34459c5 ngx_memzero() ngx_open_file_info_t
Igor Sysoev <igor@sysoev.ru>
parents: 2063
diff changeset
105
3178
975f0558aab3 read_ahead
Igor Sysoev <igor@sysoev.ru>
parents: 2756
diff changeset
106 of.read_ahead = clcf->read_ahead;
2129
25add486e7aa directio
Igor Sysoev <igor@sysoev.ru>
parents: 2122
diff changeset
107 of.directio = clcf->directio;
1767
c42431762903 open_file_cache_retest > open_file_cache_valid
Igor Sysoev <igor@sysoev.ru>
parents: 1696
diff changeset
108 of.valid = clcf->open_file_cache_valid;
1772
25c93614e6b9 open_file_cache_min_uses
Igor Sysoev <igor@sysoev.ru>
parents: 1767
diff changeset
109 of.min_uses = clcf->open_file_cache_min_uses;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
110 of.errors = clcf->open_file_cache_errors;
1457
223e92651ca5 open_file_cache_events
Igor Sysoev <igor@sysoev.ru>
parents: 1454
diff changeset
111 of.events = clcf->open_file_cache_events;
4494
13e09cf11d4e Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents: 4478
diff changeset
112
13e09cf11d4e Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents: 4478
diff changeset
113 if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {
13e09cf11d4e Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents: 4478
diff changeset
114 return NGX_HTTP_INTERNAL_SERVER_ERROR;
13e09cf11d4e Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents: 4478
diff changeset
115 }
1560
25ee6eee7573 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 1553
diff changeset
116
1799
0b5b94805d26 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
117 if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)
0b5b94805d26 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
118 != NGX_OK)
0b5b94805d26 optimization
Igor Sysoev <igor@sysoev.ru>
parents: 1772
diff changeset
119 {
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
120 switch (of.err) {
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
121
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
122 case 0:
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
123 return NGX_HTTP_INTERNAL_SERVER_ERROR;
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
124
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
125 case NGX_ENOENT:
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
126 case NGX_ENOTDIR:
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
127 case NGX_ENAMETOOLONG:
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
128
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 level = NGX_LOG_ERR;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 rc = NGX_HTTP_NOT_FOUND;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
131 break;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
133 case NGX_EACCES:
4478
08713bac87fc Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
134 #if (NGX_HAVE_OPENAT)
08713bac87fc Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
135 case NGX_EMLINK:
08713bac87fc Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
136 case NGX_ELOOP:
08713bac87fc Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
137 #endif
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
138
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 level = NGX_LOG_ERR;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 rc = NGX_HTTP_FORBIDDEN;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
141 break;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
143 default:
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
144
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 level = NGX_LOG_CRIT;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
147 break;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
151 ngx_log_error(level, log, of.err,
2756
09cab3f8d92e *) of.test_only to not open file if only stat() is enough
Igor Sysoev <igor@sysoev.ru>
parents: 2721
diff changeset
152 "%s \"%s\" failed", of.failed, path.data);
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 return rc;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
158 if (!of.is_file) {
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 return NGX_DECLINED;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161
2444
aee735f41627 set r->root_tested for non-error_page response only
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
162 r->root_tested = !r->error_page;
2087
c8039b26a949 always test root existence for access_log with variables
Igor Sysoev <igor@sysoev.ru>
parents: 2086
diff changeset
163
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 start = 0;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
165 len = of.size;
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
166 i = 1;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 if (r->args.len) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
170 if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) {
2086
22d36702c654 allow several values in query string
Igor Sysoev <igor@sysoev.ru>
parents: 2068
diff changeset
171
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
172 start = ngx_atoof(value.data, value.len);
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 if (start == NGX_ERROR || start >= len) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 start = 0;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
178 if (start) {
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
179 len = sizeof(ngx_flv_header) - 1 + len - start;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
180 i = 0;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
181 }
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 log->action = "sending flv to client";
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 r->headers_out.status = NGX_HTTP_OK;
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
188 r->headers_out.content_length_n = len;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
189 r->headers_out.last_modified_time = of.mtime;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
4748
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4611
diff changeset
191 if (ngx_http_set_etag(r) != NGX_OK) {
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4611
diff changeset
192 return NGX_HTTP_INTERNAL_SERVER_ERROR;
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4611
diff changeset
193 }
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4611
diff changeset
194
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 if (ngx_http_set_content_type(r) != NGX_OK) {
754
4ac89c5aa10d style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 753
diff changeset
196 return NGX_HTTP_INTERNAL_SERVER_ERROR;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
199 if (i == 0) {
6973
99934aade555 Use ngx_calloc_buf() where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 4748
diff changeset
200 b = ngx_calloc_buf(r->pool);
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
201 if (b == NULL) {
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
202 return NGX_HTTP_INTERNAL_SERVER_ERROR;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
203 }
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
205 b->pos = ngx_flv_header;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
206 b->last = ngx_flv_header + sizeof(ngx_flv_header) - 1;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
207 b->memory = 1;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
209 out[0].buf = b;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
210 out[0].next = &out[1];
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
211 }
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212
781
836f099aa5cb allow ranges for full flv files
Igor Sysoev <igor@sysoev.ru>
parents: 774
diff changeset
213
6973
99934aade555 Use ngx_calloc_buf() where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 4748
diff changeset
214 b = ngx_calloc_buf(r->pool);
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 if (b == NULL) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 return NGX_HTTP_INTERNAL_SERVER_ERROR;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 if (b->file == NULL) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 return NGX_HTTP_INTERNAL_SERVER_ERROR;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223
2122
d090fa684433 allow range for partial flv response
Igor Sysoev <igor@sysoev.ru>
parents: 2087
diff changeset
224 r->allow_ranges = 1;
d090fa684433 allow range for partial flv response
Igor Sysoev <igor@sysoev.ru>
parents: 2087
diff changeset
225
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 rc = ngx_http_send_header(r);
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 return rc;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 b->file_pos = start;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
233 b->file_last = of.size;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234
8123
Maxim Dounin <mdounin@mdounin.ru>
parents: 7754
diff changeset
235 b->in_file = b->file_last ? 1 : 0;
4611
2b6cb7528409 Allows particular modules to handle subrequests properly.
Andrey Belov <defan@nginx.com>
parents: 4494
diff changeset
236 b->last_buf = (r == r->main) ? 1 : 0;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 b->last_in_chain = 1;
8124
f5515e727656 Fixed "zero size buf" alerts with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 8123
diff changeset
238 b->sync = (b->last_buf || b->in_file) ? 0 : 1;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239
1696
f5f124fbfa3b delete useless variable
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
240 b->file->fd = of.fd;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 b->file->name = path;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 b->file->log = log;
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
243 b->file->directio = of.is_directio;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 out[1].buf = b;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 out[1].next = NULL;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
248 return ngx_http_output_filter(r, &out[i]);
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 static char *
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 ngx_http_flv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 ngx_http_core_loc_conf_t *clcf;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 clcf->handler = ngx_http_flv_handler;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 return NGX_CONF_OK;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 }