-
Notifications
You must be signed in to change notification settings - Fork 17
/
server.go
82 lines (66 loc) · 1.8 KB
/
server.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Package delta is an HTTP shadow proxy server that sits between
// clients and your server(s) to enable "shadow requests".
package delta
import (
"fmt"
"log"
"net"
"net/http"
)
type Server struct {
Host string
Port int
Backends map[string]*Backend
onSelectBackendHandler func(req *http.Request) []string
onMungeHeaderHandler func(backend string, header *http.Header)
onBackendFinishedHandler func(map[string]*Response)
}
func NewServer(host string, port int) *Server {
server := &Server{
Host: host,
Port: port,
}
server.Backends = make(map[string]*Backend)
// By default, all backends will be selected
server.OnSelectBackend(func(req *http.Request) []string {
backends := make([]string, 0)
for key, _ := range server.Backends {
backends = append(backends, key)
}
return backends
})
return server
}
func (server *Server) AddMasterBackend(name, host string, port int) {
server.Backends[name] = &Backend{
IsMaster: true,
Name: name,
Host: host,
Port: port,
}
}
func (server *Server) AddBackend(name, host string, port int) {
server.Backends[name] = &Backend{
IsMaster: false,
Name: name,
Host: host,
Port: port,
}
}
func (server *Server) OnSelectBackend(handler func(req *http.Request) []string) {
server.onSelectBackendHandler = handler
}
func (server *Server) OnMungeHeader(handler func(backend string, header *http.Header)) {
server.onMungeHeaderHandler = handler
}
func (server *Server) OnBackendFinished(handler func(responses map[string]*Response)) {
server.onBackendFinishedHandler = handler
}
func (server *Server) Run() {
listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", server.Host, server.Port))
if err != nil {
log.Fatal(err)
}
http.Handle("/", NewHandler(server))
log.Fatal(http.Serve(listener, nil))
}