/
server.go
53 lines (42 loc) · 1.27 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
package server
import (
"fmt"
"io"
"log"
"net"
"net/http"
"net/rpc"
"net/rpc/jsonrpc"
"github.com/building-microservices-with-go/chapter1/rpc_http_json/contract"
)
const port = 1234
type HttpConn struct {
in io.Reader
out io.Writer
}
func (c *HttpConn) Read(p []byte) (n int, err error) { return c.in.Read(p) }
func (c *HttpConn) Write(d []byte) (n int, err error) { return c.out.Write(d) }
func (c *HttpConn) Close() error { return nil }
type HelloWorldHandler struct{}
func (h *HelloWorldHandler) HelloWorld(args *contract.HelloWorldRequest, reply *contract.HelloWorldResponse) error {
reply.Message = "Hello " + args.Name
return nil
}
func StartServer() {
helloWorld := new(HelloWorldHandler)
rpc.Register(helloWorld)
l, err := net.Listen("tcp", fmt.Sprintf(":%v", port))
if err != nil {
log.Fatal(fmt.Sprintf("Unable to listen on given port: %s", err))
}
http.Serve(l, http.HandlerFunc(httpHandler))
}
func httpHandler(w http.ResponseWriter, r *http.Request) {
serverCodec := jsonrpc.NewServerCodec(&HttpConn{in: r.Body, out: w})
err := rpc.ServeRequest(serverCodec)
if err != nil {
log.Printf("Error while serving JSON request: %v", err)
http.Error(w, "Error while serving JSON request, details have been logged.", 500)
return
}
}