Stream: SSL-related variables.

This commit is contained in:
Vladimir Homutov 2016-06-29 12:52:52 +03:00
parent cb635b7879
commit 9721eae1f1

View File

@ -10,10 +10,20 @@
#include <ngx_stream.h> #include <ngx_stream.h>
typedef ngx_int_t (*ngx_ssl_variable_handler_pt)(ngx_connection_t *c,
ngx_pool_t *pool, ngx_str_t *s);
#define NGX_DEFAULT_CIPHERS "HIGH:!aNULL:!MD5" #define NGX_DEFAULT_CIPHERS "HIGH:!aNULL:!MD5"
#define NGX_DEFAULT_ECDH_CURVE "auto" #define NGX_DEFAULT_ECDH_CURVE "auto"
static ngx_int_t ngx_stream_ssl_static_variable(ngx_stream_session_t *s,
ngx_stream_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_stream_ssl_variable(ngx_stream_session_t *s,
ngx_stream_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_stream_ssl_add_variables(ngx_conf_t *cf);
static void *ngx_stream_ssl_create_conf(ngx_conf_t *cf); static void *ngx_stream_ssl_create_conf(ngx_conf_t *cf);
static char *ngx_stream_ssl_merge_conf(ngx_conf_t *cf, void *parent, static char *ngx_stream_ssl_merge_conf(ngx_conf_t *cf, void *parent,
void *child); void *child);
@ -132,7 +142,7 @@ static ngx_command_t ngx_stream_ssl_commands[] = {
static ngx_stream_module_t ngx_stream_ssl_module_ctx = { static ngx_stream_module_t ngx_stream_ssl_module_ctx = {
NULL, /* preconfiguration */ ngx_stream_ssl_add_variables, /* preconfiguration */
NULL, /* postconfiguration */ NULL, /* postconfiguration */
NULL, /* create main configuration */ NULL, /* create main configuration */
@ -159,9 +169,112 @@ ngx_module_t ngx_stream_ssl_module = {
}; };
static ngx_stream_variable_t ngx_stream_ssl_vars[] = {
{ ngx_string("ssl_protocol"), NULL, ngx_stream_ssl_static_variable,
(uintptr_t) ngx_ssl_get_protocol, NGX_STREAM_VAR_CHANGEABLE, 0 },
{ ngx_string("ssl_cipher"), NULL, ngx_stream_ssl_static_variable,
(uintptr_t) ngx_ssl_get_cipher_name, NGX_STREAM_VAR_CHANGEABLE, 0 },
{ ngx_string("ssl_session_id"), NULL, ngx_stream_ssl_variable,
(uintptr_t) ngx_ssl_get_session_id, NGX_STREAM_VAR_CHANGEABLE, 0 },
{ ngx_string("ssl_session_reused"), NULL, ngx_stream_ssl_variable,
(uintptr_t) ngx_ssl_get_session_reused, NGX_STREAM_VAR_CHANGEABLE, 0 },
{ ngx_string("ssl_server_name"), NULL, ngx_stream_ssl_variable,
(uintptr_t) ngx_ssl_get_server_name, NGX_STREAM_VAR_CHANGEABLE, 0 },
{ ngx_null_string, NULL, NULL, 0, 0, 0 }
};
static ngx_str_t ngx_stream_ssl_sess_id_ctx = ngx_string("STREAM"); static ngx_str_t ngx_stream_ssl_sess_id_ctx = ngx_string("STREAM");
static ngx_int_t
ngx_stream_ssl_static_variable(ngx_stream_session_t *s,
ngx_stream_variable_value_t *v, uintptr_t data)
{
ngx_ssl_variable_handler_pt handler = (ngx_ssl_variable_handler_pt) data;
size_t len;
ngx_str_t str;
if (s->connection->ssl) {
(void) handler(s->connection, NULL, &str);
v->data = str.data;
for (len = 0; v->data[len]; len++) { /* void */ }
v->len = len;
v->valid = 1;
v->no_cacheable = 0;
v->not_found = 0;
return NGX_OK;
}
v->not_found = 1;
return NGX_OK;
}
static ngx_int_t
ngx_stream_ssl_variable(ngx_stream_session_t *s,
ngx_stream_variable_value_t *v, uintptr_t data)
{
ngx_ssl_variable_handler_pt handler = (ngx_ssl_variable_handler_pt) data;
ngx_str_t str;
if (s->connection->ssl) {
if (handler(s->connection, s->connection->pool, &str) != NGX_OK) {
return NGX_ERROR;
}
v->len = str.len;
v->data = str.data;
if (v->len) {
v->valid = 1;
v->no_cacheable = 0;
v->not_found = 0;
return NGX_OK;
}
}
v->not_found = 1;
return NGX_OK;
}
static ngx_int_t
ngx_stream_ssl_add_variables(ngx_conf_t *cf)
{
ngx_stream_variable_t *var, *v;
for (v = ngx_stream_ssl_vars; v->name.len; v++) {
var = ngx_stream_add_variable(cf, &v->name, v->flags);
if (var == NULL) {
return NGX_ERROR;
}
var->get_handler = v->get_handler;
var->data = v->data;
}
return NGX_OK;
}
static void * static void *
ngx_stream_ssl_create_conf(ngx_conf_t *cf) ngx_stream_ssl_create_conf(ngx_conf_t *cf)
{ {