@@ -24,6 +24,23 @@ const (
2424 stateClosed int32 = 2
2525)
2626
27+ type withoutReadDeadline interface {
28+ NeedAdditionalReadDeadline () bool
29+ }
30+
31+ func needAdditionalReadDeadline (rawReader any ) bool {
32+ if deadlineReader , loaded := rawReader .(withoutReadDeadline ); loaded {
33+ return deadlineReader .NeedAdditionalReadDeadline ()
34+ }
35+ if upstream , hasUpstream := rawReader .(N.WithUpstreamReader ); hasUpstream {
36+ return needAdditionalReadDeadline (upstream .UpstreamReader ())
37+ }
38+ if upstream , hasUpstream := rawReader .(common.WithUpstream ); hasUpstream {
39+ return needAdditionalReadDeadline (upstream .Upstream ())
40+ }
41+ return false
42+ }
43+
2744func CreatePacketPushable (reader N.PacketReader ) (N.PacketPushable , bool ) {
2845 if pushable , ok := reader .(N.PacketPushable ); ok {
2946 return pushable , true
@@ -222,6 +239,12 @@ func (r *PacketReactor) prepareStream(conn *reactorConnection, source N.PacketRe
222239}
223240
224241func (r * PacketReactor ) registerStream (stream * reactorStream ) {
242+ if needAdditionalReadDeadline (stream .source ) {
243+ r .logger .Trace ("packet stream: needs additional deadline handling, using legacy copy" )
244+ go stream .runLegacyCopy ()
245+ return
246+ }
247+
225248 if stream .pushable != nil {
226249 r .logger .Trace ("packet stream: using pushable mode" )
227250 stream .pushable .SetOnDataReady (func () {
0 commit comments