Fix unmarshaling of HTTP POST responses.
If connecting to a bitcoin RPC server as an HTTP POST client, full response objects rather than just the raw result bytes were being passed to the specific result unmarshalers, causing unmarshal errors for the incorrect JSON types. To fix this, first unmarshal the response body into a rawResponse, and pass only the raw result bytes (or an error) to the specific handlers. This was reported by nskelsey on IRC. ok @davecgh
This commit is contained in:
parent
aceaed82c5
commit
22b6af1400
1 changed files with 10 additions and 3 deletions
|
@ -271,7 +271,7 @@ func (r rawResponse) result() (result []byte, err error) {
|
||||||
// handleMessage is the main handler for incoming notifications and responses.
|
// handleMessage is the main handler for incoming notifications and responses.
|
||||||
func (c *Client) handleMessage(msg []byte) {
|
func (c *Client) handleMessage(msg []byte) {
|
||||||
// Attempt to unmarshal the message as either a notifiation or response.
|
// Attempt to unmarshal the message as either a notifiation or response.
|
||||||
in := inMessage{}
|
var in inMessage
|
||||||
err := json.Unmarshal(msg, &in)
|
err := json.Unmarshal(msg, &in)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("Remote server sent invalid message: %v", err)
|
log.Warnf("Remote server sent invalid message: %v", err)
|
||||||
|
@ -618,12 +618,19 @@ func (c *Client) handleSendPostMessage(details *sendPostDetails) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the raw bytes and close the response.
|
// Read the raw bytes and close the response.
|
||||||
resp, err := btcjson.GetRaw(httpResponse.Body)
|
respBytes, err := btcjson.GetRaw(httpResponse.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
details.responseChan <- &response{result: nil, err: err}
|
details.responseChan <- &response{result: nil, err: err}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
details.responseChan <- &response{result: resp, err: nil}
|
var resp rawResponse
|
||||||
|
err = json.Unmarshal(respBytes, &resp)
|
||||||
|
if err != nil {
|
||||||
|
details.responseChan <- &response{result: nil, err: err}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := resp.result()
|
||||||
|
details.responseChan <- &response{result: res, err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
// sendPostHandler handles all outgoing messages when the client is running
|
// sendPostHandler handles all outgoing messages when the client is running
|
||||||
|
|
Loading…
Reference in a new issue