10795: For md5(""), skip the request and just return an empty reader.
authorTom Clegg <tom@curoverse.com>
Tue, 3 Jan 2017 21:35:58 +0000 (16:35 -0500)
committerTom Clegg <tom@curoverse.com>
Tue, 3 Jan 2017 21:35:58 +0000 (16:35 -0500)
sdk/go/keepclient/keepclient.go
sdk/go/keepclient/keepclient_test.go

index 79a87156a6cd829a87cd77a2ba357ce1484a4cdc..baf4bac02444170446c91a61c0b7469813bf308c 100644 (file)
@@ -167,6 +167,10 @@ func (kc *KeepClient) PutR(r io.Reader) (locator string, replicas int, err error
 }
 
 func (kc *KeepClient) getOrHead(method string, locator string) (io.ReadCloser, int64, string, error) {
+       if strings.HasPrefix(locator, "d41d8cd98f00b204e9800998ecf8427e+0") {
+               return ioutil.NopCloser(bytes.NewReader(nil)), 0, "", nil
+       }
+
        var errs []string
 
        tries_remaining := 1 + kc.Retries
index 2c89be11b2944d2e244c4bb50a00de87cea3bb42..f0da600c24187f05cb3e8b2ab97512677c072794 100644 (file)
@@ -505,6 +505,27 @@ func (s *StandaloneSuite) TestGet404(c *C) {
        c.Check(r, Equals, nil)
 }
 
+func (s *StandaloneSuite) TestGetEmptyBlock(c *C) {
+       st := Error404Handler{make(chan string, 1)}
+
+       ks := RunFakeKeepServer(st)
+       defer ks.listener.Close()
+
+       arv, err := arvadosclient.MakeArvadosClient()
+       kc, _ := MakeKeepClient(arv)
+       arv.ApiToken = "abc123"
+       kc.SetServiceRoots(map[string]string{"x": ks.url}, nil, nil)
+
+       r, n, url2, err := kc.Get("d41d8cd98f00b204e9800998ecf8427e+0")
+       c.Check(err, IsNil)
+       c.Check(n, Equals, int64(0))
+       c.Check(url2, Equals, "")
+       c.Assert(r, NotNil)
+       buf, err := ioutil.ReadAll(r)
+       c.Check(err, IsNil)
+       c.Check(buf, DeepEquals, []byte{})
+}
+
 func (s *StandaloneSuite) TestGetFail(c *C) {
        hash := fmt.Sprintf("%x", md5.Sum([]byte("foo")))