&Request{
Method: "GET",
URL: &url.URL{
- Scheme: "http",
- Host: "www.techcrunch.com",
- Path: "/",
- RawPath: "/",
+ Scheme: "http",
+ Host: "www.techcrunch.com",
+ Path: "/",
},
Proto: "HTTP/1.1",
ProtoMajor: 1,
&Request{
Method: "GET",
URL: &url.URL{
- Path: "/",
- RawPath: "/",
+ Path: "/",
},
Proto: "HTTP/1.1",
ProtoMajor: 1,
&Request{
Method: "GET",
URL: &url.URL{
- Path: "//user@host/is/actually/a/path/",
- RawPath: "//user@host/is/actually/a/path/",
+ Path: "//user@host/is/actually/a/path/",
},
Proto: "HTTP/1.1",
ProtoMajor: 1,
&Request{
Method: "POST",
URL: &url.URL{
- Path: "/",
- RawPath: "/",
+ Path: "/",
},
TransferEncoding: []string{"chunked"},
Proto: "HTTP/1.1",
&Request{
Method: "CONNECT",
URL: &url.URL{
- Path: "/_goRPC_",
- RawPath: "/_goRPC_",
+ Path: "/_goRPC_",
},
Proto: "HTTP/1.1",
ProtoMajor: 1,
&Request{
Method: "GET",
URL: &url.URL{
- Path: "/",
- RawPath: "/",
+ Path: "/",
},
Header: Header{
// This wasn't removed from Go 1.0 to
goto Error
}
}
- url.RawPath = rest
if url.Path, err = unescape(rest, encodePath); err != nil {
goto Error
}
+ // RawPath is a hint as to the encoding of Path to use
+ // in url.EncodedPath. If that method already gets the
+ // right answer without RawPath, leave it empty.
+ // This will help make sure that people don't rely on it in general.
+ if url.EscapedPath() != rest && validEncodedPath(rest) {
+ url.RawPath = rest
+ }
return url, nil
Error:
}
// validEncodedPath reports whether s is a valid encoded path.
-// It must contain any bytes that require escaping during path encoding.
+// It must not contain any bytes that require escaping during path encoding.
func validEncodedPath(s string) bool {
for i := 0; i < len(s); i++ {
if s[i] != '%' && shouldEscape(s[i], encodePath) {
Scheme: "http",
Host: "www.google.com",
Path: "/a b",
- RawPath: "/a%20b",
RawQuery: "q=c+d",
},
"",
pass = p
}
}
- return fmt.Sprintf("opaque=%q, scheme=%q, user=%#v, pass=%#v, host=%q, path=%q, rawq=%q, frag=%q",
- u.Opaque, u.Scheme, user, pass, u.Host, u.Path, u.RawQuery, u.Fragment)
+ return fmt.Sprintf("opaque=%q, scheme=%q, user=%#v, pass=%#v, host=%q, path=%q, rawpath=%q, rawq=%q, frag=%q",
+ u.Opaque, u.Scheme, user, pass, u.Host, u.Path, u.RawPath, u.RawQuery, u.Fragment)
}
func DoTest(t *testing.T, parse func(string) (*URL, error), name string, tests []URLTest) {
t.Errorf("%s(%q) returned error %s", name, tt.in, err)
continue
}
- if tt.out.RawPath == "" {
- tt.out.RawPath = tt.out.Path
- }
if !reflect.DeepEqual(u, tt.out) {
t.Errorf("%s(%q):\n\thave %v\n\twant %v\n",
name, tt.in, ufmt(u), ufmt(tt.out))