Skip to content

Commit 5de2c30

Browse files
authored
Refactor the doUpgrade transport return parameters (#76)
When refactoring the transportSessions, there may be some updates to the doUpgrade function. This is a small PR getting that code inline for an update.
1 parent c34fad1 commit 5de2c30

File tree

4 files changed

+53
-45
lines changed

4 files changed

+53
-45
lines changed

Diff for: engineio/server.v2.go

+32-22
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ const Version2 EIOVersionStr = "2"
2727

2828
func init() { registry[Version2.Int()] = NewServerV2 }
2929

30+
type upgradeable struct {
31+
transport eiot.Transporter
32+
isProbeOnInit bool
33+
upgradeFn func() error
34+
err error
35+
}
36+
3037
type serverV2 struct {
3138
path *string
3239

@@ -53,7 +60,7 @@ type serverV2 struct {
5360
eto []eiot.Option
5461

5562
servers map[EIOVersionStr]server
56-
sessions mapSessions
63+
sessions transportSessions
5764
transports map[TransportName]func(SessionID, eiot.Codec) eiot.Transporter
5865

5966
transportRunError chan error
@@ -185,7 +192,8 @@ func (v2 *serverV2) serveTransport(w http.ResponseWriter, r *http.Request) (tran
185192
sessionID, _ := ctx.Value(ctxSessionID).(SessionID)
186193
if sessionID == "" {
187194
sessionID = v2.generateID()
188-
transportName, _ := r.Context().Value(ctxTransportName).(TransportName)
195+
196+
transportName := transportNameFrom(r)
189197
transport = v2.transports[transportName](sessionID, v2.codec)
190198
if err := v2.sessions.Set(transport); err != nil {
191199
return nil, err
@@ -208,28 +216,28 @@ func (v2 *serverV2) serveTransport(w http.ResponseWriter, r *http.Request) (tran
208216
}
209217
}
210218

211-
var isProbeOnInit bool
212-
var fnOnUpgrade func() error
213-
transport, isProbeOnInit, fnOnUpgrade, err = v2.doUpgrade(v2.sessions.Get(sessionID))(w, r)
214-
if err != nil {
215-
return nil, err
219+
upgrade := v2.doUpgrade(v2.sessions.Get(sessionID))(w, r)
220+
if upgrade.err != nil {
221+
return nil, upgrade.err
216222
}
217223

218224
var opts []eiot.Option
219-
if isProbeOnInit {
220-
opts = []eiot.Option{eiot.OnInitProbe(isProbeOnInit)}
225+
if upgrade.isProbeOnInit {
226+
opts = []eiot.Option{eiot.OnInitProbe(upgrade.isProbeOnInit)}
221227
}
222-
if fnOnUpgrade != nil {
223-
opts = []eiot.Option{eiot.OnUpgrade(fnOnUpgrade)}
228+
if upgrade.upgradeFn != nil {
229+
opts = []eiot.Option{eiot.OnUpgrade(upgrade.upgradeFn)}
224230
}
225231

226232
ctx = v2.sessions.WithTimeout(ctx, v2.pingTimeout*4)
227233
ctx = v2.sessions.WithInterval(ctx, v2.pingTimeout)
228234

229235
opts = append(opts, eiot.WithNoPing())
230-
go func() { v2.transportRunError <- transport.Run(w, r.WithContext(ctx), append(v2.eto, opts...)...) }()
236+
go func() {
237+
v2.transportRunError <- upgrade.transport.Run(w, r.WithContext(ctx), append(v2.eto, opts...)...)
238+
}()
231239

232-
return
240+
return upgrade.transport, nil
233241
}
234242

235243
func (v2 *serverV2) handshakePacket(sessionID SessionID, transportName TransportName) eiop.Packet {
@@ -243,24 +251,26 @@ func (v2 *serverV2) handshakePacket(sessionID SessionID, transportName Transport
243251
}
244252
}
245253

246-
func (v2 *serverV2) doUpgrade(transport eiot.Transporter, err error) func(http.ResponseWriter, *http.Request) (eiot.Transporter, bool, func() error, error) {
247-
var isUpgrade bool
248-
return func(w http.ResponseWriter, r *http.Request) (eiot.Transporter, bool, func() error, error) {
254+
func (v2 *serverV2) doUpgrade(transport eiot.Transporter, err error) func(http.ResponseWriter, *http.Request) upgradeable {
255+
return func(w http.ResponseWriter, r *http.Request) upgradeable {
249256
if err != nil {
250-
return transport, isUpgrade, nil, err
257+
return upgradeable{transport: transport, err: err}
251258
}
252259
sessionID, from, to := transport.ID(), transport.Name(), transportNameFrom(r)
253260
if to != from {
254261
for _, val := range v2.upgrades(from, v2.transports) {
255262
if string(to) == val {
256-
transport = v2.transports[to](sessionID, v2.codec)
257-
isUpgrade = true
258-
return transport, isUpgrade, func() error { return v2.sessions.Set(transport) }, nil
263+
return upgradeable{
264+
transport: v2.transports[to](sessionID, v2.codec),
265+
isProbeOnInit: true,
266+
upgradeFn: func() error { return v2.sessions.Set(transport) },
267+
err: nil,
268+
}
259269
}
260270
}
261-
return nil, false, nil, ErrTransportUpgradeFailed
271+
return upgradeable{err: ErrTransportUpgradeFailed}
262272
}
263-
return transport, isUpgrade, nil, err
273+
return upgradeable{transport: transport, err: err}
264274
}
265275
}
266276

Diff for: engineio/server.v3.go

+12-11
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ func (v3 *serverV3) serveTransport(w http.ResponseWriter, r *http.Request) (tran
8989
sessionID := sessionIDFrom(r)
9090
if sessionID == "" {
9191
sessionID = v3.generateID()
92+
9293
transportName := transportNameFrom(r)
9394
transport = v3.transports[transportName](sessionID, v3.codec)
9495
if err := v3.sessions.Set(transport); err != nil {
@@ -112,27 +113,27 @@ func (v3 *serverV3) serveTransport(w http.ResponseWriter, r *http.Request) (tran
112113
}
113114
}
114115

115-
var isProbeOnInit bool
116-
var fnOnUpgrade func() error
117-
transport, isProbeOnInit, fnOnUpgrade, err = v3.doUpgrade(v3.sessions.Get(sessionID))(w, r)
118-
if err != nil {
119-
return nil, err
116+
upgrade := v3.doUpgrade(v3.sessions.Get(sessionID))(w, r)
117+
if upgrade.err != nil {
118+
return nil, upgrade.err
120119
}
121120

122121
var opts []eiot.Option
123-
if isProbeOnInit {
124-
opts = []eiot.Option{eiot.OnInitProbe(isProbeOnInit)}
122+
if upgrade.isProbeOnInit {
123+
opts = []eiot.Option{eiot.OnInitProbe(upgrade.isProbeOnInit)}
125124
}
126-
if fnOnUpgrade != nil {
127-
opts = []eiot.Option{eiot.OnUpgrade(fnOnUpgrade)}
125+
if upgrade.upgradeFn != nil {
126+
opts = []eiot.Option{eiot.OnUpgrade(upgrade.upgradeFn)}
128127
}
129128

130129
ctx = v3.sessions.WithInterval(ctx, v3.pingInterval)
131130
ctx = v3.sessions.WithTimeout(ctx, v3.pingTimeout)
132131

133-
go func() { v3.transportRunError <- transport.Run(w, r.WithContext(ctx), append(v3.eto, opts...)...) }()
132+
go func() {
133+
v3.transportRunError <- upgrade.transport.Run(w, r.WithContext(ctx), append(v3.eto, opts...)...)
134+
}()
134135

135-
return
136+
return upgrade.transport, nil
136137
}
137138

138139
func (v3 *serverV3) handshakePacket(sessionID SessionID, transportName TransportName) eiop.Packet {

Diff for: engineio/server.v4.go

+8-11
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (v4 *serverV4) serveTransport(w http.ResponseWriter, r *http.Request) (tran
7676
sessionID = v4.generateID()
7777
ctx = context.WithValue(ctx, ctxSessionID, sessionID)
7878

79-
transportName, _ := r.Context().Value(ctxTransportName).(TransportName)
79+
transportName := transportNameFrom(r)
8080
transport = v4.transports[transportName](sessionID, v4.codec)
8181
if err := v4.sessions.Set(transport); err != nil {
8282
return nil, err
@@ -98,28 +98,25 @@ func (v4 *serverV4) serveTransport(w http.ResponseWriter, r *http.Request) (tran
9898
}
9999
}
100100

101-
var isProbeOnInit bool
102-
var fnOnUpgrade func() error
103-
transport, _, fnOnUpgrade, err = v4.doUpgrade(v4.sessions.Get(sessionID))(w, r)
101+
upgrade := v4.doUpgrade(v4.sessions.Get(sessionID))(w, r)
104102
if err != nil {
105103
return nil, err
106104
}
107105

108106
var opts []eiot.Option
109-
if isProbeOnInit {
110-
opts = []eiot.Option{eiot.OnInitProbe(isProbeOnInit)}
111-
}
112-
if fnOnUpgrade != nil {
113-
opts = []eiot.Option{eiot.OnUpgrade(fnOnUpgrade)}
107+
if upgrade.upgradeFn != nil {
108+
opts = []eiot.Option{eiot.OnUpgrade(upgrade.upgradeFn)}
114109
}
115110

116111
ctx = v4.sessions.WithCancel(ctx)
117112
ctx = v4.sessions.WithInterval(ctx, v4.pingInterval)
118113
ctx = v4.sessions.WithTimeout(ctx, v4.pingTimeout)
119114

120-
go func() { v4.transportRunError <- transport.Run(w, r.WithContext(ctx), append(v4.eto, opts...)...) }()
115+
go func() {
116+
v4.transportRunError <- upgrade.transport.Run(w, r.WithContext(ctx), append(v4.eto, opts...)...)
117+
}()
121118

122-
return
119+
return upgrade.transport, err
123120
}
124121

125122
func (v4 *serverV4) handshakePacket(sessionID SessionID, transportName TransportName) eiop.Packet {

Diff for: engineio/sessions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func storeDuration(addr *time.Duration, val time.Duration) {
1818
atomic.StoreInt64((*int64)(addr), int64(val))
1919
}
2020

21-
type mapSessions interface {
21+
type transportSessions interface {
2222
Set(eiot.Transporter) error
2323
Get(SessionID) (eiot.Transporter, error)
2424

0 commit comments

Comments
 (0)