http: use ChunkWriter in Request.Write

R=rsc
CC=golang-dev
https://golang.org/cl/196079
This commit is contained in:
Petar Maymounkov 2010-02-04 00:23:01 -08:00 committed by Russ Cox
parent 43d2e59a81
commit 15da069a37

View file

@ -181,34 +181,22 @@ func (req *Request) Write(w io.Writer) os.Error {
io.WriteString(w, "\r\n") io.WriteString(w, "\r\n")
if req.Body != nil { if req.Body != nil {
buf := make([]byte, chunkSize) cw := NewChunkedWriter(w)
Loop: if _, err := io.Copy(cw, req.Body); err != nil {
for { return err
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")
} }
if err := cw.Close(); err != nil {
return err
} }
switch { // TODO(petar): Write trailer here and append \r\n. For now, we
case er != nil: // simply send the final \r\n:
if er == os.EOF { if _, err := fmt.Fprint(w, "\r\n"); err != nil {
break Loop return err
} }
return er if err := req.Body.Close(); err != nil {
case ew != nil: return err
return ew
case nw < nr:
return io.ErrShortWrite
} }
} }
req.Body.Close()
// last-chunk CRLF
fmt.Fprint(w, "0\r\n\r\n")
}
return nil return nil
} }