package proxy import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" 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.Error(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 } }