github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/routing/supernode/proxy/loopback.go (about) 1 package proxy 2 3 import ( 4 ggio "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/io" 5 context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" 6 7 inet "github.com/ipfs/go-ipfs/p2p/net" 8 peer "github.com/ipfs/go-ipfs/p2p/peer" 9 dhtpb "github.com/ipfs/go-ipfs/routing/dht/pb" 10 ) 11 12 // RequestHandler handles routing requests locally 13 type RequestHandler interface { 14 HandleRequest(ctx context.Context, p peer.ID, m *dhtpb.Message) *dhtpb.Message 15 } 16 17 // Loopback forwards requests to a local handler 18 type Loopback struct { 19 Handler RequestHandler 20 Local peer.ID 21 } 22 23 func (_ *Loopback) Bootstrap(ctx context.Context) error { 24 return nil 25 } 26 27 // SendMessage intercepts local requests, forwarding them to a local handler 28 func (lb *Loopback) SendMessage(ctx context.Context, m *dhtpb.Message) error { 29 response := lb.Handler.HandleRequest(ctx, lb.Local, m) 30 if response != nil { 31 log.Warning("loopback handler returned unexpected message") 32 } 33 return nil 34 } 35 36 // SendRequest intercepts local requests, forwarding them to a local handler 37 func (lb *Loopback) SendRequest(ctx context.Context, m *dhtpb.Message) (*dhtpb.Message, error) { 38 return lb.Handler.HandleRequest(ctx, lb.Local, m), nil 39 } 40 41 func (lb *Loopback) HandleStream(s inet.Stream) { 42 defer s.Close() 43 pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) 44 var incoming dhtpb.Message 45 if err := pbr.ReadMsg(&incoming); err != nil { 46 log.Debug(err) 47 return 48 } 49 ctx := context.TODO() 50 outgoing := lb.Handler.HandleRequest(ctx, s.Conn().RemotePeer(), &incoming) 51 52 pbw := ggio.NewDelimitedWriter(s) 53 54 if err := pbw.WriteMsg(outgoing); err != nil { 55 return // TODO logerr 56 } 57 }