mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-30 09:59:13 +08:00
respect don contexteone
This commit is contained in:
@ -50,32 +50,44 @@ func (d *Dialer) Dial(ctx context.Context, raddr ma.Multiaddr, remote peer.ID) (
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var connOut Conn
|
||||||
|
var errOut error
|
||||||
|
done := make(chan struct{})
|
||||||
|
|
||||||
|
// do it async to ensure we respect don contexteone
|
||||||
|
go func() {
|
||||||
|
defer func() { done <- struct{}{} }()
|
||||||
|
|
||||||
|
c, err := newSingleConn(ctx, d.LocalPeer, remote, maconn)
|
||||||
|
if err != nil {
|
||||||
|
errOut = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.PrivateKey == nil {
|
||||||
|
log.Warning("dialer %s dialing INSECURELY %s at %s!", d, remote, raddr)
|
||||||
|
connOut = c
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c2, err := newSecureConn(ctx, d.PrivateKey, c)
|
||||||
|
if err != nil {
|
||||||
|
errOut = err
|
||||||
|
c.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
connOut = c2
|
||||||
|
}()
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
maconn.Close()
|
maconn.Close()
|
||||||
return nil, ctx.Err()
|
return nil, ctx.Err()
|
||||||
default:
|
case <-done:
|
||||||
|
// whew, finished.
|
||||||
}
|
}
|
||||||
|
|
||||||
c, err := newSingleConn(ctx, d.LocalPeer, remote, maconn)
|
return connOut, errOut
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.PrivateKey == nil {
|
|
||||||
log.Warning("dialer %s dialing INSECURELY %s at %s!", d, remote, raddr)
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
c.Close()
|
|
||||||
return nil, ctx.Err()
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
// return c, nil
|
|
||||||
return newSecureConn(ctx, d.PrivateKey, c)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MultiaddrProtocolsMatch returns whether two multiaddrs match in protocol stacks.
|
// MultiaddrProtocolsMatch returns whether two multiaddrs match in protocol stacks.
|
||||||
|
14
net/net.go
14
net/net.go
@ -148,7 +148,19 @@ func (n *network) DialPeer(ctx context.Context, p peer.ID) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// identify the connection before returning.
|
// identify the connection before returning.
|
||||||
n.ids.IdentifyConn((*conn_)(sc))
|
done := make(chan struct{})
|
||||||
|
go func() {
|
||||||
|
n.ids.IdentifyConn((*conn_)(sc))
|
||||||
|
close(done)
|
||||||
|
}()
|
||||||
|
|
||||||
|
// respect don contexteone
|
||||||
|
select {
|
||||||
|
case <-done:
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
log.Debugf("network for %s finished dialing %s", n.local, p)
|
log.Debugf("network for %s finished dialing %s", n.local, p)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) {
|
|||||||
// receive msg
|
// receive msg
|
||||||
pmes := new(pb.Message)
|
pmes := new(pb.Message)
|
||||||
if err := r.ReadMsg(pmes); err != nil {
|
if err := r.ReadMsg(pmes); err != nil {
|
||||||
log.Error("Error unmarshaling data")
|
log.Errorf("Error unmarshaling data: %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,7 +265,8 @@ func TestBootstrap(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
t.Logf("bootstrapping them so they find each other", nDHTs)
|
t.Logf("bootstrapping them so they find each other", nDHTs)
|
||||||
bootstrap(t, ctx, dhts)
|
ctxT, _ := context.WithTimeout(ctx, 5*time.Second)
|
||||||
|
bootstrap(t, ctxT, dhts)
|
||||||
|
|
||||||
// the routing tables should be full now. let's inspect them.
|
// the routing tables should be full now. let's inspect them.
|
||||||
t.Logf("checking routing table of %d", nDHTs)
|
t.Logf("checking routing table of %d", nDHTs)
|
||||||
|
@ -73,7 +73,7 @@ func TestGetFailures(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// This one should fail with NotFound
|
// This one should fail with NotFound
|
||||||
ctx2, _ := context.WithTimeout(context.Background(), time.Second)
|
ctx2, _ := context.WithTimeout(context.Background(), 3*time.Second)
|
||||||
_, err = d.GetValue(ctx2, u.Key("test"))
|
_, err = d.GetValue(ctx2, u.Key("test"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err != routing.ErrNotFound {
|
if err != routing.ErrNotFound {
|
||||||
|
Reference in New Issue
Block a user