annotate src/stream/ngx_stream_ssl_preread_module.c @ 7230:098bbd076a2d

Upstream: trailers support, u->conf->pass_trailers flag. Basic trailer headers support allows one to access response trailers via the $upstream_trailer_* variables. Additionally, the u->conf->pass_trailers flag was introduced. When the flag is set, trailer headers from the upstream response are passed to the client. Like normal headers, trailer headers will be hidden if present in u->conf->hide_headers_hash.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 17 Mar 2018 23:04:21 +0300
parents 0f811890f2f0
children 3dfc1584ad75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_stream.h>
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12 typedef struct {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 ngx_flag_t enabled;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 } ngx_stream_ssl_preread_srv_conf_t;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 typedef struct {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 size_t left;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19 size_t size;
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
20 size_t ext;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21 u_char *pos;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 u_char *dst;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 u_char buf[4];
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 ngx_str_t host;
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
25 ngx_str_t alpn;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 ngx_log_t *log;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 ngx_pool_t *pool;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 ngx_uint_t state;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 } ngx_stream_ssl_preread_ctx_t;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 static ngx_int_t ngx_stream_ssl_preread_handler(ngx_stream_session_t *s);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 static ngx_int_t ngx_stream_ssl_preread_parse_record(
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 ngx_stream_ssl_preread_ctx_t *ctx, u_char *pos, u_char *last);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 static ngx_int_t ngx_stream_ssl_preread_server_name_variable(
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data);
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
37 static ngx_int_t ngx_stream_ssl_preread_alpn_protocols_variable(
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
38 ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data);
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 static ngx_int_t ngx_stream_ssl_preread_add_variables(ngx_conf_t *cf);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 static void *ngx_stream_ssl_preread_create_srv_conf(ngx_conf_t *cf);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 static char *ngx_stream_ssl_preread_merge_srv_conf(ngx_conf_t *cf, void *parent,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 void *child);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43 static ngx_int_t ngx_stream_ssl_preread_init(ngx_conf_t *cf);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 static ngx_command_t ngx_stream_ssl_preread_commands[] = {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 { ngx_string("ssl_preread"),
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49 NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 ngx_conf_set_flag_slot,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 NGX_STREAM_SRV_CONF_OFFSET,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 offsetof(ngx_stream_ssl_preread_srv_conf_t, enabled),
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 NULL },
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 ngx_null_command
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 };
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 static ngx_stream_module_t ngx_stream_ssl_preread_module_ctx = {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 ngx_stream_ssl_preread_add_variables, /* preconfiguration */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 ngx_stream_ssl_preread_init, /* postconfiguration */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 NULL, /* create main configuration */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 NULL, /* init main configuration */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 ngx_stream_ssl_preread_create_srv_conf, /* create server configuration */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 ngx_stream_ssl_preread_merge_srv_conf /* merge server configuration */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 };
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 ngx_module_t ngx_stream_ssl_preread_module = {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 NGX_MODULE_V1,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 &ngx_stream_ssl_preread_module_ctx, /* module context */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 ngx_stream_ssl_preread_commands, /* module directives */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 NGX_STREAM_MODULE, /* module type */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 NULL, /* init master */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 NULL, /* init module */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 NULL, /* init process */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 NULL, /* init thread */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 NULL, /* exit thread */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 NULL, /* exit process */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 NULL, /* exit master */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 NGX_MODULE_V1_PADDING
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 };
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 static ngx_stream_variable_t ngx_stream_ssl_preread_vars[] = {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 { ngx_string("ssl_preread_server_name"), NULL,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 ngx_stream_ssl_preread_server_name_variable, 0, 0, 0 },
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
92 { ngx_string("ssl_preread_alpn_protocols"), NULL,
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
93 ngx_stream_ssl_preread_alpn_protocols_variable, 0, 0, 0 },
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
94
7077
2a288909abc6 Variables: macros for null variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6849
diff changeset
95 ngx_stream_null_variable
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 };
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 static ngx_int_t
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 ngx_stream_ssl_preread_handler(ngx_stream_session_t *s)
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 u_char *last, *p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 size_t len;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104 ngx_int_t rc;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 ngx_connection_t *c;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 ngx_stream_ssl_preread_ctx_t *ctx;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 ngx_stream_ssl_preread_srv_conf_t *sscf;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 c = s->connection;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, "ssl preread handler");
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 sscf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_preread_module);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 if (!sscf->enabled) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 return NGX_DECLINED;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 if (c->type != SOCK_STREAM) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120 return NGX_DECLINED;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 if (c->buffer == NULL) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 return NGX_AGAIN;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 ctx = ngx_stream_get_module_ctx(s, ngx_stream_ssl_preread_module);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 if (ctx == NULL) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 ctx = ngx_pcalloc(c->pool, sizeof(ngx_stream_ssl_preread_ctx_t));
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 if (ctx == NULL) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 return NGX_ERROR;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 ngx_stream_set_ctx(s, ctx, ngx_stream_ssl_preread_module);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 ctx->pool = c->pool;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 ctx->log = c->log;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 ctx->pos = c->buffer->pos;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 p = ctx->pos;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 last = c->buffer->last;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 while (last - p >= 5) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 if (p[0] != 0x16) {
6696
e83540f825cd Stream ssl_preread: removed internal macro.
Vladimir Homutov <vl@nginx.com>
parents: 6695
diff changeset
147 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
e83540f825cd Stream ssl_preread: removed internal macro.
Vladimir Homutov <vl@nginx.com>
parents: 6695
diff changeset
148 "ssl preread: not a handshake");
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
149 ngx_stream_set_ctx(s, NULL, ngx_stream_ssl_preread_module);
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 return NGX_DECLINED;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152
6849
01adb18a5d23 Stream ssl_preread: relaxed SSL version check.
Roman Arutyunyan <arut@nginx.com>
parents: 6728
diff changeset
153 if (p[1] != 3) {
6696
e83540f825cd Stream ssl_preread: removed internal macro.
Vladimir Homutov <vl@nginx.com>
parents: 6695
diff changeset
154 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
e83540f825cd Stream ssl_preread: removed internal macro.
Vladimir Homutov <vl@nginx.com>
parents: 6695
diff changeset
155 "ssl preread: unsupported SSL version");
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
156 ngx_stream_set_ctx(s, NULL, ngx_stream_ssl_preread_module);
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 return NGX_DECLINED;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 len = (p[3] << 8) + p[4];
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 /* read the whole record before parsing */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 if ((size_t) (last - p) < len + 5) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 p += 5;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 rc = ngx_stream_ssl_preread_parse_record(ctx, p, p + len);
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
170
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
171 if (rc == NGX_DECLINED) {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
172 ngx_stream_set_ctx(s, NULL, ngx_stream_ssl_preread_module);
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
173 return NGX_DECLINED;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
174 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
175
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 if (rc != NGX_AGAIN) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 return rc;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 p += len;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 ctx->pos = p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 return NGX_AGAIN;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 static ngx_int_t
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 ngx_stream_ssl_preread_parse_record(ngx_stream_ssl_preread_ctx_t *ctx,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 u_char *pos, u_char *last)
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 {
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
193 size_t left, n, size, ext;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 u_char *dst, *p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 enum {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 sw_start = 0,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 sw_header, /* handshake msg_type, length */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 sw_head_tail, /* version, random */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 sw_sid_len, /* session_id length */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 sw_sid, /* session_id */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 sw_cs_len, /* cipher_suites length */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 sw_cs, /* cipher_suites */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 sw_cm_len, /* compression_methods length */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 sw_cm, /* compression_methods */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 sw_ext, /* extension */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 sw_ext_header, /* extension_type, extension_data length */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 sw_sni_len, /* SNI length */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 sw_sni_host_head, /* SNI name_type, host_name length */
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
210 sw_sni_host, /* SNI host_name */
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
211 sw_alpn_len, /* ALPN length */
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
212 sw_alpn_proto_len, /* ALPN protocol_name length */
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
213 sw_alpn_proto_data /* ALPN protocol_name */
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 } state;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 "ssl preread: state %ui left %z", ctx->state, ctx->left);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 state = ctx->state;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 size = ctx->size;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 left = ctx->left;
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
222 ext = ctx->ext;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 dst = ctx->dst;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 p = ctx->buf;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 for ( ;; ) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227 n = ngx_min((size_t) (last - pos), size);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 if (dst) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 dst = ngx_cpymem(dst, pos, n);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 pos += n;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 size -= n;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 left -= n;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 if (size != 0) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 switch (state) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 case sw_start:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 state = sw_header;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 dst = p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 size = 4;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 left = size;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 case sw_header:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 if (p[0] != 1) {
6696
e83540f825cd Stream ssl_preread: removed internal macro.
Vladimir Homutov <vl@nginx.com>
parents: 6695
diff changeset
252 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
e83540f825cd Stream ssl_preread: removed internal macro.
Vladimir Homutov <vl@nginx.com>
parents: 6695
diff changeset
253 "ssl preread: not a client hello");
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 return NGX_DECLINED;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 state = sw_head_tail;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 dst = NULL;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 size = 34;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 left = (p[1] << 16) + (p[2] << 8) + p[3];
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 case sw_head_tail:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 state = sw_sid_len;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265 dst = p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 size = 1;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 case sw_sid_len:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 state = sw_sid;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 dst = NULL;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 size = p[0];
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 case sw_sid:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 state = sw_cs_len;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 dst = p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 size = 2;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 case sw_cs_len:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 state = sw_cs;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 dst = NULL;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 size = (p[0] << 8) + p[1];
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 case sw_cs:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288 state = sw_cm_len;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 dst = p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 size = 1;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 case sw_cm_len:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 state = sw_cm;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 dst = NULL;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 size = p[0];
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 case sw_cm:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 if (left == 0) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 /* no extensions */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 return NGX_OK;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 state = sw_ext;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 dst = p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 size = 2;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 case sw_ext:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311 if (left == 0) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 return NGX_OK;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 state = sw_ext_header;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 dst = p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 size = 4;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 case sw_ext_header:
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
321 if (p[0] == 0 && p[1] == 0 && ctx->host.data == NULL) {
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 /* SNI extension */
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 state = sw_sni_len;
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
324 dst = p;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
325 size = 2;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
326 break;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
327 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
328
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
329 if (p[0] == 0 && p[1] == 16 && ctx->alpn.data == NULL) {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
330 /* ALPN extension */
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
331 state = sw_alpn_len;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
332 dst = p;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 size = 2;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 state = sw_ext;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 dst = NULL;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 size = (p[2] << 8) + p[3];
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 case sw_sni_len:
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
343 ext = (p[0] << 8) + p[1];
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 state = sw_sni_host_head;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 dst = p;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 size = 3;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 case sw_sni_host_head:
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 if (p[0] != 0) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 "ssl preread: SNI hostname type is not DNS");
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 return NGX_DECLINED;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356 size = (p[1] << 8) + p[2];
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
358 if (ext < 3 + size) {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
359 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
360 "ssl preread: SNI format error");
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
361 return NGX_DECLINED;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
362 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
363 ext -= 3 + size;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
364
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 ctx->host.data = ngx_pnalloc(ctx->pool, size);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366 if (ctx->host.data == NULL) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 return NGX_ERROR;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
370 state = sw_sni_host;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371 dst = ctx->host.data;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 break;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 case sw_sni_host:
6728
8f75d9883730 Stream ssl_preread: fixed $ssl_preread_server_name variable.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6696
diff changeset
375 ctx->host.len = (p[1] << 8) + p[2];
8f75d9883730 Stream ssl_preread: fixed $ssl_preread_server_name variable.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6696
diff changeset
376
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378 "ssl preread: SNI hostname \"%V\"", &ctx->host);
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
379
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
380 state = sw_ext;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
381 dst = NULL;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
382 size = ext;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
383 break;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
384
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
385 case sw_alpn_len:
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
386 ext = (p[0] << 8) + p[1];
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
387
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
388 ctx->alpn.data = ngx_pnalloc(ctx->pool, ext);
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
389 if (ctx->alpn.data == NULL) {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
390 return NGX_ERROR;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
391 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
392
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
393 state = sw_alpn_proto_len;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
394 dst = p;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
395 size = 1;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
396 break;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
397
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
398 case sw_alpn_proto_len:
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
399 size = p[0];
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
400
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
401 if (size == 0) {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
402 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
403 "ssl preread: ALPN empty protocol");
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
404 return NGX_DECLINED;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
405 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
406
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
407 if (ext < 1 + size) {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
408 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
409 "ssl preread: ALPN format error");
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
410 return NGX_DECLINED;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
411 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
412 ext -= 1 + size;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
413
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
414 state = sw_alpn_proto_data;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
415 dst = ctx->alpn.data + ctx->alpn.len;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
416 break;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
417
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
418 case sw_alpn_proto_data:
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
419 ctx->alpn.len += p[0];
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
420
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
421 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
422 "ssl preread: ALPN protocols \"%V\"", &ctx->alpn);
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
423
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
424 if (ext) {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
425 ctx->alpn.data[ctx->alpn.len++] = ',';
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
426
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
427 state = sw_alpn_proto_len;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
428 dst = p;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
429 size = 1;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
430 break;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
431 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
432
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
433 state = sw_ext;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
434 dst = NULL;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
435 size = 0;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
436 break;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
438
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 if (left < size) {
7228
Roman Arutyunyan <arut@nginx.com>
parents: 7227
diff changeset
440 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
Roman Arutyunyan <arut@nginx.com>
parents: 7227
diff changeset
441 "ssl preread: failed to parse handshake");
Roman Arutyunyan <arut@nginx.com>
parents: 7227
diff changeset
442 return NGX_DECLINED;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 ctx->state = state;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
447 ctx->size = size;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 ctx->left = left;
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
449 ctx->ext = ext;
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450 ctx->dst = dst;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452 return NGX_AGAIN;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 static ngx_int_t
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457 ngx_stream_ssl_preread_server_name_variable(ngx_stream_session_t *s,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458 ngx_variable_value_t *v, uintptr_t data)
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459 {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460 ngx_stream_ssl_preread_ctx_t *ctx;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 ctx = ngx_stream_get_module_ctx(s, ngx_stream_ssl_preread_module);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464 if (ctx == NULL) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 v->not_found = 1;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 return NGX_OK;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 v->valid = 1;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 v->no_cacheable = 0;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471 v->not_found = 0;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472 v->len = ctx->host.len;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 v->data = ctx->host.data;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475 return NGX_OK;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
477
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 static ngx_int_t
7227
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
480 ngx_stream_ssl_preread_alpn_protocols_variable(ngx_stream_session_t *s,
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
481 ngx_variable_value_t *v, uintptr_t data)
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
482 {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
483 ngx_stream_ssl_preread_ctx_t *ctx;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
484
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
485 ctx = ngx_stream_get_module_ctx(s, ngx_stream_ssl_preread_module);
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
486
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
487 if (ctx == NULL) {
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
488 v->not_found = 1;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
489 return NGX_OK;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
490 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
491
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
492 v->valid = 1;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
493 v->no_cacheable = 0;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
494 v->not_found = 0;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
495 v->len = ctx->alpn.len;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
496 v->data = ctx->alpn.data;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
497
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
498 return NGX_OK;
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
499 }
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
500
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
501
79eb4f7b6725 Stream ssl_preread: $ssl_preread_alpn_protocols variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7077
diff changeset
502 static ngx_int_t
6695
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503 ngx_stream_ssl_preread_add_variables(ngx_conf_t *cf)
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504 {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505 ngx_stream_variable_t *var, *v;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 for (v = ngx_stream_ssl_preread_vars; v->name.len; v++) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
508 var = ngx_stream_add_variable(cf, &v->name, v->flags);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 if (var == NULL) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510 return NGX_ERROR;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 var->get_handler = v->get_handler;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514 var->data = v->data;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517 return NGX_OK;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521 static void *
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522 ngx_stream_ssl_preread_create_srv_conf(ngx_conf_t *cf)
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 ngx_stream_ssl_preread_srv_conf_t *conf;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_ssl_preread_srv_conf_t));
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 if (conf == NULL) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 return NULL;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 conf->enabled = NGX_CONF_UNSET;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 return conf;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537 static char *
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538 ngx_stream_ssl_preread_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539 {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540 ngx_stream_ssl_preread_srv_conf_t *prev = parent;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541 ngx_stream_ssl_preread_srv_conf_t *conf = child;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 ngx_conf_merge_value(conf->enabled, prev->enabled, 0);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
544
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545 return NGX_CONF_OK;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549 static ngx_int_t
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550 ngx_stream_ssl_preread_init(ngx_conf_t *cf)
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552 ngx_stream_handler_pt *h;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553 ngx_stream_core_main_conf_t *cmcf;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557 h = ngx_array_push(&cmcf->phases[NGX_STREAM_PREREAD_PHASE].handlers);
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558 if (h == NULL) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 return NGX_ERROR;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560 }
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562 *h = ngx_stream_ssl_preread_handler;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
563
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564 return NGX_OK;
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 }