diff --git a/amazon/validator.go b/amazon/validator.go index 0ac5f0e..5ef877a 100644 --- a/amazon/validator.go +++ b/amazon/validator.go @@ -101,13 +101,16 @@ func (c *Client) Verify(ctx context.Context, userID string, receiptID string) (I resp, err := c.httpCli.Do(req) if err != nil { - return result, fmt.Errorf("%v", err) + return result, err } defer resp.Body.Close() if resp.StatusCode < 200 || resp.StatusCode >= 300 { responseError := IAPResponseError{} err = json.NewDecoder(resp.Body).Decode(&responseError) + if err != nil { + return result, err + } return result, errors.New(responseError.Message) } diff --git a/amazon/validator_test.go b/amazon/validator_test.go index 986eeef..373ffc5 100644 --- a/amazon/validator_test.go +++ b/amazon/validator_test.go @@ -6,6 +6,7 @@ import ( "fmt" "net/http" "net/http/httptest" + "net/url" "os" "reflect" "testing" @@ -175,11 +176,17 @@ func TestVerifyTimeout(t *testing.T) { server, client := testTools(100, "timeout response") defer server.Close() - expected := errors.New("") ctx := context.Background() _, actual := client.Verify(ctx, "timeout", "timeout") - if !reflect.DeepEqual(reflect.TypeOf(actual), reflect.TypeOf(expected)) { - t.Errorf("got %v\nwant %v", actual, expected) + + // Actual should be a "request canceled" *url.Error + urlErr, ok := actual.(*url.Error) + if !ok { + t.Errorf("Expected *url.Error, got %T", actual) + } + + if !urlErr.Timeout() { + t.Errorf("got %v\nwant timeout", actual) } } diff --git a/appstore/validator.go b/appstore/validator.go index 1a0ff80..4786f01 100644 --- a/appstore/validator.go +++ b/appstore/validator.go @@ -98,7 +98,9 @@ func NewWithClient(client *http.Client) *Client { // Verify sends receipts and gets validation result func (c *Client) Verify(ctx context.Context, reqBody IAPRequest, result interface{}) error { b := new(bytes.Buffer) - json.NewEncoder(b).Encode(reqBody) + if err := json.NewEncoder(b).Encode(reqBody); err != nil { + return err + } req, err := http.NewRequest("POST", c.ProductionURL, b) if err != nil {