annotate src/stream/ngx_stream_ssl_preread_module.c @ 7227:79eb4f7b6725

Stream ssl_preread: $ssl_preread_alpn_protocols variable. The variable keeps a comma-separated list of protocol names from ALPN TLS extension defined by RFC 7301.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 12 Mar 2018 16:03:08 +0300
parents 2a288909abc6
children 0f811890f2f0
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) {
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0,
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 "ssl preread: failed to parse handshake");
060d71292b69 Stream: ssl_preread module.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 return NGX_DECLINED;
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 }