package client
import (
"time"
"github.com/libp2p/go-libp2p/core/network"
pbv2 "github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/pb"
"github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/util"
)
var (
StreamTimeout = 1 * time .Minute
AcceptTimeout = 10 * time .Second
)
func (c *Client ) handleStreamV2 (s network .Stream ) {
log .Debugf ("new relay/v2 stream from: %s" , s .Conn ().RemotePeer ())
s .SetReadDeadline (time .Now ().Add (StreamTimeout ))
rd := util .NewDelimitedReader (s , maxMessageSize )
defer rd .Close ()
writeResponse := func (status pbv2 .Status ) error {
s .SetWriteDeadline (time .Now ().Add (StreamTimeout ))
defer s .SetWriteDeadline (time .Time {})
wr := util .NewDelimitedWriter (s )
var msg pbv2 .StopMessage
msg .Type = pbv2 .StopMessage_STATUS .Enum ()
msg .Status = status .Enum ()
return wr .WriteMsg (&msg )
}
handleError := func (status pbv2 .Status ) {
log .Debugf ("protocol error: %s (%d)" , pbv2 .Status_name [int32 (status )], status )
err := writeResponse (status )
if err != nil {
s .Reset ()
log .Debugf ("error writing circuit response: %s" , err .Error())
} else {
s .Close ()
}
}
var msg pbv2 .StopMessage
err := rd .ReadMsg (&msg )
if err != nil {
handleError (pbv2 .Status_MALFORMED_MESSAGE )
return
}
s .SetReadDeadline (time .Time {})
if msg .GetType () != pbv2 .StopMessage_CONNECT {
handleError (pbv2 .Status_UNEXPECTED_MESSAGE )
return
}
src , err := util .PeerToPeerInfoV2 (msg .GetPeer ())
if err != nil {
handleError (pbv2 .Status_MALFORMED_MESSAGE )
return
}
var stat network .ConnStats
if limit := msg .GetLimit (); limit != nil {
stat .Limited = true
stat .Extra = make (map [interface {}]interface {})
stat .Extra [StatLimitDuration ] = time .Duration (limit .GetDuration ()) * time .Second
stat .Extra [StatLimitData ] = limit .GetData ()
}
log .Debugf ("incoming relay connection from: %s" , src .ID )
select {
case c .incoming <- accept {
conn : &Conn {stream : s , remote : src , stat : stat , client : c },
writeResponse : func () error {
return writeResponse (pbv2 .Status_OK )
},
}:
case <- time .After (AcceptTimeout ):
handleError (pbv2 .Status_CONNECTION_FAILED )
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .