Skip to content

Commit bcf2d32

Browse files
authored
feat(server): add start handler (#419)
* feat(server): add start handler * fix(server): set start handlers bug * feat(context): make context logger public * feat(context): make context ClientInfo public * fix: typo
1 parent 6b42276 commit bcf2d32

5 files changed

Lines changed: 104 additions & 50 deletions

File tree

core/client_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ func TestFrameRoundTrip(t *testing.T) {
5050
server.ConfigMetadataBuilder(metadata.DefaultBuilder())
5151
server.ConfigRouter(router.Default([]config.App{{Name: "sfn-1"}}))
5252

53+
// test server hooks
54+
ht := &hookTester{t}
55+
server.SetStartHandlers(ht.startHandler)
56+
server.SetBeforeHandlers(ht.beforeHandler)
57+
server.SetAfterHandlers(ht.afterHandler)
58+
5359
w := newMockFrameWriter()
5460
server.AddDownstreamServer("mockAddr", w)
5561

@@ -114,6 +120,32 @@ func TestFrameRoundTrip(t *testing.T) {
114120
assert.NoError(t, sfn.Close(), "sfn client.Close() should not return error")
115121
}
116122

123+
type hookTester struct {
124+
t *testing.T
125+
}
126+
127+
func (a *hookTester) startHandler(ctx *Context) error {
128+
ctx.Set("start", "yes")
129+
return nil
130+
}
131+
132+
func (a *hookTester) beforeHandler(ctx *Context) error {
133+
ctx.Set("before", "ok")
134+
return nil
135+
}
136+
137+
func (a *hookTester) afterHandler(ctx *Context) error {
138+
v, ok := ctx.Get("start")
139+
assert.True(a.t, ok)
140+
assert.Equal(a.t, v, "yes")
141+
142+
v, ok = ctx.Get("before")
143+
assert.True(a.t, ok)
144+
assert.Equal(a.t, v, "ok")
145+
146+
return nil
147+
}
148+
117149
// mockFrameWriter mock a FrameWriter
118150
type mockFrameWriter struct {
119151
mu sync.Mutex

core/context.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type Context struct {
2727

2828
mu sync.RWMutex
2929

30-
logger *slog.Logger
30+
Logger *slog.Logger
3131
}
3232

3333
func newContext(conn quic.Connection, stream quic.Stream, logger *slog.Logger) (ctx *Context) {
@@ -40,18 +40,22 @@ func newContext(conn quic.Connection, stream quic.Stream, logger *slog.Logger) (
4040
ctx.Conn = conn
4141
ctx.Stream = stream
4242
ctx.connID = conn.RemoteAddr().String()
43-
ctx.logger = logger.With("conn_id", conn.RemoteAddr().String(), "stream_id", stream.StreamID())
43+
ctx.Logger = logger.With("conn_id", conn.RemoteAddr().String(), "stream_id", stream.StreamID())
4444
return
4545
}
4646

4747
const clientInfoKey = "client_info"
4848

4949
// ClientInfo holds client info, you can use `*Context.ClientInfo()` to get it after handshake.
5050
type ClientInfo struct {
51-
clientID string
52-
clientType byte
53-
clientName string
54-
authName string
51+
// ID is client id from handshake.
52+
ID string
53+
// Type is client type from handshake.
54+
Type byte
55+
// Name is client name from handshake.
56+
Name string
57+
// AuthName is client authName from handshake.
58+
AuthName string
5559
}
5660

5761
// ClientInfo get client info from context.
@@ -67,17 +71,17 @@ func (c *Context) ClientInfo() *ClientInfo {
6771
func (c *Context) WithFrame(f frame.Frame) *Context {
6872
if f.Type() == frame.TagOfHandshakeFrame {
6973
handshakeFrame := f.(*frame.HandshakeFrame)
70-
c.logger = c.logger.With(
74+
c.Logger = c.Logger.With(
7175
"client_id", handshakeFrame.ClientID,
7276
"client_type", ClientType(handshakeFrame.ClientType).String(),
7377
"client_name", handshakeFrame.Name,
7478
"auth_name", handshakeFrame.AuthName(),
7579
)
7680
c.Set(clientInfoKey, &ClientInfo{
77-
clientID: handshakeFrame.ClientID,
78-
clientType: handshakeFrame.ClientType,
79-
clientName: handshakeFrame.Name,
80-
authName: handshakeFrame.AuthName(),
81+
ID: handshakeFrame.ClientID,
82+
Type: handshakeFrame.ClientType,
83+
Name: handshakeFrame.Name,
84+
AuthName: handshakeFrame.AuthName(),
8185
})
8286
}
8387
c.Frame = f
@@ -86,7 +90,7 @@ func (c *Context) WithFrame(f frame.Frame) *Context {
8690

8791
// Clean the context.
8892
func (c *Context) Clean() {
89-
c.logger.Debug("conn context clean", "conn_id", c.connID)
93+
c.Logger.Debug("conn context clean", "conn_id", c.connID)
9094
c.reset()
9195
ctxPool.Put(c)
9296
}
@@ -96,15 +100,15 @@ func (c *Context) reset() {
96100
c.connID = ""
97101
c.Stream = nil
98102
c.Frame = nil
99-
c.logger = nil
103+
c.Logger = nil
100104
for k := range c.Keys {
101105
delete(c.Keys, k)
102106
}
103107
}
104108

105109
// CloseWithError closes the stream and cleans the context.
106110
func (c *Context) CloseWithError(code yerr.ErrorCode, msg string) {
107-
c.logger.Debug("conn context close, ", "err_code", code, "err_msg", msg)
111+
c.Logger.Debug("conn context close, ", "err_code", code, "err_msg", msg)
108112
if c.Stream != nil {
109113
c.Stream.Close()
110114
}

0 commit comments

Comments
 (0)