// Collect log & stats information
client_tcp_reused = !(ua_txn->is_first_transaction());
SSLNetVConnection *ssl_vc = dynamic_cast<SSLNetVConnection *>(netvc);
+
+ is_internal = netvc->get_is_internal_request();
+
if (ssl_vc != nullptr) {
client_connection_is_ssl = true;
client_ssl_reused = ssl_vc->getSSLSessionCacheHit();
case PARSE_RESULT_DONE:
SMDebug("http", "[%" PRId64 "] done parsing client request header", sm_id);
+ if (!is_internal) {
+ auto scheme = t_state.hdr_info.client_request.url_get()->scheme_get_wksidx();
+ if ((client_connection_is_ssl && (scheme == URL_WKSIDX_HTTP || scheme == URL_WKSIDX_WS)) ||
+ (!client_connection_is_ssl && (scheme == URL_WKSIDX_HTTPS || scheme == URL_WKSIDX_WSS))) {
+ SMDebug("http", "scheme [%s] vs. protocol [%s] mismatch", hdrtoken_index_to_wks(scheme),
+ client_connection_is_ssl ? "tls" : "plaintext");
+ t_state.http_return_code = HTTP_STATUS_BAD_REQUEST;
+ call_transact_and_set_next_state(HttpTransact::BadRequest);
+ break;
+ }
+ }
ua_txn->set_session_active();
if (t_state.hdr_info.client_request.version_get() == HTTPVersion(1, 1) &&
int64_t pushed_response_body_bytes = 0;
bool client_tcp_reused = false;
// Info about client's SSL connection.
+ bool is_internal = false;
bool client_ssl_reused = false;
bool client_connection_is_ssl = false;
const char *client_protocol = "-";