Fix issues with headers

This commit is contained in:
Mukhtar Akere
2025-08-05 04:28:38 +01:00
parent ce972779c3
commit d0ae839617
3 changed files with 38 additions and 57 deletions

View File

@@ -6,7 +6,6 @@ import (
"fmt"
"github.com/sirrobot01/decypharr/pkg/debrid/types"
"golang.org/x/net/webdav"
"io"
"mime"
"net/http"
"os"
@@ -464,47 +463,36 @@ func (h *Handler) handleGet(w http.ResponseWriter, r *http.Request) {
return
}
if err := file.StreamResponse(w, r); err != nil {
err, ranged := file.StreamResponse(w, r)
if err != nil {
var streamErr *streamError
if errors.As(err, &streamErr) {
// Handle client disconnections silently (just debug log)
if errors.Is(streamErr.Err, context.Canceled) || errors.Is(streamErr.Err, context.DeadlineExceeded) || streamErr.IsClientDisconnection {
return // Don't log as error or try to write response
return
}
if streamErr.StatusCode > 0 && !hasHeadersWritten(w) {
if streamErr.StatusCode > 0 {
http.Error(w, streamErr.Error(), streamErr.StatusCode)
return
} else {
h.logger.Error().
Err(streamErr.Err).
Str("path", r.URL.Path).
Msg("Stream error")
}
} else {
// Generic error
if !hasHeadersWritten(w) {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
} else {
h.logger.Error().
Err(err).
Str("path", r.URL.Path).
Msg("Stream error after headers written")
}
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
} else {
if ranged {
// If the file was served as a ranged request, return a 206 status code
w.WriteHeader(http.StatusPartialContent)
} else {
w.WriteHeader(http.StatusOK)
}
}
return
}
// Fallback to ServeContent for other webdav.File implementations
if rs, ok := fRaw.(io.ReadSeeker); ok {
http.ServeContent(w, r, fi.Name(), fi.ModTime(), rs)
} else {
w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.Size()))
w.WriteHeader(http.StatusOK)
_, _ = io.Copy(w, fRaw)
}
return
}
func (h *Handler) handleHead(w http.ResponseWriter, r *http.Request) {