annotate src/http/modules/ngx_http_flv_module.c @ 7653:8409f9df6219

SSL: client certificate validation with OCSP (ticket #1534). OCSP validation for client certificates is enabled by the "ssl_ocsp" directive. OCSP responder can be optionally specified by "ssl_ocsp_responder". When session is reused, peer chain is not available for validation. If the verified chain contains certificates from the peer chain not available at the server, validation will fail.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 22 May 2020 17:30:12 +0300
parents 99934aade555
children 7a55311b0dc3
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
1696
f5f124fbfa3b delete useless variable
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
160 if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 ngx_close_file_n " \"%s\" failed", path.data);
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 return NGX_DECLINED;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167
2444
aee735f41627 set r->root_tested for non-error_page response only
Igor Sysoev <igor@sysoev.ru>
parents: 2415
diff changeset
168 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
169
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 start = 0;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
171 len = of.size;
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
172 i = 1;
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 (r->args.len) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
176 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
177
2415
d311b7f6a403 ngx_http_arg()
Igor Sysoev <igor@sysoev.ru>
parents: 2231
diff changeset
178 start = ngx_atoof(value.data, value.len);
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 if (start == NGX_ERROR || start >= len) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 start = 0;
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
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
184 if (start) {
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
185 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
186 i = 0;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
187 }
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 log->action = "sending flv to client";
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 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
194 r->headers_out.content_length_n = len;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
195 r->headers_out.last_modified_time = of.mtime;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196
4748
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4611
diff changeset
197 if (ngx_http_set_etag(r) != NGX_OK) {
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4611
diff changeset
198 return NGX_HTTP_INTERNAL_SERVER_ERROR;
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4611
diff changeset
199 }
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4611
diff changeset
200
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 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
202 return NGX_HTTP_INTERNAL_SERVER_ERROR;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 }
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 if (i == 0) {
6973
99934aade555 Use ngx_calloc_buf() where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 4748
diff changeset
206 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
207 if (b == NULL) {
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
208 return NGX_HTTP_INTERNAL_SERVER_ERROR;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
209 }
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
211 b->pos = ngx_flv_header;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
212 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
213 b->memory = 1;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
215 out[0].buf = b;
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
216 out[0].next = &out[1];
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
217 }
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218
781
836f099aa5cb allow ranges for full flv files
Igor Sysoev <igor@sysoev.ru>
parents: 774
diff changeset
219
6973
99934aade555 Use ngx_calloc_buf() where appropriate.
Ruslan Ermilov <ru@nginx.com>
parents: 4748
diff changeset
220 b = ngx_calloc_buf(r->pool);
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 if (b == NULL) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 return NGX_HTTP_INTERNAL_SERVER_ERROR;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 if (b->file == NULL) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 return NGX_HTTP_INTERNAL_SERVER_ERROR;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229
2122
d090fa684433 allow range for partial flv response
Igor Sysoev <igor@sysoev.ru>
parents: 2087
diff changeset
230 r->allow_ranges = 1;
d090fa684433 allow range for partial flv response
Igor Sysoev <igor@sysoev.ru>
parents: 2087
diff changeset
231
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 rc = ngx_http_send_header(r);
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 return rc;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 }
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 b->file_pos = start;
1454
f497ed7682a7 open_file_cache in HTTP
Igor Sysoev <igor@sysoev.ru>
parents: 1374
diff changeset
239 b->file_last = of.size;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 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
242 b->last_buf = (r == r->main) ? 1 : 0;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 b->last_in_chain = 1;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244
1696
f5f124fbfa3b delete useless variable
Igor Sysoev <igor@sysoev.ru>
parents: 1560
diff changeset
245 b->file->fd = of.fd;
753
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 b->file->name = path;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 b->file->log = log;
2231
8564129d49b6 *) handle unaligned file part for directio
Igor Sysoev <igor@sysoev.ru>
parents: 2129
diff changeset
248 b->file->directio = of.is_directio;
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 out[1].buf = b;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 out[1].next = NULL;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252
764
761a94247118 do not send flv header for full file
Igor Sysoev <igor@sysoev.ru>
parents: 754
diff changeset
253 return ngx_http_output_filter(r, &out[i]);
753
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
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 static char *
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 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
259 {
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 ngx_http_core_loc_conf_t *clcf;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 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
263 clcf->handler = ngx_http_flv_handler;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 return NGX_CONF_OK;
af72ac9c3dbf ngx_http_flv_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 }