mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
Semicolons are no longer valid separators, so net/url.ParseQuery will now return an error if any part of the query contains a semicolon. net/http.(*Request).ParseMultipartForm has been changed to fall through and continue parsing even if the call to (*Request).ParseForm fails. This change also includes a few minor refactors to existing tests. Fixes #25192 Change-Id: Iba3f108950fb99b9288e402c41fe71ca3a2ababd Reviewed-on: https://go-review.googlesource.com/c/go/+/325697 Trust: Katie Hockman <katie@golang.org> Run-TryBot: Katie Hockman <katie@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Filippo Valsorda <filippo@golang.org>
256 lines
5.1 KiB
Go
256 lines
5.1 KiB
Go
// Copyright 2012 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package url_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"net/url"
|
|
"strings"
|
|
)
|
|
|
|
func ExampleValues() {
|
|
v := url.Values{}
|
|
v.Set("name", "Ava")
|
|
v.Add("friend", "Jess")
|
|
v.Add("friend", "Sarah")
|
|
v.Add("friend", "Zoe")
|
|
// v.Encode() == "name=Ava&friend=Jess&friend=Sarah&friend=Zoe"
|
|
fmt.Println(v.Get("name"))
|
|
fmt.Println(v.Get("friend"))
|
|
fmt.Println(v["friend"])
|
|
// Output:
|
|
// Ava
|
|
// Jess
|
|
// [Jess Sarah Zoe]
|
|
}
|
|
|
|
func ExampleURL() {
|
|
u, err := url.Parse("http://bing.com/search?q=dotnet")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
u.Scheme = "https"
|
|
u.Host = "google.com"
|
|
q := u.Query()
|
|
q.Set("q", "golang")
|
|
u.RawQuery = q.Encode()
|
|
fmt.Println(u)
|
|
// Output: https://google.com/search?q=golang
|
|
}
|
|
|
|
func ExampleURL_roundtrip() {
|
|
// Parse + String preserve the original encoding.
|
|
u, err := url.Parse("https://example.com/foo%2fbar")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(u.Path)
|
|
fmt.Println(u.RawPath)
|
|
fmt.Println(u.String())
|
|
// Output:
|
|
// /foo/bar
|
|
// /foo%2fbar
|
|
// https://example.com/foo%2fbar
|
|
}
|
|
|
|
func ExampleURL_ResolveReference() {
|
|
u, err := url.Parse("../../..//search?q=dotnet")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
base, err := url.Parse("http://example.com/directory/")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(base.ResolveReference(u))
|
|
// Output:
|
|
// http://example.com/search?q=dotnet
|
|
}
|
|
|
|
func ExampleParseQuery() {
|
|
m, err := url.ParseQuery(`x=1&y=2&y=3`)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(toJSON(m))
|
|
// Output:
|
|
// {"x":["1"], "y":["2", "3"]}
|
|
}
|
|
|
|
func ExampleURL_EscapedPath() {
|
|
u, err := url.Parse("http://example.com/x/y%2Fz")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println("Path:", u.Path)
|
|
fmt.Println("RawPath:", u.RawPath)
|
|
fmt.Println("EscapedPath:", u.EscapedPath())
|
|
// Output:
|
|
// Path: /x/y/z
|
|
// RawPath: /x/y%2Fz
|
|
// EscapedPath: /x/y%2Fz
|
|
}
|
|
|
|
func ExampleURL_EscapedFragment() {
|
|
u, err := url.Parse("http://example.com/#x/y%2Fz")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println("Fragment:", u.Fragment)
|
|
fmt.Println("RawFragment:", u.RawFragment)
|
|
fmt.Println("EscapedFragment:", u.EscapedFragment())
|
|
// Output:
|
|
// Fragment: x/y/z
|
|
// RawFragment: x/y%2Fz
|
|
// EscapedFragment: x/y%2Fz
|
|
}
|
|
|
|
func ExampleURL_Hostname() {
|
|
u, err := url.Parse("https://example.org:8000/path")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(u.Hostname())
|
|
u, err = url.Parse("https://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:17000")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(u.Hostname())
|
|
// Output:
|
|
// example.org
|
|
// 2001:0db8:85a3:0000:0000:8a2e:0370:7334
|
|
}
|
|
|
|
func ExampleURL_IsAbs() {
|
|
u := url.URL{Host: "example.com", Path: "foo"}
|
|
fmt.Println(u.IsAbs())
|
|
u.Scheme = "http"
|
|
fmt.Println(u.IsAbs())
|
|
// Output:
|
|
// false
|
|
// true
|
|
}
|
|
|
|
func ExampleURL_MarshalBinary() {
|
|
u, _ := url.Parse("https://example.org")
|
|
b, err := u.MarshalBinary()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Printf("%s\n", b)
|
|
// Output:
|
|
// https://example.org
|
|
}
|
|
|
|
func ExampleURL_Parse() {
|
|
u, err := url.Parse("https://example.org")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
rel, err := u.Parse("/foo")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(rel)
|
|
_, err = u.Parse(":foo")
|
|
if _, ok := err.(*url.Error); !ok {
|
|
log.Fatal(err)
|
|
}
|
|
// Output:
|
|
// https://example.org/foo
|
|
}
|
|
|
|
func ExampleURL_Port() {
|
|
u, err := url.Parse("https://example.org")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(u.Port())
|
|
u, err = url.Parse("https://example.org:8080")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(u.Port())
|
|
// Output:
|
|
//
|
|
// 8080
|
|
}
|
|
|
|
func ExampleURL_Query() {
|
|
u, err := url.Parse("https://example.org/?a=1&a=2&b=&=3&&&&")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
q := u.Query()
|
|
fmt.Println(q["a"])
|
|
fmt.Println(q.Get("b"))
|
|
fmt.Println(q.Get(""))
|
|
// Output:
|
|
// [1 2]
|
|
//
|
|
// 3
|
|
}
|
|
|
|
func ExampleURL_String() {
|
|
u := &url.URL{
|
|
Scheme: "https",
|
|
User: url.UserPassword("me", "pass"),
|
|
Host: "example.com",
|
|
Path: "foo/bar",
|
|
RawQuery: "x=1&y=2",
|
|
Fragment: "anchor",
|
|
}
|
|
fmt.Println(u.String())
|
|
u.Opaque = "opaque"
|
|
fmt.Println(u.String())
|
|
// Output:
|
|
// https://me:pass@example.com/foo/bar?x=1&y=2#anchor
|
|
// https:opaque?x=1&y=2#anchor
|
|
}
|
|
|
|
func ExampleURL_UnmarshalBinary() {
|
|
u := &url.URL{}
|
|
err := u.UnmarshalBinary([]byte("https://example.org/foo"))
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Printf("%s\n", u)
|
|
// Output:
|
|
// https://example.org/foo
|
|
}
|
|
|
|
func ExampleURL_Redacted() {
|
|
u := &url.URL{
|
|
Scheme: "https",
|
|
User: url.UserPassword("user", "password"),
|
|
Host: "example.com",
|
|
Path: "foo/bar",
|
|
}
|
|
fmt.Println(u.Redacted())
|
|
u.User = url.UserPassword("me", "newerPassword")
|
|
fmt.Println(u.Redacted())
|
|
// Output:
|
|
// https://user:xxxxx@example.com/foo/bar
|
|
// https://me:xxxxx@example.com/foo/bar
|
|
}
|
|
|
|
func ExampleURL_RequestURI() {
|
|
u, err := url.Parse("https://example.org/path?foo=bar")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Println(u.RequestURI())
|
|
// Output: /path?foo=bar
|
|
}
|
|
|
|
func toJSON(m interface{}) string {
|
|
js, err := json.Marshal(m)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return strings.ReplaceAll(string(js), ",", ", ")
|
|
}
|