mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
net/http: normalize empty port in URL.Host's ":port"
- Ensures that the empty port and preceeding ":" in a URL.Host are stripped. Normalize the empty port in a URL.Host's ":port" as mandated by RFC 3986 Section 6.2.3 which states that: `Likewise an explicit ":port", for which the port is empty or the default for the scheme, is equivalent to one where the port and its ":" delimiter are elided and thus should be removed by scheme-based normalization.` - Moves function `hasPort` from client.go (where it was defined but not used directly), to http.go the common area. Fixes #14836 Change-Id: I2067410377be9c71106b1717abddc2f8b1da1c03 Reviewed-on: https://go-review.googlesource.com/22140 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
585590549a
commit
26ecb42fb4
4 changed files with 21 additions and 4 deletions
|
|
@ -110,10 +110,6 @@ type RoundTripper interface {
|
||||||
RoundTrip(*Request) (*Response, error)
|
RoundTrip(*Request) (*Response, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given a string of the form "host", "host:port", or "[ipv6::address]:port",
|
|
||||||
// return true if the string includes a port.
|
|
||||||
func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
|
|
||||||
|
|
||||||
// refererForURL returns a referer without any authentication info or
|
// refererForURL returns a referer without any authentication info or
|
||||||
// an empty string if lastReq scheme is https and newReq scheme is http.
|
// an empty string if lastReq scheme is https and newReq scheme is http.
|
||||||
func refererForURL(lastReq, newReq *url.URL) string {
|
func refererForURL(lastReq, newReq *url.URL) string {
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@
|
||||||
|
|
||||||
package http
|
package http
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
// maxInt64 is the effective "infinite" value for the Server and
|
// maxInt64 is the effective "infinite" value for the Server and
|
||||||
// Transport's byte-limiting readers.
|
// Transport's byte-limiting readers.
|
||||||
const maxInt64 = 1<<63 - 1
|
const maxInt64 = 1<<63 - 1
|
||||||
|
|
@ -18,3 +22,16 @@ type contextKey struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *contextKey) String() string { return "net/http context value " + k.name }
|
func (k *contextKey) String() string { return "net/http context value " + k.name }
|
||||||
|
|
||||||
|
// Given a string of the form "host", "host:port", or "[ipv6::address]:port",
|
||||||
|
// return true if the string includes a port.
|
||||||
|
func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
|
||||||
|
|
||||||
|
// removeEmptyPort strips the empty port in ":port" to ""
|
||||||
|
// as mandated by RFC 3986 Section 6.2.3.
|
||||||
|
func removeEmptyPort(host string) string {
|
||||||
|
if hasPort(host) {
|
||||||
|
return strings.TrimSuffix(host, ":")
|
||||||
|
}
|
||||||
|
return host
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -660,6 +660,8 @@ func NewRequest(method, urlStr string, body io.Reader) (*Request, error) {
|
||||||
if !ok && body != nil {
|
if !ok && body != nil {
|
||||||
rc = ioutil.NopCloser(body)
|
rc = ioutil.NopCloser(body)
|
||||||
}
|
}
|
||||||
|
// The host's colon:port should be normalized. See Issue 14836.
|
||||||
|
u.Host = removeEmptyPort(u.Host)
|
||||||
req := &Request{
|
req := &Request{
|
||||||
Method: method,
|
Method: method,
|
||||||
URL: u,
|
URL: u,
|
||||||
|
|
|
||||||
|
|
@ -398,11 +398,13 @@ var newRequestHostTests = []struct {
|
||||||
|
|
||||||
{"http://192.168.0.1/", "192.168.0.1"},
|
{"http://192.168.0.1/", "192.168.0.1"},
|
||||||
{"http://192.168.0.1:8080/", "192.168.0.1:8080"},
|
{"http://192.168.0.1:8080/", "192.168.0.1:8080"},
|
||||||
|
{"http://192.168.0.1:/", "192.168.0.1"},
|
||||||
|
|
||||||
{"http://[fe80::1]/", "[fe80::1]"},
|
{"http://[fe80::1]/", "[fe80::1]"},
|
||||||
{"http://[fe80::1]:8080/", "[fe80::1]:8080"},
|
{"http://[fe80::1]:8080/", "[fe80::1]:8080"},
|
||||||
{"http://[fe80::1%25en0]/", "[fe80::1%en0]"},
|
{"http://[fe80::1%25en0]/", "[fe80::1%en0]"},
|
||||||
{"http://[fe80::1%25en0]:8080/", "[fe80::1%en0]:8080"},
|
{"http://[fe80::1%25en0]:8080/", "[fe80::1%en0]:8080"},
|
||||||
|
{"http://[fe80::1%25en0]:/", "[fe80::1%en0]"},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNewRequestHost(t *testing.T) {
|
func TestNewRequestHost(t *testing.T) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue