|
@@ -12174,7 +12174,27 @@ alloc_get_host(struct mg_connection *conn)
|
|
|
if (pos != NULL) {
|
|
|
*pos = '\0';
|
|
|
}
|
|
|
- DEBUG_TRACE("Host: %s", host);
|
|
|
+
|
|
|
+ if (conn->ssl) {
|
|
|
+ /* This is a HTTPS connection, maybe we have a hostname
|
|
|
+ * from SNI (set in ssl_servername_callback). */
|
|
|
+ const char *sslhost = conn->dom_ctx->config[AUTHENTICATION_DOMAIN];
|
|
|
+ if (sslhost && (conn->dom_ctx != &(conn->phys_ctx->dd))) {
|
|
|
+ /* We are not using the default domain */
|
|
|
+ if (mg_strcasecmp(host, sslhost)) {
|
|
|
+ /* Mismatch between SNI domain and HTTP domain */
|
|
|
+ DEBUG_TRACE("Host mismatch: SNI: %s, HTTPS: %s",
|
|
|
+ sslhost,
|
|
|
+ host);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ DEBUG_TRACE("HTTPS Host: %s", host);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ DEBUG_TRACE("HTTP Host: %s", host);
|
|
|
+ }
|
|
|
+
|
|
|
} else {
|
|
|
sockaddr_to_string(host, hostlen, &conn->client.lsa);
|
|
|
DEBUG_TRACE("IP: %s", host);
|
|
@@ -15763,6 +15783,16 @@ get_request(struct mg_connection *conn, char *ebuf, size_t ebuf_len, int *err)
|
|
|
|
|
|
/* Is there a "host" ? */
|
|
|
conn->host = alloc_get_host(conn);
|
|
|
+ if (!host) {
|
|
|
+ mg_snprintf(conn,
|
|
|
+ NULL, /* No truncation check for ebuf */
|
|
|
+ ebuf,
|
|
|
+ ebuf_len,
|
|
|
+ "%s",
|
|
|
+ "Bad request: Host mismatch");
|
|
|
+ *err = 400;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
/* Do we know the content length? */
|
|
|
if ((cl = get_header(conn->request_info.http_headers,
|