/
frontendserver.go
63 lines (51 loc) · 1.52 KB
/
frontendserver.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
package server
import (
"log"
"net"
"net/http"
"os"
"github.com/gorilla/rpc"
"github.com/gorilla/rpc/json"
"github.com/privacylab/talek/common"
)
// FrontendServer represents an HTTP served Frontend
type FrontendServer struct {
log *log.Logger
name string
Frontend *Frontend
*rpc.Server
}
// NewFrontendServer creates a new Frontend implementing HTTP.Handler.
func NewFrontendServer(name string, serverConfig *Config, replicas []*common.TrustDomainConfig) *FrontendServer {
fe := &FrontendServer{}
fe.log = log.New(os.Stdout, "[FrontendServer:"+name+"] ", log.Ldate|log.Ltime|log.Lshortfile)
fe.name = name
rpcs := make([]common.ReplicaInterface, len(replicas))
for i, r := range replicas {
rpcs[i] = common.NewReplicaRPC(r.Name, r)
}
fe.Frontend = NewFrontend(name, serverConfig, rpcs)
// Set up the RPC server component.
fe.Server = rpc.NewServer()
fe.Server.RegisterCodec(&json.Codec{}, "application/json")
fe.Server.RegisterTCPService(fe.Frontend, "Frontend")
return fe
}
// Run begins an HTTP server for the server at a specific address
func (fe *FrontendServer) Run(address string) (net.Listener, error) {
if fe.Server == nil {
fe.Server = rpc.NewServer()
fe.Server.RegisterCodec(json.NewCodec(), "application/json")
fe.Server.RegisterTCPService(fe.Frontend, "Frontend")
}
bindAddr, err := net.ResolveTCPAddr("tcp4", address)
if err != nil {
return nil, err
}
listener, err := net.ListenTCP("tcp4", bindAddr)
if err != nil {
return nil, err
}
go http.Serve(listener, fe)
return listener, nil
}