mirror of
https://github.com/ipfs/kubo.git
synced 2025-09-10 09:52:20 +08:00

Let's save log.Error for things the user can take action on. Moved all our diagnostics to log.Debug. We can ideally reduce them even further.
54 lines
1.6 KiB
Go
54 lines
1.6 KiB
Go
package proxy
|
|
|
|
import (
|
|
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
|
|
ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io"
|
|
inet "github.com/jbenet/go-ipfs/p2p/net"
|
|
peer "github.com/jbenet/go-ipfs/p2p/peer"
|
|
dhtpb "github.com/jbenet/go-ipfs/routing/dht/pb"
|
|
errors "github.com/jbenet/go-ipfs/util/debugerror"
|
|
)
|
|
|
|
// RequestHandler handles routing requests locally
|
|
type RequestHandler interface {
|
|
HandleRequest(ctx context.Context, p peer.ID, m *dhtpb.Message) *dhtpb.Message
|
|
}
|
|
|
|
// Loopback forwards requests to a local handler
|
|
type Loopback struct {
|
|
Handler RequestHandler
|
|
Local peer.ID
|
|
}
|
|
|
|
// SendMessage intercepts local requests, forwarding them to a local handler
|
|
func (lb *Loopback) SendMessage(ctx context.Context, m *dhtpb.Message) error {
|
|
response := lb.Handler.HandleRequest(ctx, lb.Local, m)
|
|
if response != nil {
|
|
log.Warning("loopback handler returned unexpected message")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SendRequest intercepts local requests, forwarding them to a local handler
|
|
func (lb *Loopback) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) {
|
|
return lb.Handler.HandleRequest(ctx, lb.Local, m), nil
|
|
}
|
|
|
|
func (lb *Loopback) handleNewStream(s inet.Stream) {
|
|
defer s.Close()
|
|
pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax)
|
|
var incoming dhtpb.Message
|
|
if err := pbr.ReadMsg(&incoming); err != nil {
|
|
log.Debug(errors.Wrap(err))
|
|
return
|
|
}
|
|
ctx := context.TODO()
|
|
outgoing := lb.Handler.HandleRequest(ctx, s.Conn().RemotePeer(), &incoming)
|
|
|
|
pbw := ggio.NewDelimitedWriter(s)
|
|
|
|
if err := pbw.WriteMsg(outgoing); err != nil {
|
|
return // TODO logerr
|
|
}
|
|
}
|