aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/codec
diff options
context:
space:
mode:
authorBas van Kervel <bas@ethdev.com>2015-08-07 15:56:49 +0800
committerBas van Kervel <bas@ethdev.com>2015-08-12 18:22:16 +0800
commitf9cbd16f27e393d4937354ee31435e0a2f689484 (patch)
tree0b9668443084923b2b264cd0fb1b1b8c604cf1d6 /rpc/codec
parent2fcf7f1241648dc2c0ed90a122c5945f25b3ce1a (diff)
downloadgo-tangerine-f9cbd16f27e393d4937354ee31435e0a2f689484.tar.gz
go-tangerine-f9cbd16f27e393d4937354ee31435e0a2f689484.tar.zst
go-tangerine-f9cbd16f27e393d4937354ee31435e0a2f689484.zip
support for user agents
Diffstat (limited to 'rpc/codec')
-rw-r--r--rpc/codec/codec.go2
-rw-r--r--rpc/codec/json.go39
2 files changed, 25 insertions, 16 deletions
diff --git a/rpc/codec/codec.go b/rpc/codec/codec.go
index 2fdb0d8f3..786080b44 100644
--- a/rpc/codec/codec.go
+++ b/rpc/codec/codec.go
@@ -31,6 +31,8 @@ type ApiCoder interface {
ReadRequest() ([]*shared.Request, bool, error)
// Parse response message from underlying stream
ReadResponse() (interface{}, error)
+ // Read raw message from underlying stream
+ Recv() (interface{}, error)
// Encode response to encoded form in underlying stream
WriteResponse(interface{}) error
// Decode single message from data
diff --git a/rpc/codec/json.go b/rpc/codec/json.go
index d811b2096..cfc449143 100644
--- a/rpc/codec/json.go
+++ b/rpc/codec/json.go
@@ -21,6 +21,7 @@ import (
"fmt"
"net"
"time"
+ "strings"
"github.com/ethereum/go-ethereum/rpc/shared"
)
@@ -73,35 +74,41 @@ func (self *JsonCodec) ReadRequest() (requests []*shared.Request, isBatch bool,
return nil, false, err
}
-func (self *JsonCodec) ReadResponse() (interface{}, error) {
- bytesInBuffer := 0
- buf := make([]byte, MAX_RESPONSE_SIZE)
+func (self *JsonCodec) Recv() (interface{}, error) {
+ var msg json.RawMessage
+ err := self.d.Decode(&msg)
+ if err != nil {
+ self.c.Close()
+ return nil, err
+ }
- deadline := time.Now().Add(READ_TIMEOUT * time.Second)
- if err := self.c.SetDeadline(deadline); err != nil {
+ return msg, err
+}
+
+func (self *JsonCodec) ReadResponse() (interface{}, error) {
+ in, err := self.Recv()
+ if err != nil {
return nil, err
}
- for {
- n, err := self.c.Read(buf[bytesInBuffer:])
- if err != nil {
- return nil, err
+ if msg, ok := in.(json.RawMessage); ok {
+ var req *shared.Request
+ if err = json.Unmarshal(msg, &req); err == nil && strings.HasPrefix(req.Method, "agent_") {
+ return req, nil
}
- bytesInBuffer += n
- var failure shared.ErrorResponse
- if err = json.Unmarshal(buf[:bytesInBuffer], &failure); err == nil && failure.Error != nil {
+ var failure *shared.ErrorResponse
+ if err = json.Unmarshal(msg, &failure); err == nil && failure.Error != nil {
return failure, fmt.Errorf(failure.Error.Message)
}
- var success shared.SuccessResponse
- if err = json.Unmarshal(buf[:bytesInBuffer], &success); err == nil {
+ var success *shared.SuccessResponse
+ if err = json.Unmarshal(msg, &success); err == nil {
return success, nil
}
}
- self.c.Close()
- return nil, fmt.Errorf("Unable to read response")
+ return in, err
}
// Decode data