9918: Don't mask http/network error with response body format error.
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 10 May 2018 20:05:30 +0000 (16:05 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 10 May 2018 20:05:30 +0000 (16:05 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/client_test.go
sdk/go/arvados/keep_service.go
sdk/go/arvados/keep_service_test.go [new file with mode: 0644]

index b0627fd27a665bf26250892c3fabd3319ff4e489..df938008d49756b850ca6e5ce5abee8a0510e2a3 100644 (file)
@@ -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{
index 9797440205cf3d8396d14ec389e380b2260486b2..0c866354aa9b1e3a34833f15018b66613d40bdb4 100644 (file)
@@ -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 (file)
index 0000000..8715f74
--- /dev/null
@@ -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.*`)
+}