-
Notifications
You must be signed in to change notification settings - Fork 18.3k
Open
Labels
v2An incompatible library changeAn incompatible library change
Milestone
Description
Wishlist bug for what net/http would look like if we could make backwards-incompatible changes. Anything goes. I'll start: * Handler (http://golang.org/pkg/net/http/#Handler) currently takes a pointer to a 208 byte Request struct. * The Request struct (http://golang.org/pkg/net/http/#Request) has all its fields publicly exposed, most of which require memory allocation: -- Method -- URL (itself 104 bytes, with a bunch of strings requiring allocation) -- Header map + slices + strings (even if never accessed) -- TransferEncoding slice (even if not accessed) -- Host string (even if not accessed) -- RemoteAddr string (even if not accessed) -- RequestURI (even if not accessed) -- TLS state struct (even if not accessed) For a lightweight handler that doesn't touch anything (say, serves some static content from memory), this means we can't do any better than generating ~1KB of garbage per request. I'd prefer to make a ServerRequest interface with accessor methods which can generate needed data on demand. This would also simplify our docs on our doubly-abused-in-different-ways *Request, which contains documentation gems like: // PostForm contains the parsed form data from POST or PUT // body parameters. // This field is only available after ParseForm is called. // The HTTP client ignores PostForm and uses Body instead. PostForm url.Values If we had byte views (issue #5376), I would also say that most fields in the ServerRequest, URL, Header, and FormValues are all byte views with validity scoped to the duration of the http.Handler call, instead of strings.
julienschmidt, ngrilly, hoenirvili, raulsntos, catsocks and 19 more
Metadata
Metadata
Assignees
Labels
v2An incompatible library changeAn incompatible library change