github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/url/url.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package urlはURLを解析し、クエリのエスケープを実装します。 6 package url 7 8 // Errorはエラーと、それが発生した操作とURLを報告します。 9 type Error struct { 10 Op string 11 URL string 12 Err error 13 } 14 15 func (e *Error) Unwrap() error 16 func (e *Error) Error() string 17 18 func (e *Error) Timeout() bool 19 20 func (e *Error) Temporary() bool 21 22 type EscapeError string 23 24 func (e EscapeError) Error() string 25 26 type InvalidHostError string 27 28 func (e InvalidHostError) Error() string 29 30 // QueryUnescapeは [QueryEscape] の逆変換を行います 31 // "%AB"のような形式の3バイトエンコードされた部分文字列を 32 // 16進数でデコードされたバイト0xABに変換します 33 // もし%の後に2桁の16進数が続かない場合、エラーが返されます。 34 func QueryUnescape(s string) (string, error) 35 36 // PathUnescapeは [PathEscape] の逆の変換を行います。形式が"%AB"の各3バイトエンコードされた部分文字列をhexデコードされたバイト0xABに変換します。もし%の後に2桁の16進数が続かない場合、エラーが返されます。 37 // 38 // PathUnescapeは [QueryUnescape] と同じですが、'+'を' '(スペース)に変換しない点が異なります。 39 func PathUnescape(s string) (string, error) 40 41 // QueryEscapeは、文字列をエスケープして、安全に [URL] クエリ内に配置できるようにします。 42 func QueryEscape(s string) string 43 44 // PathEscapeは、文字列を安全に [URL] パスセグメント内に配置できるようにエスケープします。 45 // 必要に応じて特殊文字(/を含む)を%XXシーケンスで置き換えます。 46 func PathEscape(s string) string 47 48 // URLは解析されたURL(厳密にはURIリファレンス)を表します。 49 // 50 // 全般的な形式は次のようになります: 51 // 52 // [スキーム:][//[ユーザー情報@]ホスト][/パス][?クエリ][#フラグメント] 53 // 54 // スキームの後にスラッシュで始まらないURLは次のように解釈されます: 55 // 56 // スキーム:透明部分[?クエリ][#フラグメント] 57 // 58 // Hostフィールドには、URLのホストとポートのサブコンポーネントが含まれます。 59 // ポートが存在する場合、コロンでホストから分離されます。 60 // ホストがIPv6アドレスの場合、角括弧で囲む必要があります: "[fe80::1]:80"。 61 // [net.JoinHostPort] 関数は、必要に応じてホストに角括弧を追加して、ホストとポートを文字列に結合します。 62 // 63 // Pathフィールドは、デコードされた形式で保存されます:/%47%6f%2fは/Go/になります。 64 // 結果として、Path内のどのスラッシュが生のURL内のスラッシュであり、どのスラッシュが%2fであるかを区別することはできません。 65 // この区別はほとんど重要ではありませんが、重要な場合は、コードは [URL.EscapedPath] メソッドを使用する必要があります。 66 // このメソッドは、Pathの元のエンコーディングを保持します。 67 // 68 // RawPathフィールドは、デフォルトのパスのエンコードがエスケープされたパスと異なる場合にのみ設定されるオプションのフィールドです。 69 // 詳細については、EscapedPathメソッドを参照してください。 70 // 71 // URLのStringメソッドは、パスを取得するためにEscapedPathメソッドを使用します。 72 type URL struct { 73 Scheme string 74 Opaque string 75 User *Userinfo 76 Host string 77 Path string 78 RawPath string 79 OmitHost bool 80 ForceQuery bool 81 RawQuery string 82 Fragment string 83 RawFragment string 84 } 85 86 // Userは、提供されたユーザー名を含む [Userinfo] を返します 87 // パスワードは設定されていません。 88 func User(username string) *Userinfo 89 90 // UserPasswordは提供されたユーザー名とパスワードを含む [Userinfo] を返します。 91 // この機能は、レガシーウェブサイトでのみ使用するべきです。 92 // RFC 2396は、この方法でUserinfoを解釈することを「推奨されない」と警告しています。 93 // 「URIなどで平文で認証情報を渡すことは、ほとんどの場合セキュリティリスクとなっている」と述べています。 94 func UserPassword(username, password string) *Userinfo 95 96 // Userinfo型は、[URL] のユーザー名とパスワードの詳細を不変なカプセル化します。既存のUserinfo値には、ユーザー名が設定されていることが保証されています(RFC 2396で許可されているように、空にすることも可能です)、また、オプションでパスワードも持つことができます。 97 type Userinfo struct { 98 username string 99 password string 100 passwordSet bool 101 } 102 103 // Usernameはユーザー名を返します。 104 func (u *Userinfo) Username() string 105 106 // Passwordは設定されている場合はパスワードを返し、設定されているかどうかも返します。 107 func (u *Userinfo) Password() (string, bool) 108 109 // Stringは「username [: password]」の標準形式でエンコードされたユーザー情報を返します。 110 func (u *Userinfo) String() string 111 112 // Parseは生のURLを [URL] 構造に解析します。 113 // 114 // URLは相対的なもの(ホストなしのパス)または絶対的なもの(スキームで始まる)である可能性があります。 115 // スキームなしでホスト名とパスを解析しようとすることは無効ですが、解析の曖昧さにより、 116 // エラーを返さない場合があります。 117 func Parse(rawURL string) (*URL, error) 118 119 // ParseRequestURIは生のURLを [URL] 構造体に解析します。これは、URLがHTTPリクエストで受け取られたものであることを前提としており、urlは絶対URIまたは絶対パスとしてのみ解釈されます。 120 // 文字列urlには#fragmentの接尾辞がないことが前提とされています。 121 // (ウェブブラウザはURLをウェブサーバーに送信する前に#fragmentを取り除きます。) 122 func ParseRequestURI(rawURL string) (*URL, error) 123 124 // EscapedPathはu.Pathのエスケープされた形式を返します。 125 // 一般的には、任意のパスには複数のエスケープされた形式が存在します。 126 // EscapedPathはu.RawPathがu.Pathの有効なエスケープである場合にはu.RawPathを返します。 127 // そうでない場合、EscapedPathはu.RawPathを無視し、独自のエスケープ形式を計算します。 128 // [URL.String] メソッドと [URL.RequestURI] メソッドは、それぞれの結果を構築するためにEscapedPathを使用します。 129 // 一般的に、コードはu.RawPathを直接読むのではなく、EscapedPathを呼び出すべきです。 130 func (u *URL) EscapedPath() string 131 132 // EscapedFragmentはu.Fragmentのエスケープ形式を返します。 133 // 一般的には、任意のフラグメントには複数のエスケープ形式が存在します。 134 // u.Fragmentが有効なエスケープである場合、EscapedFragmentはu.RawFragmentを返します。 135 // そうでない場合、EscapedFragmentはu.RawFragmentを無視し、独自のエスケープ形式を計算します。 136 // [URL.String] メソッドは、その結果を構築するためにEscapedFragmentを使用します。 137 // 一般的には、コードはu.RawFragmentを直接読む代わりにEscapedFragmentを呼び出すべきです。 138 func (u *URL) EscapedFragment() string 139 140 // Stringは [URL] を有効なURL文字列に再構築します。 141 // 結果の一般的な形式は次のいずれかです: 142 // 143 // scheme:opaque?query#fragment 144 // scheme://userinfo@host/path?query#fragment 145 // 146 // もしu.Opaqueが空でない場合、Stringは最初の形式を使用します。 147 // そうでなければ、2番目の形式を使用します。 148 // ホスト内の非ASCII文字はエスケープされます。 149 // パスを取得するために、Stringはu.EscapedPath()を使用します。 150 // 151 // 2番目の形式では、以下のルールが適用されます: 152 // - もしu.Schemeが空なら、scheme:は省略されます。 153 // - もしu.Userがnilなら、userinfo@は省略されます。 154 // - もしu.Hostが空なら、host/は省略されます。 155 // - もしu.Schemeとu.Hostが空であり、u.Userがnilなら、 156 // scheme://userinfo@host/全体が省略されます。 157 // - もしu.Hostが空でなく、u.Pathが/で始まるなら、 158 // host/pathの形式は独自の/を追加しません。 159 // - もしu.RawQueryが空なら、?queryは省略されます。 160 // - もしu.Fragmentが空なら、#fragmentは省略されます。 161 func (u *URL) String() string 162 163 // Redactedは [URL.String] と似ていますが、パスワードを「xxxxx」で置き換えます。 164 // u.User内のパスワードのみが伏せられます。 165 func (u *URL) Redacted() string 166 167 // Valuesは文字列のキーを値のリストにマップします。 168 // 通常、クエリパラメータやフォームの値に使用されます。 169 // http.Headerマップとは異なり、Valuesマップのキーは大文字小文字を区別します。 170 type Values map[string][]string 171 172 // Getは指定したキーに関連付けられた最初の値を返します。 173 // キーに関連付けられた値がない場合、Getは空の文字列を返します。 174 // 複数の値にアクセスするには、直接マップを使用してください。 175 func (v Values) Get(key string) string 176 177 // Setはキーを値にセットします。既存の値を置き換えます。 178 func (v Values) Set(key, value string) 179 180 // Addはkeyに値を追加します。keyと関連付けられた既存の値に追加します。 181 func (v Values) Add(key, value string) 182 183 // Delはキーに関連付けられた値を削除します。 184 func (v Values) Del(key string) 185 186 // Hasは与えられたキーが設定されているかどうかを確認します。 187 func (v Values) Has(key string) bool 188 189 // ParseQueryはURLエンコードされたクエリ文字列を解析して、 190 // 各キーに指定された値をリストしたマップを返します。 191 // ParseQueryは常に、最初にエンコードできないエラーが見つかった場合を示すnon-nilのマップを返します。エラーの詳細はerrに記載されます。 192 // 193 // クエリはアンパサンドで区切られたキー=値のリストとして期待されます。 194 // イコール記号がない設定は、空の値に設定されたキーとして解釈されます。 195 // URLエンコードされていないセミコロンが含まれる設定は無効と見なされます。 196 func ParseQuery(query string) (Values, error) 197 198 // Encodeは値をキーでソートされた形式で「URLエンコード」します 199 // ("bar=baz&foo=quux") 200 func (v Values) Encode() string 201 202 // IsAbsは [URL] が絶対であるかどうかを報告します。 203 // 絶対とは、空ではないスキームを持っていることを意味します。 204 func (u *URL) IsAbs() bool 205 206 // Parseはレシーバのコンテキストで [URL] を解析します。提供されたURLは相対的または絶対的である可能性があります。Parseは解析の失敗時にはnil、errを返し、それ以外の場合は [URL.ResolveReference] と同じ値を返します。 207 func (u *URL) Parse(ref string) (*URL, error) 208 209 // ResolveReferenceは、RFC 3986 Section 5.2 に従って、絶対ベースURI uからURIリファレンスを絶対URIに解決します。URIリファレンスは相対または絶対のどちらでもかまいません。ResolveReferenceは常に新しい [URL] インスタンスを返しますが、返されたURLがベースまたはリファレンスと同じであってもです。refが絶対URLの場合、ResolveReferenceはbaseを無視してrefのコピーを返します。 210 func (u *URL) ResolveReference(ref *URL) *URL 211 212 // QueryはRawQueryを解析し、対応する値を返します。 213 // 不正な値の組み合わせは静かに破棄されます。 214 // エラーをチェックするには [ParseQuery] を使用してください。 215 func (u *URL) Query() Values 216 217 // RequestURIは、uのHTTPリクエストで使用される、エンコードされたpath?queryまたはopaque?queryの文字列を返します。 218 func (u *URL) RequestURI() string 219 220 // Hostnameは、存在する場合は有効なポート番号を削除してu.Hostを返します。 221 // 222 // 結果が角かっこで囲まれている場合、それはリテラルIPv6アドレスですので、 223 // 結果から角かっこは削除されます。 224 func (u *URL) Hostname() string 225 226 // Portはu.Hostのポート部分を返しますが、先頭のコロンは除かれます。 227 // 228 // もしu.Hostに有効な数値のポートが含まれていない場合、Portは空の文字列を返します。 229 func (u *URL) Port() string 230 231 func (u *URL) MarshalBinary() (text []byte, err error) 232 233 func (u *URL) UnmarshalBinary(text []byte) error 234 235 // JoinPath は、指定されたパス要素が既存のパスに結合され、 236 // 結果のパスが "./" や "../" の要素を除去された新しい [URL] を返します。 237 // 連続する複数の / 文字のシーケンスは、単一の / に縮小されます。 238 func (u *URL) JoinPath(elem ...string) *URL 239 240 // JoinPathは、指定されたパス要素が結合された [URL] 文字列を返します。 241 // ベースの既存パスと生成されたパスは、"./"や"../"要素が除去された状態でクリーンになります。 242 func JoinPath(base string, elem ...string) (result string, err error)