@@ -27,6 +27,13 @@ const Version2 EIOVersionStr = "2"
27
27
28
28
func init () { registry [Version2 .Int ()] = NewServerV2 }
29
29
30
+ type upgradeable struct {
31
+ transport eiot.Transporter
32
+ isProbeOnInit bool
33
+ upgradeFn func () error
34
+ err error
35
+ }
36
+
30
37
type serverV2 struct {
31
38
path * string
32
39
@@ -53,7 +60,7 @@ type serverV2 struct {
53
60
eto []eiot.Option
54
61
55
62
servers map [EIOVersionStr ]server
56
- sessions mapSessions
63
+ sessions transportSessions
57
64
transports map [TransportName ]func (SessionID , eiot.Codec ) eiot.Transporter
58
65
59
66
transportRunError chan error
@@ -185,7 +192,8 @@ func (v2 *serverV2) serveTransport(w http.ResponseWriter, r *http.Request) (tran
185
192
sessionID , _ := ctx .Value (ctxSessionID ).(SessionID )
186
193
if sessionID == "" {
187
194
sessionID = v2 .generateID ()
188
- transportName , _ := r .Context ().Value (ctxTransportName ).(TransportName )
195
+
196
+ transportName := transportNameFrom (r )
189
197
transport = v2 .transports [transportName ](sessionID , v2 .codec )
190
198
if err := v2 .sessions .Set (transport ); err != nil {
191
199
return nil , err
@@ -208,28 +216,28 @@ func (v2 *serverV2) serveTransport(w http.ResponseWriter, r *http.Request) (tran
208
216
}
209
217
}
210
218
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
216
222
}
217
223
218
224
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 )}
221
227
}
222
- if fnOnUpgrade != nil {
223
- opts = []eiot.Option {eiot .OnUpgrade (fnOnUpgrade )}
228
+ if upgrade . upgradeFn != nil {
229
+ opts = []eiot.Option {eiot .OnUpgrade (upgrade . upgradeFn )}
224
230
}
225
231
226
232
ctx = v2 .sessions .WithTimeout (ctx , v2 .pingTimeout * 4 )
227
233
ctx = v2 .sessions .WithInterval (ctx , v2 .pingTimeout )
228
234
229
235
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
+ }()
231
239
232
- return
240
+ return upgrade . transport , nil
233
241
}
234
242
235
243
func (v2 * serverV2 ) handshakePacket (sessionID SessionID , transportName TransportName ) eiop.Packet {
@@ -243,24 +251,26 @@ func (v2 *serverV2) handshakePacket(sessionID SessionID, transportName Transport
243
251
}
244
252
}
245
253
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 {
249
256
if err != nil {
250
- return transport , isUpgrade , nil , err
257
+ return upgradeable { transport : transport , err : err }
251
258
}
252
259
sessionID , from , to := transport .ID (), transport .Name (), transportNameFrom (r )
253
260
if to != from {
254
261
for _ , val := range v2 .upgrades (from , v2 .transports ) {
255
262
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
+ }
259
269
}
260
270
}
261
- return nil , false , nil , ErrTransportUpgradeFailed
271
+ return upgradeable { err : ErrTransportUpgradeFailed }
262
272
}
263
- return transport , isUpgrade , nil , err
273
+ return upgradeable { transport : transport , err : err }
264
274
}
265
275
}
266
276
0 commit comments