@@ -5,13 +5,11 @@ package server
5
5
6
6
import (
7
7
"context"
8
- "errors"
9
8
"fmt"
10
9
"net"
11
10
"net/http"
12
11
"net/url"
13
12
"path"
14
- "sync"
15
13
"time"
16
14
17
15
"github.com/NYTimes/gziphandler"
@@ -39,15 +37,13 @@ const (
39
37
)
40
38
41
39
var (
42
- errUnknownLockOption = errors .New ("invalid lock options" )
43
-
44
40
_ PathAdder = readPathAdder {}
45
41
_ Server = (* server )(nil )
46
42
)
47
43
48
44
type PathAdder interface {
49
45
// AddRoute registers a route to a handler.
50
- AddRoute (handler * common. HTTPHandler , lock * sync. RWMutex , base , endpoint string ) error
46
+ AddRoute (handler http. Handler , base , endpoint string ) error
51
47
52
48
// AddAliases registers aliases to the server
53
49
AddAliases (endpoint string , aliases ... string ) error
@@ -56,7 +52,7 @@ type PathAdder interface {
56
52
type PathAdderWithReadLock interface {
57
53
// AddRouteWithReadLock registers a route to a handler assuming the http
58
54
// read lock is currently held.
59
- AddRouteWithReadLock (handler * common. HTTPHandler , lock * sync. RWMutex , base , endpoint string ) error
55
+ AddRouteWithReadLock (handler http. Handler , base , endpoint string ) error
60
56
61
57
// AddAliasesWithReadLock registers aliases to the server assuming the http read
62
58
// lock is currently held.
@@ -182,13 +178,8 @@ func (s *server) Dispatch() error {
182
178
}
183
179
184
180
func (s * server ) RegisterChain (chainName string , ctx * snow.ConsensusContext , vm common.VM ) {
185
- var (
186
- handlers map [string ]* common.HTTPHandler
187
- err error
188
- )
189
-
190
181
ctx .Lock .Lock ()
191
- handlers , err = vm .CreateHandlers (context .TODO ())
182
+ handlers , err : = vm .CreateHandlers (context .TODO ())
192
183
ctx .Lock .Unlock ()
193
184
if err != nil {
194
185
s .log .Error ("failed to create handlers" ,
@@ -224,112 +215,44 @@ func (s *server) RegisterChain(chainName string, ctx *snow.ConsensusContext, vm
224
215
}
225
216
}
226
217
227
- func (s * server ) addChainRoute (chainName string , handler * common. HTTPHandler , ctx * snow.ConsensusContext , base , endpoint string ) error {
218
+ func (s * server ) addChainRoute (chainName string , handler http. Handler , ctx * snow.ConsensusContext , base , endpoint string ) error {
228
219
url := fmt .Sprintf ("%s/%s" , baseURL , base )
229
220
s .log .Info ("adding route" ,
230
221
zap .String ("url" , url ),
231
222
zap .String ("endpoint" , endpoint ),
232
223
)
233
224
if s .tracingEnabled {
234
- handler = & common.HTTPHandler {
235
- LockOptions : handler .LockOptions ,
236
- Handler : api .TraceHandler (handler .Handler , chainName , s .tracer ),
237
- }
238
- }
239
- // Apply middleware to grab/release chain's lock before/after calling API method
240
- h , err := lockMiddleware (
241
- handler .Handler ,
242
- handler .LockOptions ,
243
- s .tracingEnabled ,
244
- s .tracer ,
245
- & ctx .Lock ,
246
- )
247
- if err != nil {
248
- return err
225
+ handler = api .TraceHandler (handler , chainName , s .tracer )
249
226
}
250
227
// Apply middleware to reject calls to the handler before the chain finishes bootstrapping
251
- h = rejectMiddleware (h , ctx )
252
- h = s .metrics .wrapHandler (chainName , h )
253
- return s .router .AddRouter (url , endpoint , h )
228
+ handler = rejectMiddleware (handler , ctx )
229
+ handler = s .metrics .wrapHandler (chainName , handler )
230
+ return s .router .AddRouter (url , endpoint , handler )
254
231
}
255
232
256
- func (s * server ) AddRoute (handler * common. HTTPHandler , lock * sync. RWMutex , base , endpoint string ) error {
257
- return s .addRoute (handler , lock , base , endpoint )
233
+ func (s * server ) AddRoute (handler http. Handler , base , endpoint string ) error {
234
+ return s .addRoute (handler , base , endpoint )
258
235
}
259
236
260
- func (s * server ) AddRouteWithReadLock (handler * common. HTTPHandler , lock * sync. RWMutex , base , endpoint string ) error {
237
+ func (s * server ) AddRouteWithReadLock (handler http. Handler , base , endpoint string ) error {
261
238
s .router .lock .RUnlock ()
262
239
defer s .router .lock .RLock ()
263
- return s .addRoute (handler , lock , base , endpoint )
240
+ return s .addRoute (handler , base , endpoint )
264
241
}
265
242
266
- func (s * server ) addRoute (handler * common. HTTPHandler , lock * sync. RWMutex , base , endpoint string ) error {
243
+ func (s * server ) addRoute (handler http. Handler , base , endpoint string ) error {
267
244
url := fmt .Sprintf ("%s/%s" , baseURL , base )
268
245
s .log .Info ("adding route" ,
269
246
zap .String ("url" , url ),
270
247
zap .String ("endpoint" , endpoint ),
271
248
)
272
249
273
250
if s .tracingEnabled {
274
- handler = & common.HTTPHandler {
275
- LockOptions : handler .LockOptions ,
276
- Handler : api .TraceHandler (handler .Handler , url , s .tracer ),
277
- }
278
- }
279
-
280
- // Apply middleware to grab/release chain's lock before/after calling API method
281
- h , err := lockMiddleware (
282
- handler .Handler ,
283
- handler .LockOptions ,
284
- s .tracingEnabled ,
285
- s .tracer ,
286
- lock ,
287
- )
288
- if err != nil {
289
- return err
290
- }
291
- h = s .metrics .wrapHandler (base , h )
292
- return s .router .AddRouter (url , endpoint , h )
293
- }
294
-
295
- // Wraps a handler by grabbing and releasing a lock before calling the handler.
296
- func lockMiddleware (
297
- handler http.Handler ,
298
- lockOption common.LockOption ,
299
- tracingEnabled bool ,
300
- tracer trace.Tracer ,
301
- lock * sync.RWMutex ,
302
- ) (http.Handler , error ) {
303
- var (
304
- name string
305
- lockedHandler http.Handler
306
- )
307
- switch lockOption {
308
- case common .WriteLock :
309
- name = "writeLock"
310
- lockedHandler = middlewareHandler {
311
- before : lock .Lock ,
312
- after : lock .Unlock ,
313
- handler : handler ,
314
- }
315
- case common .ReadLock :
316
- name = "readLock"
317
- lockedHandler = middlewareHandler {
318
- before : lock .RLock ,
319
- after : lock .RUnlock ,
320
- handler : handler ,
321
- }
322
- case common .NoLock :
323
- return handler , nil
324
- default :
325
- return nil , errUnknownLockOption
326
- }
327
-
328
- if ! tracingEnabled {
329
- return lockedHandler , nil
251
+ handler = api .TraceHandler (handler , url , s .tracer )
330
252
}
331
253
332
- return api .TraceHandler (lockedHandler , name , tracer ), nil
254
+ handler = s .metrics .wrapHandler (base , handler )
255
+ return s .router .AddRouter (url , endpoint , handler )
333
256
}
334
257
335
258
// Reject middleware wraps a handler. If the chain that the context describes is
@@ -383,8 +306,8 @@ func PathWriterFromWithReadLock(pather PathAdderWithReadLock) PathAdder {
383
306
}
384
307
}
385
308
386
- func (a readPathAdder ) AddRoute (handler * common. HTTPHandler , lock * sync. RWMutex , base , endpoint string ) error {
387
- return a .pather .AddRouteWithReadLock (handler , lock , base , endpoint )
309
+ func (a readPathAdder ) AddRoute (handler http. Handler , base , endpoint string ) error {
310
+ return a .pather .AddRouteWithReadLock (handler , base , endpoint )
388
311
}
389
312
390
313
func (a readPathAdder ) AddAliases (endpoint string , aliases ... string ) error {
0 commit comments