@@ -2,28 +2,30 @@ package codec
2
2
3
3
import (
4
4
"encoding/json"
5
+ "fmt"
5
6
"net"
7
+ "time"
6
8
7
9
"github.com/ethereum/go-ethereum/rpc/shared"
8
10
)
9
11
10
12
const (
11
- MAX_REQUEST_SIZE = 1024 * 1024
13
+ MAX_REQUEST_SIZE = 1024 * 1024
12
14
MAX_RESPONSE_SIZE = 1024 * 1024
13
15
)
14
16
15
17
// Json serialization support
16
18
type JsonCodec struct {
17
- c net.Conn
18
- buffer []byte
19
+ c net.Conn
20
+ buffer []byte
19
21
bytesInBuffer int
20
22
}
21
23
22
24
// Create new JSON coder instance
23
25
func NewJsonCoder (conn net.Conn ) ApiCoder {
24
26
return & JsonCodec {
25
- c : conn ,
26
- buffer : make ([]byte , MAX_REQUEST_SIZE ),
27
+ c : conn ,
28
+ buffer : make ([]byte , MAX_REQUEST_SIZE ),
27
29
bytesInBuffer : 0 ,
28
30
}
29
31
}
@@ -58,28 +60,40 @@ func (self *JsonCodec) ReadRequest() (requests []*shared.Request, isBatch bool,
58
60
}
59
61
60
62
func (self * JsonCodec ) ReadResponse () (interface {}, error ) {
61
- var err error
63
+ bytesInBuffer := 0
62
64
buf := make ([]byte , MAX_RESPONSE_SIZE )
63
- n , _ := self .c .Read (buf )
64
65
65
- var failure shared.ErrorResponse
66
- if err = json .Unmarshal (buf [:n ], & failure ); err == nil && failure .Error != nil {
67
- return failure , nil
68
- }
66
+ deadline := time .Now ().Add (15 * time .Second )
67
+ self .c .SetDeadline (deadline )
68
+
69
+ for {
70
+ n , err := self .c .Read (buf [bytesInBuffer :])
71
+ if err != nil {
72
+ return nil , err
73
+ }
74
+ bytesInBuffer += n
69
75
70
- var success shared.SuccessResponse
71
- if err = json .Unmarshal (buf [:n ], & success ); err == nil {
72
- return success , nil
76
+ var success shared.SuccessResponse
77
+ if err = json .Unmarshal (buf [:bytesInBuffer ], & success ); err == nil {
78
+ return success , nil
79
+ }
80
+
81
+ var failure shared.ErrorResponse
82
+ if err = json .Unmarshal (buf [:bytesInBuffer ], & failure ); err == nil && failure .Error != nil {
83
+ return failure , nil
84
+ }
73
85
}
74
86
75
- return nil , err
87
+ self .c .Close ()
88
+ return nil , fmt .Errorf ("Unable to read response" )
76
89
}
77
90
78
- // Encode response to encoded form in underlying stream
91
+ // Decode data
79
92
func (self * JsonCodec ) Decode (data []byte , msg interface {}) error {
80
93
return json .Unmarshal (data , msg )
81
94
}
82
95
96
+ // Encode message
83
97
func (self * JsonCodec ) Encode (msg interface {}) ([]byte , error ) {
84
98
return json .Marshal (msg )
85
99
}
0 commit comments