diff --git a/lib/bouncer/frontends/v0/accept.go b/lib/bouncer/frontends/v0/accept.go
index c33638921f8c3e4d636cfa8389b71bb884f82214..5c5a3031337332c2f2b7ebfa775dbdd6475d55f9 100644
--- a/lib/bouncer/frontends/v0/accept.go
+++ b/lib/bouncer/frontends/v0/accept.go
@@ -90,7 +90,7 @@ func startup0(
}
ikey := strutil.MakeCIString(key)
- if ctx.Conn.InitialParameters == nil {
+ if ctx.Conn.InitialParameters() == nil {
values := make(map[strutil.CIString]string)
ctx.Conn.SetInitialParameters(values)
}
@@ -118,7 +118,7 @@ func startup0(
unsupportedOptions = append(unsupportedOptions, parameter.Key)
} else {
ikey := strutil.MakeCIString(parameter.Key)
- if ctx.Conn.InitialParameters == nil {
+ if ctx.Conn.InitialParameters() == nil {
values := make(map[strutil.CIString]string)
ctx.Conn.SetInitialParameters(values)
}
diff --git a/lib/fed/conn.go b/lib/fed/conn.go
index fba3920fe684fb23ed5a5eaad69526d6bbf3602c..9733d3565b12c9374476f19489060371d6f5fdce 100644
--- a/lib/fed/conn.go
+++ b/lib/fed/conn.go
@@ -49,7 +49,8 @@ func (c *conn) SetInitialParameters(i map[strutil.CIString]string) { c.initialPa
func NewConn(rw net.Conn) Conn {
c := &conn{
- NetConn: rw,
+ NetConn: rw,
+ initialParameters: map[strutil.CIString]string{},
}
c.encoder.Reset(rw)
c.decoder.Reset(rw)
diff --git a/lib/gat/glisten.go b/lib/gat/glisten.go
index 54e6e0692f60cf58934661a024d743304eb74387..fad56a64f9e82577642d4be972c1de2c02b2115e 100644
--- a/lib/gat/glisten.go
+++ b/lib/gat/glisten.go
@@ -11,6 +11,7 @@ import (
"time"
"github.com/caddyserver/caddy/v2"
+ "github.com/panjf2000/gnet/v2"
"go.uber.org/zap"
"gfx.cafe/gfx/pggat/lib/gfed"
@@ -74,7 +75,8 @@ func (T *GListener) Provision(ctx caddy.Context) error {
T.ssl = val.(SSLServer)
}
- return nil
+ T.server = &gfed.Server{}
+ return T.server.Provision(ctx)
}
func (T *GListener) Start() error {
@@ -85,7 +87,9 @@ func (T *GListener) Start() error {
}
ctx, cn := context.WithTimeout(context.Background(), 5*time.Second)
defer cn()
- err := T.server.StartServer(ctx, T.networkAddress.String())
+ err := T.server.StartServer(ctx, T.networkAddress.Network+"://"+T.networkAddress.String(),
+ gnet.WithMulticore(true),
+ )
if err != nil {
return err
}
diff --git a/lib/gat/server.go b/lib/gat/server.go
index 21bd9235ab440e3bd8432bd0c35fb1ddf9b20686..af1156432d5bccebec26f647ed28e3fd62c0a394 100644
--- a/lib/gat/server.go
+++ b/lib/gat/server.go
@@ -6,6 +6,7 @@ import (
"fmt"
"io"
"net"
+ "strings"
"github.com/caddyserver/caddy/v2"
"go.uber.org/zap"
@@ -18,9 +19,8 @@ import (
)
type ServerConfig struct {
- Listen []ListenerConfig `json:"listen,omitempty"`
- GListen []ListenerConfig `json:"glisten,omitempty"`
- Routes []RouteConfig `json:"routes,omitempty"`
+ Listen []ListenerConfig `json:"listen,omitempty"`
+ Routes []RouteConfig `json:"routes,omitempty"`
}
type Server struct {
@@ -43,17 +43,23 @@ func (T *Server) Provision(ctx caddy.Context) error {
listener := &Listener{
ListenerConfig: config,
}
+ if strings.HasSuffix(config.Address, "66") {
+ continue
+ }
if err := listener.Provision(ctx); err != nil {
return err
}
T.listen = append(T.listen, listener)
}
- T.glisten = make([]*GListener, 0, len(T.GListen))
- for _, config := range T.GListen {
+ T.glisten = make([]*GListener, 0, len(T.Listen))
+ for _, config := range T.Listen {
glistener := &GListener{
ListenerConfig: config,
}
+ if !strings.HasSuffix(config.Address, "66") {
+ continue
+ }
if err := glistener.Provision(ctx); err != nil {
return err
}
@@ -98,7 +104,7 @@ func (T *Server) Start() error {
for _, glistener := range T.glisten {
// TODO: sort of hacky. should clean up.
glistener.server.Acceptor = func(c *gfed.Codec) {
- T.gaccept(glistener, c)
+ go T.gaccept(glistener, c)
}
if err := glistener.Start(); err != nil {
return err
diff --git a/lib/gfed/codec.go b/lib/gfed/codec.go
index 260ad82fedb835b37d6bc6857b96afb78ea658e1..4c0f57dfd049d652ec35c1b2617a7e8e07355ce2 100644
--- a/lib/gfed/codec.go
+++ b/lib/gfed/codec.go
@@ -3,6 +3,7 @@ package gfed
import (
"bufio"
"crypto/tls"
+ "fmt"
"io"
"net"
@@ -61,7 +62,8 @@ func NewCodec() *Codec {
//TODO: pool buffers maybe? idk. weird use case.
rd := bufio.NewReader(out)
c := &Codec{
- in: in,
+ in: in,
+ initialParameters: map[strutil.CIString]string{},
}
c.decoder.Reset(rd)
return c
@@ -83,9 +85,10 @@ func (T *Codec) readPacket(typed bool) (fed.Packet, error) {
if err := T.decoder.Next(typed); err != nil {
return nil, err
}
- return fed.PendingPacket{
+ pending := fed.PendingPacket{
Decoder: &T.decoder,
- }, nil
+ }
+ return pending, nil
}
func (T *Codec) ReadPacket(typed bool) (fed.Packet, error) {
@@ -220,7 +223,7 @@ func (T *Codec) ReadByte() (byte, error) {
}
func (T *Codec) EnableSSL(config *tls.Config, isClient bool) error {
- panic("ssl not supported")
+ return fmt.Errorf("ssl not supported")
}
func (T *Codec) Close() error {
diff --git a/lib/gfed/gfed.go b/lib/gfed/gfed.go
index 8b2a609e70900af66664def9279fcf0d7e043399..6ceaf8e4adf6eeb1a18e41dca83edcacd45bb744 100644
--- a/lib/gfed/gfed.go
+++ b/lib/gfed/gfed.go
@@ -15,8 +15,9 @@ type Server struct {
log *slog.Logger
- ready chan struct{}
- conns chan *Codec
+ ready chan struct{}
+ conns chan *Codec
+ closed chan error
gnet.BuiltinEventEngine
eng gnet.Engine
@@ -24,16 +25,15 @@ type Server struct {
}
func (s *Server) StartServer(ctx context.Context, addr string, opts ...gnet.Option) error {
- errch := make(chan error)
go func() {
err := gnet.Run(s, addr, opts...)
if err != nil {
- errch <- err
+ s.closed <- err
}
- close(errch)
+ close(s.closed)
}()
select {
- case err := <-errch:
+ case err := <-s.closed:
if err != nil {
return err
}
@@ -48,22 +48,26 @@ func (s *Server) StartServer(ctx context.Context, addr string, opts ...gnet.Opti
func (T *Server) Provision(ctx caddy.Context) error {
T.log = ctx.Slogger()
T.ready = make(chan struct{})
+ T.closed = make(chan error)
return nil
}
func (s *Server) OnOpen(c gnet.Conn) ([]byte, gnet.Action) {
- dec := new(Codec)
+ slog.Info("new conn", "conn", c.RemoteAddr().String())
+ dec := NewCodec()
c.SetContext(dec)
dec.localAddr = c.LocalAddr()
dec.gnetConn = c
+ dec.encoder.Reset(c)
s.connected.Add(1)
s.Acceptor(dec)
return nil, gnet.None
}
func (s *Server) OnTraffic(c gnet.Conn) gnet.Action {
+ //slog.Info("got traffic", "conn", c.RemoteAddr().String())
uc := c.Context().(*Codec)
- bts, err := c.Next(c.InboundBuffered())
+ bts, err := c.Next(-1)
if err != nil {
s.log.Error("short read", "conn", c.RemoteAddr(), "err", err)
return gnet.Close
@@ -75,6 +79,7 @@ func (s *Server) OnTraffic(c gnet.Conn) gnet.Action {
return gnet.None
}
func (s *Server) OnBoot(eng gnet.Engine) gnet.Action {
+ close(s.ready)
return gnet.None
}
func (s *Server) OnShutdown(eng gnet.Engine) {