diff options
| author | Brad Fitzpatrick <bradfitz@golang.org> | 2013-03-28 14:19:51 -0700 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2013-03-28 14:19:51 -0700 |
| commit | 7e7f89933b9d6eba5d298d3f619b5ef4166e5052 (patch) | |
| tree | 26e88b6af7f836ab18477db8d3b9954e8c1553af /src | |
| parent | 731dcb7680303792315625a86ec0390ca41c03b9 (diff) | |
| download | go-7e7f89933b9d6eba5d298d3f619b5ef4166e5052.tar.xz | |
net/http: parse Request-Line in a function, remove an allocation
Removes another per-request allocation. Also makes the code more
readable, IMO. And more testable.
benchmark old ns/op new ns/op delta
BenchmarkServerFakeConnWithKeepAliveLite 10539 10324 -2.04%
benchmark old allocs new allocs delta
BenchmarkServerFakeConnWithKeepAliveLite 20 19 -5.00%
benchmark old bytes new bytes delta
BenchmarkServerFakeConnWithKeepAliveLite 1609 1559 -3.11%
R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/8118044
Diffstat (limited to 'src')
| -rw-r--r-- | src/pkg/net/http/request.go | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/pkg/net/http/request.go b/src/pkg/net/http/request.go index dabb169d1f..b42cc58a49 100644 --- a/src/pkg/net/http/request.go +++ b/src/pkg/net/http/request.go @@ -467,6 +467,17 @@ func (r *Request) SetBasicAuth(username, password string) { r.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(s))) } +// parseRequestLine parses "GET /foo HTTP/1.1" into its three parts. +func parseRequestLine(line string) (method, requestURI, proto string, ok bool) { + s1 := strings.Index(line, " ") + s2 := strings.Index(line[s1+1:], " ") + if s1 < 0 || s2 < 0 { + return + } + s2 += s1 + 1 + return line[:s1], line[s1+1 : s2], line[s2+1:], true +} + // ReadRequest reads and parses a request from b. func ReadRequest(b *bufio.Reader) (req *Request, err error) { @@ -484,13 +495,12 @@ func ReadRequest(b *bufio.Reader) (req *Request, err error) { } }() - var f []string - if f = strings.SplitN(s, " ", 3); len(f) < 3 { + var ok bool + req.Method, req.RequestURI, req.Proto, ok = parseRequestLine(s) + if !ok { return nil, &badStringError{"malformed HTTP request", s} } - req.Method, req.RequestURI, req.Proto = f[0], f[1], f[2] rawurl := req.RequestURI - var ok bool if req.ProtoMajor, req.ProtoMinor, ok = ParseHTTPVersion(req.Proto); !ok { return nil, &badStringError{"malformed HTTP version", req.Proto} } |
