summaryrefslogtreecommitdiff
path: root/src/pkg/http/request.go
diff options
context:
space:
mode:
authorPetar Maymounkov <petarm@gmail.com>2010-02-04 00:23:01 -0800
committerPetar Maymounkov <petarm@gmail.com>2010-02-04 00:23:01 -0800
commit3b10ff828f4e2839c2aa382db8fbbb3cafd34e55 (patch)
tree07a2d9043219fcfc8d4834acd3bb32f17f8e50dc /src/pkg/http/request.go
parente46080a88e67e424418311e939cd8a2afe226a4c (diff)
downloadgolang-3b10ff828f4e2839c2aa382db8fbbb3cafd34e55.tar.gz
http: use ChunkWriter in Request.Write
R=rsc CC=golang-dev http://codereview.appspot.com/196079 Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/pkg/http/request.go')
-rw-r--r--src/pkg/http/request.go42
1 files changed, 15 insertions, 27 deletions
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go
index c84622d06..0c8748586 100644
--- a/src/pkg/http/request.go
+++ b/src/pkg/http/request.go
@@ -128,7 +128,7 @@ const defaultUserAgent = "Go http package"
// Write writes an HTTP/1.1 request -- header and body -- in wire format.
// This method consults the following fields of req:
-// Host
+// Host
// URL
// Method (defaults to "GET")
// UserAgent (defaults to defaultUserAgent)
@@ -181,33 +181,21 @@ func (req *Request) Write(w io.Writer) os.Error {
io.WriteString(w, "\r\n")
if req.Body != nil {
- buf := make([]byte, chunkSize)
- Loop:
- for {
- var nr, nw int
- var er, ew os.Error
- if nr, er = req.Body.Read(buf); nr > 0 {
- if er == nil || er == os.EOF {
- fmt.Fprintf(w, "%x\r\n", nr)
- nw, ew = w.Write(buf[0:nr])
- fmt.Fprint(w, "\r\n")
- }
- }
- switch {
- case er != nil:
- if er == os.EOF {
- break Loop
- }
- return er
- case ew != nil:
- return ew
- case nw < nr:
- return io.ErrShortWrite
- }
+ cw := NewChunkedWriter(w)
+ if _, err := io.Copy(cw, req.Body); err != nil {
+ return err
+ }
+ if err := cw.Close(); err != nil {
+ return err
+ }
+ // TODO(petar): Write trailer here and append \r\n. For now, we
+ // simply send the final \r\n:
+ if _, err := fmt.Fprint(w, "\r\n"); err != nil {
+ return err
+ }
+ if err := req.Body.Close(); err != nil {
+ return err
}
- req.Body.Close()
- // last-chunk CRLF
- fmt.Fprint(w, "0\r\n\r\n")
}
return nil