Files
x/handler/router/entrypoint.go
T
ginuerzh 95874c53f5 fix: add status field to service list/detail APIs, unify observeStats retry pattern, fix router bugs
- api: add fillServiceStatus helper and call it from getServiceList/getService
  so status field appears in service list and detail API responses
- observeStats: unify retry pattern across all 9 handlers (http, http2, masque,
  relay, router, socks4, socks5, tungo, tunnel) — buffer events on failure,
  continue to skip fresh collection, clear on success; fix event-loss bug
  where interim events were dropped during retry cycles
- handler/router: check WriteTo/Write return errors in associate.go and
  entrypoint.go; fix DelConnector and ConnectorPool.Del using RLock instead
  of Lock (write under read lock); remove unused fields t and cancel
2026-06-03 22:12:08 +08:00

65 lines
1.2 KiB
Go

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
}
}
}