Skip to content

Commit

Permalink
net/http: add Request.RequestURI field
Browse files Browse the repository at this point in the history
The new url.URL's parsing can be too canonicalizing for
certain applications. By keeping the original request URI
around, we give applications a gross escape hatch while
keeping the URL package clean and simple for normal uses.

(From a discussion with Gary Burd, Gustavo Niemeyer,
and Russ Cox.)

Fixes #2782

R=golang-dev, rsc, dsymonds
CC=golang-dev
https://golang.org/cl/5580044
  • Loading branch information
bradfitz committed Jan 26, 2012
1 parent 408f0b1 commit 899cd04
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 2 deletions.
4 changes: 4 additions & 0 deletions src/pkg/net/http/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ func send(req *Request, t RoundTripper) (resp *Response, err error) {
return nil, errors.New("http: nil Request.URL")
}

if req.RequestURI != "" {
return nil, errors.New("http: Request.RequestURI can't be set in client requests.")
}

// Most the callers of send (Get, Post, et al) don't need
// Headers, leaving it uninitialized. We guarantee to the
// Transport that this has been initialized, though.
Expand Down
12 changes: 12 additions & 0 deletions src/pkg/net/http/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -428,3 +428,15 @@ func TestClientInsecureTransport(t *testing.T) {
}
}
}

func TestClientErrorWithRequestURI(t *testing.T) {
req, _ := NewRequest("GET", "http://localhost:1234/", nil)
req.RequestURI = "/this/field/is/illegal/and/should/error/"
_, err := DefaultClient.Do(req)
if err == nil {
t.Fatalf("expected an error")
}
if !strings.Contains(err.Error(), "RequestURI") {
t.Errorf("wanted error mentioning RequestURI; got error: %v", err)
}
}
7 changes: 7 additions & 0 deletions src/pkg/net/http/readrequest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ var reqTests = []reqTest{
Close: false,
ContentLength: 7,
Host: "www.techcrunch.com",
RequestURI: "http://www.techcrunch.com/",
},

"abcdef\n",
Expand All @@ -89,6 +90,7 @@ var reqTests = []reqTest{
Close: false,
ContentLength: 0,
Host: "foo.com",
RequestURI: "/",
},

noBody,
Expand All @@ -114,6 +116,7 @@ var reqTests = []reqTest{
Close: false,
ContentLength: 0,
Host: "test",
RequestURI: "//user@host/is/actually/a/path/",
},

noBody,
Expand Down Expand Up @@ -163,6 +166,7 @@ var reqTests = []reqTest{
Header: Header{},
ContentLength: -1,
Host: "foo.com",
RequestURI: "/",
},

"foobar",
Expand All @@ -188,6 +192,7 @@ var reqTests = []reqTest{
Close: false,
ContentLength: 0,
Host: "www.google.com:443",
RequestURI: "www.google.com:443",
},

noBody,
Expand All @@ -211,6 +216,7 @@ var reqTests = []reqTest{
Close: false,
ContentLength: 0,
Host: "127.0.0.1:6060",
RequestURI: "127.0.0.1:6060",
},

noBody,
Expand All @@ -234,6 +240,7 @@ var reqTests = []reqTest{
Close: false,
ContentLength: 0,
Host: "",
RequestURI: "/_goRPC_",
},

noBody,
Expand Down
10 changes: 8 additions & 2 deletions src/pkg/net/http/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,12 @@ type Request struct {
// This field is ignored by the HTTP client.
RemoteAddr string

// RequestURI is the unmodified Request-URI of the
// Request-Line (RFC 2616, Section 5.1) as sent by the client
// to a server. Usually the URL field should be used instead.
// It is an error to set this field in an HTTP client request.
RequestURI string

// TLS allows HTTP servers and other software to record
// information about the TLS connection on which the request
// was received. This field is not filled in by ReadRequest.
Expand Down Expand Up @@ -459,8 +465,8 @@ func ReadRequest(b *bufio.Reader) (req *Request, err error) {
if f = strings.SplitN(s, " ", 3); len(f) < 3 {
return nil, &badStringError{"malformed HTTP request", s}
}
var rawurl string
req.Method, rawurl, req.Proto = f[0], f[1], f[2]
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}
Expand Down

0 comments on commit 899cd04

Please sign in to comment.