Newer
Older
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
package main
import (
"bufio"
"errors"
"fmt"
"io"
"log"
"net/rpc"
"reflect"
)
type scodec struct {
rwc io.ReadWriteCloser
ebuf *bufio.Writer
payloadLen int32
}
func (c *scodec) ReadRequestHeader(r *rpc.Request) error {
var err error
if err = parseHeader(c.rwc, &r.Seq,
&r.ServiceMethod, &c.payloadLen); err != nil {
return err
}
fmt.Println("server using custom codec to read header")
fmt.Println("server method called:", r.ServiceMethod)
fmt.Println("server method called:", r.Seq)
return nil
}
func (c *scodec) ReadRequestBody(data interface{}) error {
if data == nil {
log.Fatal("Why is data nil here?")
}
value := reflect.ValueOf(data)
if value.Type().Kind() != reflect.Ptr {
log.Fatal("Should of of type pointer")
}
b := make([]byte, c.payloadLen)
n, err := c.rwc.Read(b)
fmt.Printf("Worker read n bytes: %v %s\n", n, string(b))
if err != nil {
log.Fatal("server", err)
}
if n != int(c.payloadLen) {
return errors.New("Server unable to read request.")
}
query := data.(*Query)
query.d = b
return nil
}
func (c *scodec) WriteResponse(resp *rpc.Response, data interface{}) error {
if len(resp.Error) > 0 {
log.Fatal("Response has error: " + resp.Error)
}
if data == nil {
log.Fatal("Worker write response data is nil")
}
reply, ok := data.(*Reply)
if !ok {
log.Fatal("Unable to convert to reply")
}
if err := writeHeader(c.rwc, resp.Seq,
resp.ServiceMethod, reply.d); err != nil {
return err
}
_, err := c.rwc.Write(reply.d)
return err
}
func (c *scodec) Close() error {
return c.rwc.Close()
}