From c9949ff5941c27547841ca4743da6ba9404ced7a Mon Sep 17 00:00:00 2001 From: Jun Kurihara Date: Sat, 13 Aug 2022 04:27:00 +0900 Subject: [PATCH] rfc6265 oneliner cookie --- src/handler/utils_headers.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/handler/utils_headers.rs b/src/handler/utils_headers.rs index 1fc7b42..965cc39 100644 --- a/src/handler/utils_headers.rs +++ b/src/handler/utils_headers.rs @@ -95,6 +95,22 @@ pub(super) fn add_header_entry_overwrite_if_exist( Ok(()) } +pub(super) fn make_cookie_single_line(headers: &mut HeaderMap) -> Result<()> { + // Sometimes violates RFC6265: https://www.rfc-editor.org/rfc/rfc6265#section-5.4 + // https://stackoverflow.com/questions/4843556/in-http-specification-what-is-the-string-that-separates-cookies + let cookies = headers + .iter() + .filter(|(k, _)| **k == hyper::header::COOKIE) + .map(|(_, v)| v.to_str().unwrap_or("")) + .collect::>() + .join("; "); + if !cookies.is_empty() { + headers.remove(hyper::header::COOKIE); + headers.insert(hyper::header::COOKIE, HeaderValue::from_bytes(cookies.as_bytes())?); + } + Ok(()) +} + pub(super) fn add_forwarding_header( headers: &mut HeaderMap, client_addr: &SocketAddr, @@ -107,6 +123,8 @@ pub(super) fn add_forwarding_header( let canonical_client_addr = client_addr.to_canonical().ip().to_string(); append_header_entry_with_comma(headers, "x-forwarded-for", &canonical_client_addr)?; + make_cookie_single_line(headers)?; + /////////// As Nginx // If we receive X-Forwarded-Proto, pass it through; otherwise, pass along the // scheme used to connect to this server