Commit 3479bb6c authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

ioutil: add NopCloser

R=rsc, dsymonds
CC=golang-dev
https://golang.org/cl/4278044
parent 1c96562f
...@@ -19,6 +19,7 @@ import ( ...@@ -19,6 +19,7 @@ import (
"hash/crc32" "hash/crc32"
"encoding/binary" "encoding/binary"
"io" "io"
"io/ioutil"
"os" "os"
) )
...@@ -109,7 +110,7 @@ func (f *File) Open() (rc io.ReadCloser, err os.Error) { ...@@ -109,7 +110,7 @@ func (f *File) Open() (rc io.ReadCloser, err os.Error) {
r := io.NewSectionReader(f.zipr, off+f.bodyOffset, size) r := io.NewSectionReader(f.zipr, off+f.bodyOffset, size)
switch f.Method { switch f.Method {
case 0: // store (no compression) case 0: // store (no compression)
rc = nopCloser{r} rc = ioutil.NopCloser(r)
case 8: // DEFLATE case 8: // DEFLATE
rc = flate.NewReader(r) rc = flate.NewReader(r)
default: default:
...@@ -147,12 +148,6 @@ func (r *checksumReader) Read(b []byte) (n int, err os.Error) { ...@@ -147,12 +148,6 @@ func (r *checksumReader) Read(b []byte) (n int, err os.Error) {
func (r *checksumReader) Close() os.Error { return r.rc.Close() } func (r *checksumReader) Close() os.Error { return r.rc.Close() }
type nopCloser struct {
io.Reader
}
func (f nopCloser) Close() os.Error { return nil }
func readFileHeader(f *File, r io.Reader) (err os.Error) { func readFileHeader(f *File, r io.Reader) (err os.Error) {
defer func() { defer func() {
if rerr, ok := recover().(os.Error); ok { if rerr, ok := recover().(os.Error); ok {
......
...@@ -12,6 +12,7 @@ import ( ...@@ -12,6 +12,7 @@ import (
"fmt" "fmt"
"http" "http"
"io" "io"
"io/ioutil"
"os" "os"
"strconv" "strconv"
"strings" "strings"
...@@ -67,7 +68,7 @@ func requestFromEnvironment(env map[string]string) (*http.Request, os.Error) { ...@@ -67,7 +68,7 @@ func requestFromEnvironment(env map[string]string) (*http.Request, os.Error) {
return nil, os.NewError("cgi: bad CONTENT_LENGTH in environment: " + lenstr) return nil, os.NewError("cgi: bad CONTENT_LENGTH in environment: " + lenstr)
} }
r.ContentLength = clen r.ContentLength = clen
r.Body = nopCloser{io.LimitReader(os.Stdin, clen)} r.Body = ioutil.NopCloser(io.LimitReader(os.Stdin, clen))
} }
// Copy "HTTP_FOO_BAR" variables to "Foo-Bar" Headers // Copy "HTTP_FOO_BAR" variables to "Foo-Bar" Headers
...@@ -103,13 +104,6 @@ func requestFromEnvironment(env map[string]string) (*http.Request, os.Error) { ...@@ -103,13 +104,6 @@ func requestFromEnvironment(env map[string]string) (*http.Request, os.Error) {
return r, nil return r, nil
} }
// TODO: move this to ioutil or something. It's copy/pasted way too often.
type nopCloser struct {
io.Reader
}
func (nopCloser) Close() os.Error { return nil }
// Serve executes the provided Handler on the currently active CGI // Serve executes the provided Handler on the currently active CGI
// request, if any. If there's no current CGI environment // request, if any. If there's no current CGI environment
// an error is returned. The provided handler may be nil to use // an error is returned. The provided handler may be nil to use
......
...@@ -11,6 +11,7 @@ import ( ...@@ -11,6 +11,7 @@ import (
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"os" "os"
"strconv" "strconv"
"strings" "strings"
...@@ -235,7 +236,7 @@ func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, ...@@ -235,7 +236,7 @@ func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response,
req.ProtoMajor = 1 req.ProtoMajor = 1
req.ProtoMinor = 1 req.ProtoMinor = 1
req.Close = true req.Close = true
req.Body = nopCloser{body} req.Body = ioutil.NopCloser(body)
req.Header = Header{ req.Header = Header{
"Content-Type": {bodyType}, "Content-Type": {bodyType},
} }
...@@ -270,7 +271,7 @@ func (c *Client) PostForm(url string, data map[string]string) (r *Response, err ...@@ -270,7 +271,7 @@ func (c *Client) PostForm(url string, data map[string]string) (r *Response, err
req.ProtoMinor = 1 req.ProtoMinor = 1
req.Close = true req.Close = true
body := urlencode(data) body := urlencode(data)
req.Body = nopCloser{body} req.Body = ioutil.NopCloser(body)
req.Header = Header{ req.Header = Header{
"Content-Type": {"application/x-www-form-urlencoded"}, "Content-Type": {"application/x-www-form-urlencoded"},
"Content-Length": {strconv.Itoa(body.Len())}, "Content-Length": {strconv.Itoa(body.Len())},
...@@ -310,9 +311,3 @@ func (c *Client) Head(url string) (r *Response, err os.Error) { ...@@ -310,9 +311,3 @@ func (c *Client) Head(url string) (r *Response, err os.Error) {
} }
return send(&req, c.Transport) return send(&req, c.Transport)
} }
type nopCloser struct {
io.Reader
}
func (nopCloser) Close() os.Error { return nil }
...@@ -7,10 +7,10 @@ package http ...@@ -7,10 +7,10 @@ package http
import ( import (
"bytes" "bytes"
"io" "io"
"io/ioutil"
"os" "os"
) )
// One of the copies, say from b to r2, could be avoided by using a more // One of the copies, say from b to r2, could be avoided by using a more
// elaborate trick where the other copy is made during Request/Response.Write. // elaborate trick where the other copy is made during Request/Response.Write.
// This would complicate things too much, given that these functions are for // This would complicate things too much, given that these functions are for
...@@ -23,7 +23,7 @@ func drainBody(b io.ReadCloser) (r1, r2 io.ReadCloser, err os.Error) { ...@@ -23,7 +23,7 @@ func drainBody(b io.ReadCloser) (r1, r2 io.ReadCloser, err os.Error) {
if err = b.Close(); err != nil { if err = b.Close(); err != nil {
return nil, nil, err return nil, nil, err
} }
return nopCloser{&buf}, nopCloser{bytes.NewBuffer(buf.Bytes())}, nil return ioutil.NopCloser(&buf), ioutil.NopCloser(bytes.NewBuffer(buf.Bytes())), nil
} }
// DumpRequest returns the wire representation of req, // DumpRequest returns the wire representation of req,
......
...@@ -6,6 +6,7 @@ package http ...@@ -6,6 +6,7 @@ package http
import ( import (
"bytes" "bytes"
"io/ioutil"
"testing" "testing"
) )
...@@ -158,7 +159,7 @@ func TestRequestWrite(t *testing.T) { ...@@ -158,7 +159,7 @@ func TestRequestWrite(t *testing.T) {
for i := range reqWriteTests { for i := range reqWriteTests {
tt := &reqWriteTests[i] tt := &reqWriteTests[i]
if tt.Body != nil { if tt.Body != nil {
tt.Req.Body = nopCloser{bytes.NewBuffer(tt.Body)} tt.Req.Body = ioutil.NopCloser(bytes.NewBuffer(tt.Body))
} }
var braw bytes.Buffer var braw bytes.Buffer
err := tt.Req.Write(&braw) err := tt.Req.Write(&braw)
...@@ -173,7 +174,7 @@ func TestRequestWrite(t *testing.T) { ...@@ -173,7 +174,7 @@ func TestRequestWrite(t *testing.T) {
} }
if tt.Body != nil { if tt.Body != nil {
tt.Req.Body = nopCloser{bytes.NewBuffer(tt.Body)} tt.Req.Body = ioutil.NopCloser(bytes.NewBuffer(tt.Body))
} }
var praw bytes.Buffer var praw bytes.Buffer
err = tt.Req.WriteProxy(&praw) err = tt.Req.WriteProxy(&praw)
......
...@@ -6,6 +6,7 @@ package http ...@@ -6,6 +6,7 @@ package http
import ( import (
"bytes" "bytes"
"io/ioutil"
"testing" "testing"
) )
...@@ -23,7 +24,7 @@ var respWriteTests = []respWriteTest{ ...@@ -23,7 +24,7 @@ var respWriteTests = []respWriteTest{
ProtoMinor: 0, ProtoMinor: 0,
RequestMethod: "GET", RequestMethod: "GET",
Header: Header{}, Header: Header{},
Body: nopCloser{bytes.NewBufferString("abcdef")}, Body: ioutil.NopCloser(bytes.NewBufferString("abcdef")),
ContentLength: 6, ContentLength: 6,
}, },
...@@ -39,7 +40,7 @@ var respWriteTests = []respWriteTest{ ...@@ -39,7 +40,7 @@ var respWriteTests = []respWriteTest{
ProtoMinor: 0, ProtoMinor: 0,
RequestMethod: "GET", RequestMethod: "GET",
Header: Header{}, Header: Header{},
Body: nopCloser{bytes.NewBufferString("abcdef")}, Body: ioutil.NopCloser(bytes.NewBufferString("abcdef")),
ContentLength: -1, ContentLength: -1,
}, },
"HTTP/1.0 200 OK\r\n" + "HTTP/1.0 200 OK\r\n" +
...@@ -54,7 +55,7 @@ var respWriteTests = []respWriteTest{ ...@@ -54,7 +55,7 @@ var respWriteTests = []respWriteTest{
ProtoMinor: 1, ProtoMinor: 1,
RequestMethod: "GET", RequestMethod: "GET",
Header: Header{}, Header: Header{},
Body: nopCloser{bytes.NewBufferString("abcdef")}, Body: ioutil.NopCloser(bytes.NewBufferString("abcdef")),
ContentLength: 6, ContentLength: 6,
TransferEncoding: []string{"chunked"}, TransferEncoding: []string{"chunked"},
Close: true, Close: true,
......
...@@ -90,3 +90,15 @@ func ReadDir(dirname string) ([]*os.FileInfo, os.Error) { ...@@ -90,3 +90,15 @@ func ReadDir(dirname string) ([]*os.FileInfo, os.Error) {
sort.Sort(fi) sort.Sort(fi)
return fi, nil return fi, nil
} }
type nopCloser struct {
io.Reader
}
func (nopCloser) Close() os.Error { return nil }
// NopCloser returns a ReadCloser with a no-op Close method wrapping
// the provided Reader r.
func NopCloser(r io.Reader) io.ReadCloser {
return nopCloser{r}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment