From 460b269736681dfaf331f3e2d0fcad0cf1948eb7 Mon Sep 17 00:00:00 2001 From: nat Date: Tue, 27 May 2025 14:59:41 -0700 Subject: [PATCH] add support for Content-Encoding header --- srv/http_utils/response.hy | 37 +++++++++++++++++++++++++------------ srv/main.hy | 3 ++- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/srv/http_utils/response.hy b/srv/http_utils/response.hy index 5aa705d..8f1f49b 100644 --- a/srv/http_utils/response.hy +++ b/srv/http_utils/response.hy @@ -1,26 +1,39 @@ -(import hyrule.collections [assoc]) +(import gzip [compress :as gzip compress :as zstd]) -(defn send-code [code] +(import hyrule.collections [assoc]) +(require hyrule.control [branch]) + +(defn pack-code [code] (.encode f"HTTP/1.1 {code}\r\n" "utf-8")) -(defn send-headers [headers] +(defn pack-headers [headers] (.encode (+ (.join "\r\n" (lfor [k v] (.items headers) f"{k}: {v}")) "\r\n\r\n") "utf-8")) -(defn send-body [body] - (cond +(defn send [[code 200] [headers None] [body ""] [request-headers None]] + (when (is headers None) + (setv headers {})) + + (setv body (cond (isinstance body bytes) body (isinstance body str) (.encode body "utf-8"))) -(defn send [[code 200] [headers None] [body ""]] - (when (is headers None) - (setv headers {})) + (print request-headers) + + (when request-headers + (when (.get request-headers "Accept-Encoding") + (branch (in it (.get request-headers "Accept-Encoding")) + "zstd" (do + (setv (get headers "Content-Encoding") "gzip") + (setv body (zstd body))) + "gzip" (do + (setv (get headers "Content-Encoding") "gzip") + (setv body (gzip body)))))) (assoc headers "WHAT...-your-trans-gener..." "that is so cool...") (when (not-in "Content-Type" headers) (assoc headers "Content-Type" "text/html")) - (+ - (send-code code) - (send-headers headers) - (send-body body))) + (pack-code code) + (pack-headers headers) + body)) diff --git a/srv/main.hy b/srv/main.hy index cd610f2..d633677 100644 --- a/srv/main.hy +++ b/srv/main.hy @@ -39,7 +39,8 @@ True (get address 0))) f": {(. parsed-request (get "method"))} {(. parsed-request (get "route") (get "path"))}")) (setv response (match-request parsed-request)) - (.sendall client-socket (http.response.send #** response)) + (print (.get parsed-request "headers")) + (.sendall client-socket (http.response.send :request-headers (.get parsed-request "headers") #** response)) (except [e Exception] (.warn log (format-exc))