mirror of https://github.com/golang/go.git
net/http: reduce allocations in chunk reading & writing
R=golang-dev, r CC=golang-dev https://golang.org/cl/6847063
This commit is contained in:
parent
de58eb9091
commit
f3e6b20606
|
|
@ -13,6 +13,7 @@ import (
|
|||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"strconv"
|
||||
)
|
||||
|
|
@ -39,6 +40,7 @@ type chunkedReader struct {
|
|||
r *bufio.Reader
|
||||
n uint64 // unread bytes in chunk
|
||||
err error
|
||||
buf [2]byte
|
||||
}
|
||||
|
||||
func (cr *chunkedReader) beginChunk() {
|
||||
|
|
@ -74,9 +76,8 @@ func (cr *chunkedReader) Read(b []uint8) (n int, err error) {
|
|||
cr.n -= uint64(n)
|
||||
if cr.n == 0 && cr.err == nil {
|
||||
// end of chunk (CRLF)
|
||||
b := make([]byte, 2)
|
||||
if _, cr.err = io.ReadFull(cr.r, b); cr.err == nil {
|
||||
if b[0] != '\r' || b[1] != '\n' {
|
||||
if _, cr.err = io.ReadFull(cr.r, cr.buf[:]); cr.err == nil {
|
||||
if cr.buf[0] != '\r' || cr.buf[1] != '\n' {
|
||||
cr.err = errors.New("malformed chunked encoding")
|
||||
}
|
||||
}
|
||||
|
|
@ -147,9 +148,7 @@ func (cw *chunkedWriter) Write(data []byte) (n int, err error) {
|
|||
return 0, nil
|
||||
}
|
||||
|
||||
head := strconv.FormatInt(int64(len(data)), 16) + "\r\n"
|
||||
|
||||
if _, err = io.WriteString(cw.Wire, head); err != nil {
|
||||
if _, err = fmt.Fprintf(cw.Wire, "%x\r\n", len(data)); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if n, err = cw.Wire.Write(data); err != nil {
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ import (
|
|||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"strconv"
|
||||
)
|
||||
|
|
@ -41,6 +42,7 @@ type chunkedReader struct {
|
|||
r *bufio.Reader
|
||||
n uint64 // unread bytes in chunk
|
||||
err error
|
||||
buf [2]byte
|
||||
}
|
||||
|
||||
func (cr *chunkedReader) beginChunk() {
|
||||
|
|
@ -76,9 +78,8 @@ func (cr *chunkedReader) Read(b []uint8) (n int, err error) {
|
|||
cr.n -= uint64(n)
|
||||
if cr.n == 0 && cr.err == nil {
|
||||
// end of chunk (CRLF)
|
||||
b := make([]byte, 2)
|
||||
if _, cr.err = io.ReadFull(cr.r, b); cr.err == nil {
|
||||
if b[0] != '\r' || b[1] != '\n' {
|
||||
if _, cr.err = io.ReadFull(cr.r, cr.buf[:]); cr.err == nil {
|
||||
if cr.buf[0] != '\r' || cr.buf[1] != '\n' {
|
||||
cr.err = errors.New("malformed chunked encoding")
|
||||
}
|
||||
}
|
||||
|
|
@ -149,9 +150,7 @@ func (cw *chunkedWriter) Write(data []byte) (n int, err error) {
|
|||
return 0, nil
|
||||
}
|
||||
|
||||
head := strconv.FormatInt(int64(len(data)), 16) + "\r\n"
|
||||
|
||||
if _, err = io.WriteString(cw.Wire, head); err != nil {
|
||||
if _, err = fmt.Fprintf(cw.Wire, "%x\r\n", len(data)); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if n, err = cw.Wire.Write(data); err != nil {
|
||||
|
|
|
|||
Loading…
Reference in New Issue