@@ -23,6 +23,21 @@ import (
2323// Add atomic counter for concurrent streams
2424var 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+
2641func (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