]> 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)
committerVictor Julien <victor@inliniac.net>
Fri, 3 Sep 2021 08:37:00 +0000 (10:37 +0200)
HTTP1 uses Host, but HTTP2 uses rather :authority cf HPACK

rust/src/http2/detect.rs

index 18c9fc082531dc631470e175dc3be4e975b03634..c4b8b1c49048be2418303a69f079c0188252e4da 100644 (file)
@@ -854,6 +854,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 unsafe extern "C" fn rs_http2_tx_add_header(
     state: &mut HTTP2State, name: *const u8, name_len: u32, value: *const u8, value_len: u32,
@@ -862,6 +869,8 @@ pub unsafe 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)
     }