]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: add Request.RequestURI field
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 26 Jan 2012 22:37:14 +0000 (14:37 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 26 Jan 2012 22:37:14 +0000 (14:37 -0800)
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

src/pkg/net/http/client.go
src/pkg/net/http/client_test.go
src/pkg/net/http/readrequest_test.go
src/pkg/net/http/request.go

index 1d70672695c7ac1d717e7f119f4cd9b25c08b746..c9f024017573ea107bb42443a3b56f80badea05a 100644 (file)
@@ -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.
index c74611011a819f7661d882e2de843628f2ffb1f0..aa0bf4be676a23486a3074f15c93b9aa17a5ce46 100644 (file)
@@ -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)
+       }
+}
index df2f5aba99117782f1e06fb64d7e345ee8646438..2e03c658aa90bdb6ada675e8970c61e558aaf185 100644 (file)
@@ -64,6 +64,7 @@ var reqTests = []reqTest{
                        Close:         false,
                        ContentLength: 7,
                        Host:          "www.techcrunch.com",
+                       RequestURI:    "http://www.techcrunch.com/",
                },
 
                "abcdef\n",
@@ -89,6 +90,7 @@ var reqTests = []reqTest{
                        Close:         false,
                        ContentLength: 0,
                        Host:          "foo.com",
+                       RequestURI:    "/",
                },
 
                noBody,
@@ -114,6 +116,7 @@ var reqTests = []reqTest{
                        Close:         false,
                        ContentLength: 0,
                        Host:          "test",
+                       RequestURI:    "//user@host/is/actually/a/path/",
                },
 
                noBody,
@@ -163,6 +166,7 @@ var reqTests = []reqTest{
                        Header:           Header{},
                        ContentLength:    -1,
                        Host:             "foo.com",
+                       RequestURI:       "/",
                },
 
                "foobar",
@@ -188,6 +192,7 @@ var reqTests = []reqTest{
                        Close:         false,
                        ContentLength: 0,
                        Host:          "www.google.com:443",
+                       RequestURI:    "www.google.com:443",
                },
 
                noBody,
@@ -211,6 +216,7 @@ var reqTests = []reqTest{
                        Close:         false,
                        ContentLength: 0,
                        Host:          "127.0.0.1:6060",
+                       RequestURI:    "127.0.0.1:6060",
                },
 
                noBody,
@@ -234,6 +240,7 @@ var reqTests = []reqTest{
                        Close:         false,
                        ContentLength: 0,
                        Host:          "",
+                       RequestURI:    "/_goRPC_",
                },
 
                noBody,
index 59fe0bf9eda0158f1a714da06f82774e7958ca56..5f8c00086bee74b09b5da98c1b4c1df3f6deab91 100644 (file)
@@ -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.
@@ -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}