From 7bf7c2b7c3ae457e2bcbd1400bb52a7552ea22cf Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Thu, 10 May 2018 14:28:01 -0400 Subject: [PATCH] 9918: Don't mask http/network error with response body format error. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- sdk/go/arvados/client_test.go | 17 +++++++++++++++++ sdk/go/arvados/keep_service.go | 7 +++++++ sdk/go/arvados/keep_service_test.go | 27 +++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 sdk/go/arvados/keep_service_test.go diff --git a/sdk/go/arvados/client_test.go b/sdk/go/arvados/client_test.go index b0627fd27a..df938008d4 100644 --- a/sdk/go/arvados/client_test.go +++ b/sdk/go/arvados/client_test.go @@ -12,6 +12,7 @@ import ( "net/url" "sync" "testing" + "testing/iotest" ) type stubTransport struct { @@ -51,6 +52,22 @@ func (stub *errorTransport) RoundTrip(req *http.Request) (*http.Response, error) return nil, fmt.Errorf("something awful happened") } +type timeoutTransport struct { + response []byte +} + +func (stub *timeoutTransport) RoundTrip(req *http.Request) (*http.Response, error) { + return &http.Response{ + Status: "200 OK", + StatusCode: 200, + Proto: "HTTP/1.1", + ProtoMajor: 1, + ProtoMinor: 1, + Request: req, + Body: ioutil.NopCloser(iotest.TimeoutReader(bytes.NewReader(stub.response))), + }, nil +} + func TestCurrentUser(t *testing.T) { t.Parallel() stub := &stubTransport{ diff --git a/sdk/go/arvados/keep_service.go b/sdk/go/arvados/keep_service.go index 9797440205..0c866354aa 100644 --- a/sdk/go/arvados/keep_service.go +++ b/sdk/go/arvados/keep_service.go @@ -127,6 +127,13 @@ func (s *KeepService) index(c *Client, url string) ([]KeepServiceIndexEntry, err scanner := bufio.NewScanner(resp.Body) sawEOF := false for scanner.Scan() { + if scanner.Err() != nil { + // If we encounter a read error (timeout, + // connection failure), stop now and return it + // below, so it doesn't get masked by the + // ensuing "badly formatted response" error. + break + } if sawEOF { return nil, fmt.Errorf("Index response contained non-terminal blank line") } diff --git a/sdk/go/arvados/keep_service_test.go b/sdk/go/arvados/keep_service_test.go new file mode 100644 index 0000000000..8715f74f0b --- /dev/null +++ b/sdk/go/arvados/keep_service_test.go @@ -0,0 +1,27 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: Apache-2.0 + +package arvados + +import ( + "net/http" + + check "gopkg.in/check.v1" +) + +var _ = check.Suite(&KeepServiceSuite{}) + +type KeepServiceSuite struct{} + +func (*KeepServiceSuite) TestIndexTimeout(c *check.C) { + client := &Client{ + Client: &http.Client{ + Transport: &timeoutTransport{response: []byte("\n")}, + }, + APIHost: "zzzzz.arvadosapi.com", + AuthToken: "xyzzy", + } + _, err := (&KeepService{}).IndexMount(client, "fake", "") + c.Check(err, check.ErrorMatches, `.*timeout.*`) +} -- 2.30.2