// 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 ExamplePathEscape() { path := url.PathEscape("my/cool+blog&about,stuff") fmt.Println(path) // Output: // my%2Fcool+blog&about%2Cstuff } func ExamplePathUnescape() { escapedPath := "my%2Fcool+blog&about%2Cstuff" path, err := url.PathUnescape(escapedPath) if err != nil { log.Fatal(err) } fmt.Println(path) // Output: // my/cool+blog&about,stuff } func ExampleQueryEscape() { query := url.QueryEscape("my/cool+blog&about,stuff") fmt.Println(query) // Output: // my%2Fcool%2Bblog%26about%2Cstuff } func ExampleQueryUnescape() { escapedQuery := "my%2Fcool%2Bblog%26about%2Cstuff" query, err := url.QueryUnescape(escapedQuery) if err != nil { log.Fatal(err) } fmt.Println(query) // Output: // my/cool+blog&about,stuff } 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 ExampleValues_Add() { v := url.Values{} v.Add("cat sounds", "meow") v.Add("cat sounds", "mew") v.Add("cat sounds", "mau") fmt.Println(v["cat sounds"]) // Output: // [meow mew mau] } func ExampleValues_Del() { v := url.Values{} v.Add("cat sounds", "meow") v.Add("cat sounds", "mew") v.Add("cat sounds", "mau") fmt.Println(v["cat sounds"]) v.Del("cat sounds") fmt.Println(v["cat sounds"]) // Output: // [meow mew mau] // [] } func ExampleValues_Encode() { v := url.Values{} v.Add("cat sounds", "meow") v.Add("cat sounds", "mew/") v.Add("cat sounds", "mau$") fmt.Println(v.Encode()) // Output: // cat+sounds=meow&cat+sounds=mew%2F&cat+sounds=mau%24 } func ExampleValues_Get() { v := url.Values{} v.Add("cat sounds", "meow") v.Add("cat sounds", "mew") v.Add("cat sounds", "mau") fmt.Printf("%q\n", v.Get("cat sounds")) fmt.Printf("%q\n", v.Get("dog sounds")) // Output: // "meow" // "" } func ExampleValues_Has() { v := url.Values{} v.Add("cat sounds", "meow") v.Add("cat sounds", "mew") v.Add("cat sounds", "mau") fmt.Println(v.Has("cat sounds")) fmt.Println(v.Has("dog sounds")) // Output: // true // false } func ExampleValues_Set() { v := url.Values{} v.Add("cat sounds", "meow") v.Add("cat sounds", "mew") v.Add("cat sounds", "mau") fmt.Println(v["cat sounds"]) v.Set("cat sounds", "meow") fmt.Println(v["cat sounds"]) // Output: // [meow mew mau] // [meow] } 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 any) string { js, err := json.Marshal(m) if err != nil { log.Fatal(err) } return strings.ReplaceAll(string(js), ",", ", ") }