summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-08-25 01:20:34 +0200
committermetamuffin <metamuffin@disroot.org>2024-08-25 01:20:34 +0200
commite57fed3acf1bf5c1fd7a40bbfcb77ea440cfb55b (patch)
tree2f64e41273bed3b19c1f81c64cf7ea5d94ae806d
parent1063e44e625d72a78ef57eaadfcf5ce8c1678e27 (diff)
downloadgnix-e57fed3acf1bf5c1fd7a40bbfcb77ea440cfb55b.tar
gnix-e57fed3acf1bf5c1fd7a40bbfcb77ea440cfb55b.tar.bz2
gnix-e57fed3acf1bf5c1fd7a40bbfcb77ea440cfb55b.tar.zst
properly hash headers in cache
-rw-r--r--src/modules/cache.rs17
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) {