more features

This commit is contained in:
Para Dox
2025-05-29 01:22:10 +07:00
parent 3b43c15074
commit c08a43eb02

View File

@@ -1318,7 +1318,6 @@ func handleRequest(w http.ResponseWriter, r *http.Request, backends []Backend, c
backend string backend string
resp *http.Response resp *http.Response
err error err error
body []byte
}, len(backends)) }, len(backends))
// Track if we've already sent a response // Track if we've already sent a response
@@ -1417,18 +1416,6 @@ func handleRequest(w http.ResponseWriter, r *http.Request, backends []Backend, c
} }
} }
// Read response body
respBody, err := io.ReadAll(resp.Body)
if err != nil {
statsChan <- ResponseStats{
Backend: b.Name,
Duration: reqDuration, // Keep backend-specific duration
Error: err,
Method: method,
}
return
}
statsChan <- ResponseStats{ statsChan <- ResponseStats{
Backend: b.Name, Backend: b.Name,
StatusCode: resp.StatusCode, StatusCode: resp.StatusCode,
@@ -1442,8 +1429,10 @@ func handleRequest(w http.ResponseWriter, r *http.Request, backends []Backend, c
backend string backend string
resp *http.Response resp *http.Response
err error err error
body []byte }{b.Name, resp, nil}
}{b.Name, resp, nil, respBody} } else {
// Not the winning response, need to drain and close the body
io.Copy(io.Discard, resp.Body)
} }
}(backend) }(backend)
} }
@@ -1453,7 +1442,6 @@ func handleRequest(w http.ResponseWriter, r *http.Request, backends []Backend, c
backend string backend string
resp *http.Response resp *http.Response
err error err error
body []byte
} }
var responseReceivedTime time.Time var responseReceivedTime time.Time
@@ -1486,6 +1474,8 @@ func handleRequest(w http.ResponseWriter, r *http.Request, backends []Backend, c
// Send the response to the client // Send the response to the client
if response.err == nil && response.resp != nil { if response.err == nil && response.resp != nil {
defer response.resp.Body.Close()
// Copy response headers // Copy response headers
for name, values := range response.resp.Header { for name, values := range response.resp.Header {
for _, value := range values { for _, value := range values {
@@ -1493,7 +1483,12 @@ func handleRequest(w http.ResponseWriter, r *http.Request, backends []Backend, c
} }
} }
w.WriteHeader(response.resp.StatusCode) w.WriteHeader(response.resp.StatusCode)
w.Write(response.body)
// Stream the response body to the client
_, streamErr := io.Copy(w, response.resp.Body)
if streamErr != nil && enableDetailedLogs {
log.Printf("Error streaming response body: %v", streamErr)
}
} else { } else {
// No valid response received from any backend // No valid response received from any backend
http.Error(w, "All backends failed", http.StatusBadGateway) http.Error(w, "All backends failed", http.StatusBadGateway)