package router import ( "bytes" "github.com/go-gost/core/common/bufpool" "github.com/go-gost/core/logger" "github.com/go-gost/relay" ) func (h *routerHandler) handleEntrypoint(log logger.Logger) error { buf := bufpool.Get(h.md.bufferSize) defer bufpool.Put(buf) for { err := func() error { n, addr, err := h.epConn.ReadFrom(buf) if err != nil { return err } req := relay.Request{} nn, err := req.ReadFrom(bytes.NewReader(buf[:n])) if err != nil { return nil } if req.Cmd != relay.CmdAssociate { return nil } var routerID relay.TunnelID var gateway string for _, f := range req.Features { switch f.Type() { case relay.FeatureTunnel: if feature, _ := f.(*relay.TunnelFeature); feature != nil { routerID = feature.ID } case relay.FeatureAddr: if feature, _ := f.(*relay.AddrFeature); feature != nil { gateway = feature.Host } } } log.Tracef("redirect from %s to %s@%s", addr, gateway, routerID) if c := h.pool.Get(routerID, gateway); c != nil { if w := c.Writer(); w != nil { if _, werr := w.Write(buf[nn:]); werr != nil { log.Error(werr) } } } return nil }() if err != nil { return err } } }