Enhance SteamCache configuration and HTTP client settings
All checks were successful
Release Tag / release (push) Successful in 14s

- Added upstream server configuration to launch.json for improved connectivity.
- Increased HTTP client timeout from 60s to 120s for better handling of slow responses.
- Updated server timeouts in steamcache.go: increased ReadTimeout to 30s and WriteTimeout to 60s.
- Introduced ReadHeaderTimeout to mitigate header attacks and set MaxHeaderBytes to 1MB.
- Improved error logging in the Run method to include HTTP status codes for better debugging.
- Adjusted ServeHTTP method to handle root path and metrics endpoint correctly.
This commit is contained in:
2025-07-19 04:40:05 -05:00
parent d94b53c395
commit ae013f9a3b
2 changed files with 26 additions and 12 deletions

6
.vscode/launch.json vendored
View File

@@ -23,6 +23,8 @@
"lru", "lru",
"--log-level", "--log-level",
"debug", "debug",
"--upstream",
"http://192.168.2.5:80",
], ],
}, },
{ {
@@ -40,6 +42,8 @@
"hybrid", "hybrid",
"--log-level", "--log-level",
"debug", "debug",
"--upstream",
"http://192.168.2.5:80",
], ],
}, },
{ {
@@ -55,6 +59,8 @@
"lfu", "lfu",
"--log-level", "--log-level",
"debug", "debug",
"--upstream",
"http://192.168.2.5:80",
], ],
} }
] ]

View File

@@ -238,7 +238,7 @@ func New(address string, memorySize string, diskSize string, diskPath, upstream,
client := &http.Client{ client := &http.Client{
Transport: transport, Transport: transport,
Timeout: 60 * time.Second, Timeout: 120 * time.Second, // Increased from 60s
} }
sc := &SteamCache{ sc := &SteamCache{
@@ -251,10 +251,12 @@ func New(address string, memorySize string, diskSize string, diskPath, upstream,
diskgc: dgc, diskgc: dgc,
client: client, client: client,
server: &http.Server{ server: &http.Server{
Addr: address, Addr: address,
ReadTimeout: 5 * time.Second, ReadTimeout: 30 * time.Second, // Increased
WriteTimeout: 10 * time.Second, WriteTimeout: 60 * time.Second, // Increased
IdleTimeout: 120 * time.Second, IdleTimeout: 120 * time.Second, // Good for keep-alive
ReadHeaderTimeout: 10 * time.Second, // New, for header attacks
MaxHeaderBytes: 1 << 20, // 1MB, optional
}, },
} }
@@ -268,7 +270,8 @@ func New(address string, memorySize string, diskSize string, diskPath, upstream,
if d != nil { if d != nil {
if d.Size() > d.Capacity() { if d.Size() > d.Capacity() {
gc.LRUGC(d, uint(d.Size()-d.Capacity())) gcHandler := gc.GetGCAlgorithm(gc.GCAlgorithm(diskGC))
gcHandler(d, uint(d.Size()-d.Capacity()))
} }
} }
@@ -279,7 +282,7 @@ func (sc *SteamCache) Run() {
if sc.upstream != "" { if sc.upstream != "" {
resp, err := sc.client.Get(sc.upstream) resp, err := sc.client.Get(sc.upstream)
if err != nil || resp.StatusCode != http.StatusOK { if err != nil || resp.StatusCode != http.StatusOK {
logger.Logger.Error().Err(err).Str("upstream", sc.upstream).Msg("Failed to connect to upstream server") logger.Logger.Error().Err(err).Int("status_code", resp.StatusCode).Str("upstream", sc.upstream).Msg("Failed to connect to upstream server")
os.Exit(1) os.Exit(1)
} }
resp.Body.Close() resp.Body.Close()
@@ -312,11 +315,6 @@ func (sc *SteamCache) Shutdown() {
} }
func (sc *SteamCache) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (sc *SteamCache) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/metrics" {
promhttp.Handler().ServeHTTP(w, r)
return
}
if r.Method != http.MethodGet { if r.Method != http.MethodGet {
requestsTotal.WithLabelValues(r.Method, "405").Inc() requestsTotal.WithLabelValues(r.Method, "405").Inc()
logger.Logger.Warn().Str("method", r.Method).Msg("Only GET method is supported") logger.Logger.Warn().Str("method", r.Method).Msg("Only GET method is supported")
@@ -324,6 +322,11 @@ func (sc *SteamCache) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return return
} }
if r.URL.Path == "/" {
w.WriteHeader(http.StatusFound) // this is used by steamcache2's upstream verification at startup
return
}
if r.URL.String() == "/lancache-heartbeat" { if r.URL.String() == "/lancache-heartbeat" {
w.Header().Add("X-LanCache-Processed-By", "SteamCache2") w.Header().Add("X-LanCache-Processed-By", "SteamCache2")
w.WriteHeader(http.StatusNoContent) w.WriteHeader(http.StatusNoContent)
@@ -331,6 +334,11 @@ func (sc *SteamCache) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return return
} }
if r.URL.Path == "/metrics" {
promhttp.Handler().ServeHTTP(w, r)
return
}
if strings.HasPrefix(r.URL.String(), "/depot/") { if strings.HasPrefix(r.URL.String(), "/depot/") {
// trim the query parameters from the URL path // trim the query parameters from the URL path
// this is necessary because the cache key should not include query parameters // this is necessary because the cache key should not include query parameters