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)