diff --git a/cache/cache.go b/cache/cache.go index 1c665cd..6b1eb59 100644 --- a/cache/cache.go +++ b/cache/cache.go @@ -1,6 +1,9 @@ package libpack_cache import ( + "bytes" + "compress/gzip" + "io" "sync/atomic" "time" @@ -76,6 +79,28 @@ func CacheLookup(hash string) []byte { obj, found := config.Client.Get(hash) if found { atomic.AddInt64(&cacheStats.CacheHits, 1) + // If the cached data is compressed, decompress it + if len(obj) > 2 && obj[0] == 0x1f && obj[1] == 0x8b { + reader, err := gzip.NewReader(bytes.NewReader(obj)) + if err != nil { + config.Logger.Error(&libpack_logger.LogMessage{ + Message: "Failed to create gzip reader for cached data", + Pairs: map[string]interface{}{"error": err.Error(), "hash": hash}, + }) + return nil + } + defer reader.Close() + + decompressed, err := io.ReadAll(reader) + if err != nil { + config.Logger.Error(&libpack_logger.LogMessage{ + Message: "Failed to decompress cached data", + Pairs: map[string]interface{}{"error": err.Error(), "hash": hash}, + }) + return nil + } + return decompressed + } return obj } atomic.AddInt64(&cacheStats.CacheMisses, 1) diff --git a/proxy.go b/proxy.go index 3ff07ff..aa35a5d 100644 --- a/proxy.go +++ b/proxy.go @@ -1,8 +1,11 @@ package main import ( + "bytes" + "compress/gzip" "crypto/tls" "fmt" + "io" "net/url" "time" @@ -93,6 +96,30 @@ func proxyTheRequest(c *fiber.Ctx, currentEndpoint string) error { logDebugResponse(c) } + if c.Response().Header.Peek("Content-Encoding") != nil && string(c.Response().Header.Peek("Content-Encoding")) == "gzip" { + reader, err := gzip.NewReader(bytes.NewReader(c.Response().Body())) + if err != nil { + cfg.Logger.Error(&libpack_logger.LogMessage{ + Message: "Failed to create gzip reader", + Pairs: map[string]interface{}{"error": err.Error()}, + }) + return err + } + defer reader.Close() + + decompressed, err := io.ReadAll(reader) + if err != nil { + cfg.Logger.Error(&libpack_logger.LogMessage{ + Message: "Failed to decompress response", + Pairs: map[string]interface{}{"error": err.Error()}, + }) + return err + } + + c.Response().SetBody(decompressed) + c.Response().Header.Del("Content-Encoding") + } + if c.Response().StatusCode() != 200 { if ifNotInTest() { cfg.Monitoring.Increment(libpack_monitoring.MetricsFailed, nil) diff --git a/server.go b/server.go index 5b02d60..c88959c 100644 --- a/server.go +++ b/server.go @@ -189,6 +189,7 @@ func processGraphQLRequest(c *fiber.Ctx) error { }) c.Set("X-Cache-Hit", "true") wasCached = true + c.Set("Content-Type", "application/json") return c.Send(cachedResponse) }