-
Notifications
You must be signed in to change notification settings - Fork 9
/
mutablmux.go
60 lines (49 loc) · 1.69 KB
/
mutablmux.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// modified from github.com/fission/fission
/*
Copyright 2016 The Fission Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package mmux
import (
"net/http"
"sync/atomic"
"github.com/gorilla/mux"
)
//
// MutableRouter wraps the mux router, and allows the router to be
// atomically changed.
type MutableRouter struct {
router atomic.Value // mux.Router
}
// NewMutableRouter creates new mux with no handlers
func NewMutableRouter() *MutableRouter {
return NewMutableRouterFromRouter(mux.NewRouter())
}
// NewMutableRouterFromRouter creates new mux from immutable parent
func NewMutableRouterFromRouter(router *mux.Router) *MutableRouter {
mr := MutableRouter{}
mr.router.Store(router)
return &mr
}
// ServeHTTP implements the http.Handler interface
func (mr *MutableRouter) ServeHTTP(responseWriter http.ResponseWriter, request *http.Request) {
// Atomically grab the underlying mux router and call it.
routerValue := mr.router.Load()
router, ok := routerValue.(*mux.Router)
if !ok {
panic("Invalid router type")
}
router.ServeHTTP(responseWriter, request)
}
// UpdateRouter replaces the underlying mux with new one atomically
func (mr *MutableRouter) UpdateRouter(newHandler *mux.Router) {
mr.router.Store(newHandler)
}