// construct a URL struct directly and set the Opaque field instead of Path.
 // These still work as well.
 type URL struct {
-       Scheme   string
-       Opaque   string    // encoded opaque data
-       User     *Userinfo // username and password information
-       Host     string    // host or host:port
-       Path     string
-       RawPath  string // encoded path hint (Go 1.5 and later only; see EscapedPath method)
-       RawQuery string // encoded query values, without '?'
-       Fragment string // fragment for references, without '#'
+       Scheme     string
+       Opaque     string    // encoded opaque data
+       User       *Userinfo // username and password information
+       Host       string    // host or host:port
+       Path       string
+       RawPath    string // encoded path hint (Go 1.5 and later only; see EscapedPath method)
+       ForceQuery bool   // append a query ('?') even if RawQuery is empty
+       RawQuery   string // encoded query values, without '?'
+       Fragment   string // fragment for references, without '#'
 }
 
 // User returns a Userinfo containing the provided username
        }
        url.Scheme = strings.ToLower(url.Scheme)
 
-       rest, url.RawQuery = split(rest, "?", true)
+       if strings.HasSuffix(rest, "?") {
+               url.ForceQuery = true
+               rest = rest[:len(rest)-1]
+       } else {
+               rest, url.RawQuery = split(rest, "?", true)
+       }
 
        if !strings.HasPrefix(rest, "/") {
                if url.Scheme != "" {
                }
                buf.WriteString(path)
        }
-       if u.RawQuery != "" {
+       if u.ForceQuery || u.RawQuery != "" {
                buf.WriteByte('?')
                buf.WriteString(u.RawQuery)
        }
                        result = u.Scheme + ":" + result
                }
        }
-       if u.RawQuery != "" {
+       if u.ForceQuery || u.RawQuery != "" {
                result += "?" + u.RawQuery
        }
        return result
 
                },
                "ftp://john%20doe@www.google.com/",
        },
+       // empty query
+       {
+               "http://www.google.com/?",
+               &URL{
+                       Scheme:     "http",
+                       Host:       "www.google.com",
+                       Path:       "/",
+                       ForceQuery: true,
+               },
+               "",
+       },
        // query
        {
                "http://www.google.com/?q=go+language",
        // Absolute URL references
        {"http://foo.com?a=b", "https://bar.com/", "https://bar.com/"},
        {"http://foo.com/", "https://bar.com/?a=b", "https://bar.com/?a=b"},
+       {"http://foo.com/", "https://bar.com/?", "https://bar.com/?"},
        {"http://foo.com/bar", "mailto:foo@example.com", "mailto:foo@example.com"},
 
        // Path-absolute references
        {"http://foo.com/bar", "/baz", "http://foo.com/baz"},
        {"http://foo.com/bar?a=b#f", "/baz", "http://foo.com/baz"},
+       {"http://foo.com/bar?a=b", "/baz?", "http://foo.com/baz?"},
        {"http://foo.com/bar?a=b", "/baz?c=d", "http://foo.com/baz?c=d"},
 
        // Scheme-relative
                },
                "//foo",
        },
+       {
+               &URL{
+                       Scheme:     "http",
+                       Host:       "example.com",
+                       Path:       "/foo",
+                       ForceQuery: true,
+               },
+               "/foo?",
+       },
 }
 
 func TestRequestURI(t *testing.T) {