aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2013-03-28 14:19:51 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2013-03-28 14:19:51 -0700
commit7e7f89933b9d6eba5d298d3f619b5ef4166e5052 (patch)
tree26e88b6af7f836ab18477db8d3b9954e8c1553af /src
parent731dcb7680303792315625a86ec0390ca41c03b9 (diff)
downloadgo-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.go18
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}
}