mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
http: use ChunkWriter in Request.Write
R=rsc CC=golang-dev https://golang.org/cl/196079
This commit is contained in:
parent
43d2e59a81
commit
15da069a37
1 changed files with 15 additions and 27 deletions
|
|
@ -128,7 +128,7 @@ const defaultUserAgent = "Go http package"
|
||||||
|
|
||||||
// Write writes an HTTP/1.1 request -- header and body -- in wire format.
|
// Write writes an HTTP/1.1 request -- header and body -- in wire format.
|
||||||
// This method consults the following fields of req:
|
// This method consults the following fields of req:
|
||||||
// Host
|
// Host
|
||||||
// URL
|
// URL
|
||||||
// Method (defaults to "GET")
|
// Method (defaults to "GET")
|
||||||
// UserAgent (defaults to defaultUserAgent)
|
// UserAgent (defaults to defaultUserAgent)
|
||||||
|
|
@ -181,33 +181,21 @@ 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 err := cw.Close(); err != nil {
|
||||||
if nr, er = req.Body.Read(buf); nr > 0 {
|
return err
|
||||||
if er == nil || er == os.EOF {
|
}
|
||||||
fmt.Fprintf(w, "%x\r\n", nr)
|
// TODO(petar): Write trailer here and append \r\n. For now, we
|
||||||
nw, ew = w.Write(buf[0:nr])
|
// simply send the final \r\n:
|
||||||
fmt.Fprint(w, "\r\n")
|
if _, err := fmt.Fprint(w, "\r\n"); err != nil {
|
||||||
}
|
return err
|
||||||
}
|
}
|
||||||
switch {
|
if err := req.Body.Close(); err != nil {
|
||||||
case er != nil:
|
return err
|
||||||
if er == os.EOF {
|
|
||||||
break Loop
|
|
||||||
}
|
|
||||||
return er
|
|
||||||
case ew != nil:
|
|
||||||
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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue