diff --git a/plugins/http/common.h b/plugins/http/common.h index 3281b059..d5052b95 100644 --- a/plugins/http/common.h +++ b/plugins/http/common.h @@ -157,7 +157,7 @@ void hr_session_ssl_close(struct corerouter_session *); ssize_t hr_ssl_read(struct corerouter_peer *); ssize_t hr_ssl_write(struct corerouter_peer *); -int hr_https_add_vars(struct http_session *, struct uwsgi_buffer *); +int hr_https_add_vars(struct http_session *, struct corerouter_peer *, struct uwsgi_buffer *); void hr_setup_ssl(struct http_session *, struct uwsgi_gateway_socket *); #endif diff --git a/plugins/http/http.c b/plugins/http/http.c index 9532166f..84be5c2e 100644 --- a/plugins/http/http.c +++ b/plugins/http/http.c @@ -334,7 +334,7 @@ int http_headers_parse(struct corerouter_peer *peer) { } #ifdef UWSGI_SSL - if (hr_https_add_vars(hr, out)) return -1; + if (hr_https_add_vars(hr, peer, out)) return -1; #endif // REMOTE_ADDR diff --git a/plugins/http/https.c b/plugins/http/https.c index 8021728f..4ea29680 100644 --- a/plugins/http/https.c +++ b/plugins/http/https.c @@ -166,10 +166,17 @@ void uwsgi_opt_http_to_https(char *opt, char *value, void *cr) { ucr->has_sockets++; } -int hr_https_add_vars(struct http_session *hr, struct uwsgi_buffer *out) { +int hr_https_add_vars(struct http_session *hr, struct corerouter_peer *peer, struct uwsgi_buffer *out) { // HTTPS (adapted from nginx) if (hr->session.ugs->mode == UWSGI_HTTP_SSL) { if (uwsgi_buffer_append_keyval(out, "HTTPS", 5, "on", 2)) return -1; +#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME + const char *servername = SSL_get_servername(hr->ssl, TLSEXT_NAMETYPE_host_name); + if (servername) { + peer->key = (char *) servername; + peer->key_len = strlen(servername); + } +#endif hr->ssl_client_cert = SSL_get_peer_certificate(hr->ssl); if (hr->ssl_client_cert) { X509_NAME *name = X509_get_subject_name(hr->ssl_client_cert);