diff options
author | metamuffin <metamuffin@disroot.org> | 2024-08-25 01:20:34 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-08-25 01:20:34 +0200 |
commit | e57fed3acf1bf5c1fd7a40bbfcb77ea440cfb55b (patch) | |
tree | 2f64e41273bed3b19c1f81c64cf7ea5d94ae806d | |
parent | 1063e44e625d72a78ef57eaadfcf5ce8c1678e27 (diff) | |
download | gnix-e57fed3acf1bf5c1fd7a40bbfcb77ea440cfb55b.tar gnix-e57fed3acf1bf5c1fd7a40bbfcb77ea440cfb55b.tar.bz2 gnix-e57fed3acf1bf5c1fd7a40bbfcb77ea440cfb55b.tar.zst |
properly hash headers in cache
-rw-r--r-- | src/modules/cache.rs | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/modules/cache.rs b/src/modules/cache.rs index 03dc1be..b07bbbb 100644 --- a/src/modules/cache.rs +++ b/src/modules/cache.rs @@ -52,13 +52,28 @@ impl Node for Cache { request: NodeRequest, ) -> Pin<Box<dyn Future<Output = Result<NodeResponse, ServiceError>> + Send + Sync + 'a>> { Box::pin(async move { - // totally wrong... + // not very fast let mut hasher = Sha256::new(); + hasher.update(request.method().as_str().len().to_be_bytes()); hasher.update(request.method().as_str()); + hasher.update(request.uri().path().len().to_be_bytes()); hasher.update(request.uri().path()); + hasher.update(if request.uri().query().is_some() { + [1] + } else { + [0] + }); if let Some(q) = request.uri().query() { + hasher.update(q.len().to_be_bytes()); hasher.update(q); } + hasher.update(request.headers().len().to_be_bytes()); + for (k, v) in request.headers() { + hasher.update(k.as_str().len().to_be_bytes()); + hasher.update(v.as_bytes().len().to_be_bytes()); + hasher.update(k); + hasher.update(v); + } let key: [u8; 32] = hasher.finalize().try_into().unwrap(); if let Some(resp) = self.entries.read().await.get(&key) { |