]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
http2: turn Host header into authority during upgrade
authorPhilippe Antoine <contact@catenacyber.fr>
Wed, 26 May 2021 18:54:01 +0000 (20:54 +0200)
committerPhilippe Antoine <contact@catenacyber.fr>
Wed, 6 Oct 2021 15:16:08 +0000 (17:16 +0200)
HTTP1 uses Host, but HTTP2 uses rather :authority cf HPACK

(cherry picked from commit 75f75e1eb09c208a42e58b2babbc55027cd79e28)

rust/src/http2/detect.rs

index da572dfbd825f0d8c7509ff42a27d6a07bd7125f..b374a1699923835b0acd6c8bb5325f8d35da05a0 100644 (file)
@@ -866,6 +866,13 @@ fn http2_tx_set_settings(state: &mut HTTP2State, input: &[u8]) {
     }
 }
 
+fn http2_caseinsensitive_cmp(s1: &[u8], s2: &str) -> bool {
+    if let Ok(s) = std::str::from_utf8(s1) {
+        return s.to_lowercase() == s2;
+    }
+    return false;
+}
+
 #[no_mangle]
 pub extern "C" fn rs_http2_tx_add_header(
     state: &mut HTTP2State, name: *const u8, name_len: u32, value: *const u8, value_len: u32,
@@ -874,6 +881,8 @@ pub extern "C" fn rs_http2_tx_add_header(
     let slice_value = build_slice!(value, value_len as usize);
     if slice_name == "HTTP2-Settings".as_bytes() {
         http2_tx_set_settings(state, slice_value)
+    } else if http2_caseinsensitive_cmp(slice_name, "host") {
+        http2_tx_set_header(state, ":authority".as_bytes(), slice_value)
     } else {
         http2_tx_set_header(state, slice_name, slice_value)
     }