76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package codec
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"encoding/json"
							 | 
						||
| 
								 | 
							
									"net"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/ethereum/go-ethereum/rpc/shared"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const (
							 | 
						||
| 
								 | 
							
									MAX_RESPONSE_SIZE = 64 * 1024
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Json serialization support
							 | 
						||
| 
								 | 
							
								type JsonCodec struct {
							 | 
						||
| 
								 | 
							
									c net.Conn
							 | 
						||
| 
								 | 
							
									d *json.Decoder
							 | 
						||
| 
								 | 
							
									e *json.Encoder
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Create new JSON coder instance
							 | 
						||
| 
								 | 
							
								func NewJsonCoder(conn net.Conn) ApiCoder {
							 | 
						||
| 
								 | 
							
									return &JsonCodec{
							 | 
						||
| 
								 | 
							
										c: conn,
							 | 
						||
| 
								 | 
							
										d: json.NewDecoder(conn),
							 | 
						||
| 
								 | 
							
										e: json.NewEncoder(conn),
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Serialize obj to JSON and write it to conn
							 | 
						||
| 
								 | 
							
								func (self *JsonCodec) ReadRequest() (*shared.Request, error) {
							 | 
						||
| 
								 | 
							
									req := shared.Request{}
							 | 
						||
| 
								 | 
							
									err := self.d.Decode(&req)
							 | 
						||
| 
								 | 
							
									if err == nil {
							 | 
						||
| 
								 | 
							
										return &req, nil
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return nil, err
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (self *JsonCodec) ReadResponse() (interface{}, error) {
							 | 
						||
| 
								 | 
							
									var err error
							 | 
						||
| 
								 | 
							
									buf := make([]byte, MAX_RESPONSE_SIZE)
							 | 
						||
| 
								 | 
							
									n, _ := self.c.Read(buf)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var failure shared.ErrorResponse
							 | 
						||
| 
								 | 
							
									if err = json.Unmarshal(buf[:n], &failure); err == nil && failure.Error != nil {
							 | 
						||
| 
								 | 
							
										return failure, nil
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var success shared.SuccessResponse
							 | 
						||
| 
								 | 
							
									if err = json.Unmarshal(buf[:n], &success); err == nil {
							 | 
						||
| 
								 | 
							
										return success, nil
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return nil, err
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Encode response to encoded form in underlying stream
							 | 
						||
| 
								 | 
							
								func (self *JsonCodec) Decode(data []byte, msg interface{}) error {
							 | 
						||
| 
								 | 
							
									return json.Unmarshal(data, msg)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (self *JsonCodec) Encode(msg interface{}) ([]byte, error) {
							 | 
						||
| 
								 | 
							
									return json.Marshal(msg)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Parse JSON data from conn to obj
							 | 
						||
| 
								 | 
							
								func (self *JsonCodec) WriteResponse(res interface{}) error {
							 | 
						||
| 
								 | 
							
									return self.e.Encode(&res)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Close decoder and encoder
							 | 
						||
| 
								 | 
							
								func (self *JsonCodec) Close() {
							 | 
						||
| 
								 | 
							
									self.c.Close()
							 | 
						||
| 
								 | 
							
								}
							 |