Skip to content

Commit 74c6860

Browse files
algorandskiysukunrt
authored andcommitted
fix(libp2phttp): bound NewStream timeout (#3225)
1 parent 7059eb5 commit 74c6860

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

p2p/http/libp2phttp.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ const LegacyWellKnownProtocols = "/.well-known/libp2p"
4545
const peerMetadataLimit = 8 << 10 // 8KB
4646
const peerMetadataLRUSize = 256 // How many different peer's metadata to keep in our LRU cache
4747

48+
// defaultNewStreamTimeout is the default value for new stream establishing timeout.
49+
// It is the same value as basic_host.DefaultNegotiationTimeout
50+
var defaultNewStreamTimeout = 10 * time.Second
51+
4852
type clientPeerIDContextKey struct{}
4953
type serverPeerIDContextKey struct{}
5054

@@ -496,7 +500,16 @@ func (rt *streamRoundTripper) RoundTrip(r *http.Request) (*http.Response, error)
496500
})
497501
}
498502

499-
s, err := rt.h.NewStream(r.Context(), rt.server, ProtocolIDForMultistreamSelect)
503+
// If r.Context() timeout is greater than DefaultNewStreamTimeout
504+
// use DefaultNewStreamTimeout for new stream negotiation.
505+
newStreamCtx := r.Context()
506+
if deadline, ok := newStreamCtx.Deadline(); !ok || deadline.After(time.Now().Add(defaultNewStreamTimeout)) {
507+
var cancel context.CancelFunc
508+
newStreamCtx, cancel = context.WithTimeout(context.Background(), defaultNewStreamTimeout)
509+
defer cancel()
510+
}
511+
512+
s, err := rt.h.NewStream(newStreamCtx, rt.server, ProtocolIDForMultistreamSelect)
500513
if err != nil {
501514
return nil, err
502515
}

0 commit comments

Comments
 (0)