Remove httputil.CloseBody relic.

This commit is contained in:
Brad Fitzpatrick 2015-11-23 19:02:10 -08:00
parent fe71c93af6
commit 9868aa0f8d
6 changed files with 7 additions and 100 deletions

View File

@ -25,7 +25,6 @@ import (
"sync"
"camlistore.org/pkg/context"
"camlistore.org/pkg/httputil"
"camlistore.org/pkg/singleflight"
)
@ -63,7 +62,7 @@ func Lookup(ctx *context.Context, address string) ([]Rect, error) {
if err != nil {
return nil, err
}
defer httputil.CloseBody(res.Body)
defer res.Body.Close()
rects, err := decodeGoogleResponse(res.Body)
log.Printf("Google geocode lookup (%q) = %#v, %v", address, rects, err)
if err == nil {

View File

@ -34,7 +34,6 @@ import (
"unicode/utf8"
"camlistore.org/pkg/blob"
"camlistore.org/pkg/httputil"
"golang.org/x/net/context"
"golang.org/x/oauth2"
@ -308,7 +307,7 @@ func (gsa *Client) EnumerateObjects(bucket, after string, limit int) ([]SizedObj
var xres struct {
Contents []SizedObject
}
defer httputil.CloseBody(resp.Body)
defer resp.Body.Close()
if err = xml.NewDecoder(resp.Body).Decode(&xres); err != nil {
return nil, err
}

View File

@ -294,7 +294,7 @@ func putBuf(b *bytes.Buffer) {
// res.Body.
// It defensively caps the JSON at 8 MB for now.
func DecodeJSON(res *http.Response, dest interface{}) error {
defer CloseBody(res.Body)
defer res.Body.Close()
buf := getBuf()
defer putBuf(buf)
if err := json.NewDecoder(io.TeeReader(io.LimitReader(res.Body, 8<<20), buf)).Decode(dest); err != nil {
@ -303,35 +303,6 @@ func DecodeJSON(res *http.Response, dest interface{}) error {
return nil
}
// CloseBody should be used to close an http.Response.Body.
//
// It does a final little Read to maybe see EOF (to trigger connection
// re-use) before calling Close.
func CloseBody(rc io.ReadCloser) {
// Go 1.2 pseudo-bug: the NewDecoder(res.Body).Decode never
// sees an EOF, so we have to do this 0-byte copy here to
// force the http Transport to see its own EOF and recycle the
// connection. In Go 1.1 at least, the Close would cause it to
// read to EOF and recycle the connection, but in Go 1.2, a
// Close before EOF kills the underlying TCP connection.
//
// Will hopefully be fixed in Go 1.3, at least for bodies with
// Content-Length. Or maybe Go 1.3's Close itself would look
// to see if we're at EOF even if it hasn't been Read.
// TODO: use a bytepool package somewhere for this byte?
// Justification for 3 byte reads: two for up to "\r\n" after
// a JSON/XML document, and then 1 to see EOF if we haven't yet.
buf := make([]byte, 1)
for i := 0; i < 3; i++ {
_, err := rc.Read(buf)
if err != nil {
break
}
}
rc.Close()
}
func IsWebsocketUpgrade(req *http.Request) bool {
return req.Method == "GET" && req.Header.Get("Upgrade") == "websocket"
}

View File

@ -1,61 +0,0 @@
/*
Copyright 2014 The Camlistore Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package httputil
import (
"io"
"net/http"
"net/http/httptest"
"strconv"
"testing"
)
func TestCloseBody(t *testing.T) {
const msg = "{\"foo\":\"bar\"}\r\n"
addrSeen := make(map[string]int)
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
addrSeen[r.RemoteAddr]++
w.Header().Set("Content-Length", strconv.Itoa(len(msg)))
w.WriteHeader(200)
w.Write([]byte(msg))
}))
defer ts.Close()
buf := make([]byte, len(msg))
for _, trim := range []int{0, 2} {
for i := 0; i < 3; i++ {
res, err := http.Get(ts.URL)
if err != nil {
t.Errorf("Get: %v", err)
continue
}
want := len(buf) - trim
n, err := res.Body.Read(buf[:want])
CloseBody(res.Body)
if n != want {
t.Errorf("Read = %v; want %v", n, want)
}
if err != nil && err != io.EOF {
t.Errorf("Read = %v", err)
}
}
}
if len(addrSeen) != 1 {
t.Errorf("server saw %d distinct client addresses; want 1", len(addrSeen))
}
}

View File

@ -200,7 +200,7 @@ func doGet(ctx *context.Context, url string) ([]byte, error) {
log.Printf("Error fetching %s: %v", url, err)
return nil, err
}
defer httputil.CloseBody(res.Body)
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Get request on %s failed with: %s", url, res.Status)
}

View File

@ -37,7 +37,6 @@ import (
"time"
"camlistore.org/pkg/blob"
"camlistore.org/pkg/httputil"
)
const maxList = 1000
@ -88,7 +87,7 @@ func (c *Client) Buckets() ([]*Bucket, error) {
if err != nil {
return nil, err
}
defer httputil.CloseBody(res.Body)
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return nil, fmt.Errorf("s3: Unexpected status code %d fetching bucket list", res.StatusCode)
}
@ -145,7 +144,7 @@ func (c *Client) PutObject(key, bucket string, md5 hash.Hash, size int64, body i
res, err := c.transport().RoundTrip(req)
if res != nil && res.Body != nil {
defer httputil.CloseBody(res.Body)
defer res.Body.Close()
}
if err != nil {
return err
@ -251,7 +250,7 @@ func (c *Client) ListBucket(bucket string, startAt string, maxKeys int) (items [
log.Print(err)
}
}
httputil.CloseBody(res.Body)
res.Body.Close()
if err != nil {
if try < maxTries-1 {
continue