Skip to content

Commit dafb5aa

Browse files
committed
Handle client disconnections better
1 parent 28d8c5a commit dafb5aa

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

server/torr/stream.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,21 @@ import (
2323
// Add atomic counter for concurrent streams
2424
var activeStreams int32
2525

26+
type contextResponseWriter struct {
27+
http.ResponseWriter
28+
ctx context.Context
29+
}
30+
31+
func (w *contextResponseWriter) Write(p []byte) (n int, err error) {
32+
// Check context before each write
33+
select {
34+
case <-w.ctx.Done():
35+
return 0, w.ctx.Err()
36+
default:
37+
return w.ResponseWriter.Write(p)
38+
}
39+
}
40+
2641
func (t *Torrent) Stream(fileID int, req *http.Request, resp http.ResponseWriter) error {
2742
// Increment active streams counter
2843
streamID := atomic.AddInt32(&activeStreams, 1)
@@ -70,7 +85,6 @@ func (t *Torrent) Stream(fileID int, req *http.Request, resp http.ResponseWriter
7085
if reader == nil {
7186
return errors.New("cannot create torrent reader")
7287
}
73-
7488
// Ensure reader is always closed
7589
defer t.CloseReader(reader)
7690

@@ -131,8 +145,12 @@ func (t *Torrent) Stream(fileID int, req *http.Request, resp http.ResponseWriter
131145
}
132146
// Update request with new context
133147
req = req.WithContext(ctx)
134-
135-
http.ServeContent(resp, req, file.Path(), time.Unix(t.Timestamp, 0), reader)
148+
// Handle client disconnections better
149+
wrappedResp := &contextResponseWriter{
150+
ResponseWriter: resp,
151+
ctx: ctx,
152+
}
153+
http.ServeContent(wrappedResp, req, file.Path(), time.Unix(t.Timestamp, 0), reader)
136154

137155
if sets.BTsets.EnableDebug {
138156
if clerr != nil {

0 commit comments

Comments
 (0)