@@ -10,61 +10,69 @@ import (
10
10
)
11
11
12
12
const (
13
+ READ_TIMEOUT = 15 // read timeout in seconds
13
14
MAX_REQUEST_SIZE = 1024 * 1024
14
15
MAX_RESPONSE_SIZE = 1024 * 1024
15
16
)
16
17
17
18
// Json serialization support
18
19
type JsonCodec struct {
19
- c net.Conn
20
- buffer []byte
21
- bytesInBuffer int
20
+ c net.Conn
22
21
}
23
22
24
23
// Create new JSON coder instance
25
24
func NewJsonCoder (conn net.Conn ) ApiCoder {
26
25
return & JsonCodec {
27
- c : conn ,
28
- buffer : make ([]byte , MAX_REQUEST_SIZE ),
29
- bytesInBuffer : 0 ,
26
+ c : conn ,
30
27
}
31
28
}
32
29
33
30
// Serialize obj to JSON and write it to conn
34
31
func (self * JsonCodec ) ReadRequest () (requests []* shared.Request , isBatch bool , err error ) {
35
- n , err := self .c .Read (self .buffer [self .bytesInBuffer :])
36
- if err != nil {
37
- self .bytesInBuffer = 0
32
+ bytesInBuffer := 0
33
+ buf := make ([]byte , MAX_REQUEST_SIZE )
34
+
35
+ deadline := time .Now ().Add (READ_TIMEOUT * time .Second )
36
+ if err := self .c .SetDeadline (deadline ); err != nil {
38
37
return nil , false , err
39
38
}
40
39
41
- self .bytesInBuffer += n
40
+ for {
41
+ n , err := self .c .Read (buf [bytesInBuffer :])
42
+ if err != nil {
43
+ self .c .Close ()
44
+ return nil , false , err
45
+ }
46
+
47
+ bytesInBuffer += n
42
48
43
- singleRequest := shared.Request {}
44
- err = json .Unmarshal (self .buffer [:self .bytesInBuffer ], & singleRequest )
45
- if err == nil {
46
- self .bytesInBuffer = 0
47
- requests := make ([]* shared.Request , 1 )
48
- requests [0 ] = & singleRequest
49
- return requests , false , nil
50
- }
49
+ singleRequest := shared.Request {}
50
+ err = json .Unmarshal (buf [:bytesInBuffer ], & singleRequest )
51
+ if err == nil {
52
+ requests := make ([]* shared.Request , 1 )
53
+ requests [0 ] = & singleRequest
54
+ return requests , false , nil
55
+ }
51
56
52
- requests = make ([]* shared.Request , 0 )
53
- err = json .Unmarshal (self . buffer [: self . bytesInBuffer ], & requests )
54
- if err == nil {
55
- self . bytesInBuffer = 0
56
- return requests , true , nil
57
+ requests = make ([]* shared.Request , 0 )
58
+ err = json .Unmarshal (buf [: bytesInBuffer ], & requests )
59
+ if err == nil {
60
+ return requests , true , nil
61
+ }
57
62
}
58
63
59
- return nil , false , err
64
+ self .c .Close () // timeout
65
+ return nil , false , fmt .Errorf ("Unable to read response" )
60
66
}
61
67
62
68
func (self * JsonCodec ) ReadResponse () (interface {}, error ) {
63
69
bytesInBuffer := 0
64
70
buf := make ([]byte , MAX_RESPONSE_SIZE )
65
71
66
- deadline := time .Now ().Add (15 * time .Second )
67
- self .c .SetDeadline (deadline )
72
+ deadline := time .Now ().Add (READ_TIMEOUT * time .Second )
73
+ if err := self .c .SetDeadline (deadline ); err != nil {
74
+ return nil , err
75
+ }
68
76
69
77
for {
70
78
n , err := self .c .Read (buf [bytesInBuffer :])
0 commit comments