@@ -8,33 +8,53 @@ import (
8
8
)
9
9
10
10
const (
11
- MAX_RESPONSE_SIZE = 64 * 1024
11
+ MAX_REQUEST_SIZE = 1024 * 1024
12
+ MAX_RESPONSE_SIZE = 1024 * 1024
12
13
)
13
14
14
15
// Json serialization support
15
16
type JsonCodec struct {
16
17
c net.Conn
17
- d * json. Decoder
18
- e * json. Encoder
18
+ buffer [] byte
19
+ bytesInBuffer int
19
20
}
20
21
21
22
// Create new JSON coder instance
22
23
func NewJsonCoder (conn net.Conn ) ApiCoder {
23
24
return & JsonCodec {
24
25
c : conn ,
25
- d : json . NewDecoder ( conn ),
26
- e : json . NewEncoder ( conn ) ,
26
+ buffer : make ([] byte , MAX_REQUEST_SIZE ),
27
+ bytesInBuffer : 0 ,
27
28
}
28
29
}
29
30
30
31
// Serialize obj to JSON and write it to conn
31
- func (self * JsonCodec ) ReadRequest () (* shared.Request , error ) {
32
- req := shared.Request {}
33
- err := self .d .Decode (& req )
32
+ func (self * JsonCodec ) ReadRequest () (requests []* shared.Request , isBatch bool , err error ) {
33
+ n , err := self .c .Read (self .buffer [self .bytesInBuffer :])
34
+ if err != nil {
35
+ self .bytesInBuffer = 0
36
+ return nil , false , err
37
+ }
38
+
39
+ self .bytesInBuffer += n
40
+
41
+ singleRequest := shared.Request {}
42
+ err = json .Unmarshal (self .buffer [:self .bytesInBuffer ], & singleRequest )
34
43
if err == nil {
35
- return & req , nil
44
+ self .bytesInBuffer = 0
45
+ requests := make ([]* shared.Request , 1 )
46
+ requests [0 ] = & singleRequest
47
+ return requests , false , nil
36
48
}
37
- return nil , err
49
+
50
+ requests = make ([]* shared.Request , 0 )
51
+ err = json .Unmarshal (self .buffer [:self .bytesInBuffer ], & requests )
52
+ if err == nil {
53
+ self .bytesInBuffer = 0
54
+ return requests , true , nil
55
+ }
56
+
57
+ return nil , false , err
38
58
}
39
59
40
60
func (self * JsonCodec ) ReadResponse () (interface {}, error ) {
@@ -66,7 +86,24 @@ func (self *JsonCodec) Encode(msg interface{}) ([]byte, error) {
66
86
67
87
// Parse JSON data from conn to obj
68
88
func (self * JsonCodec ) WriteResponse (res interface {}) error {
69
- return self .e .Encode (& res )
89
+ data , err := json .Marshal (res )
90
+ if err != nil {
91
+ self .c .Close ()
92
+ return err
93
+ }
94
+
95
+ bytesWritten := 0
96
+
97
+ for bytesWritten < len (data ) {
98
+ n , err := self .c .Write (data [bytesWritten :])
99
+ if err != nil {
100
+ self .c .Close ()
101
+ return err
102
+ }
103
+ bytesWritten += n
104
+ }
105
+
106
+ return nil
70
107
}
71
108
72
109
// Close decoder and encoder
0 commit comments