github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/http/request.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 // HTTP Request reading and parsing. 6 7 package http 8 9 import ( 10 "github.com/shogo82148/std/bufio" 11 "github.com/shogo82148/std/context" 12 "github.com/shogo82148/std/crypto/tls" 13 "github.com/shogo82148/std/errors" 14 "github.com/shogo82148/std/io" 15 "github.com/shogo82148/std/mime/multipart" 16 "github.com/shogo82148/std/net/url" 17 ) 18 19 // ErrMissingFileは、FormFileが提供されたファイルフィールド名がリクエストに存在しないか、ファイルフィールドではない場合に返されます。 20 var ErrMissingFile = errors.New("http: no such file") 21 22 // ProtocolErrorは、HTTPプロトコルエラーを表します。 23 // 24 // Deprecated: httpパッケージのすべてのプロトコルエラーに関連するエラーがProtocolError型ではありません。 25 type ProtocolError struct { 26 ErrorString string 27 } 28 29 func (pe *ProtocolError) Error() string 30 31 // Isは、http.ErrNotSupportedがerrors.ErrUnsupportedに一致するようにします。 32 func (pe *ProtocolError) Is(err error) bool 33 34 var ( 35 // ErrNotSupportedは、機能がサポートされていないことを示します。 36 // 37 // ResponseControllerメソッドによって、ハンドラがメソッドをサポートしていないことを示すために返され、 38 // Pusher実装のPushメソッドによって、HTTP/2 Pushサポートが利用できないことを示すために返されます。 39 ErrNotSupported = &ProtocolError{"feature not supported"} 40 41 // Deprecated: ErrUnexpectedTrailerは、net/httpパッケージの何も返さなくなりました。 42 // 呼び出し元は、この変数とエラーを比較すべきではありません。 43 ErrUnexpectedTrailer = &ProtocolError{"trailer header without chunked transfer encoding"} 44 45 // ErrMissingBoundaryは、リクエストのContent-Typeに「boundary」パラメータが含まれていない場合に、Request.MultipartReaderによって返されます。 46 ErrMissingBoundary = &ProtocolError{"no multipart boundary param in Content-Type"} 47 48 /// ErrNotMultipartは、リクエストのContent-Typeがmultipart/form-dataでない場合、Request.MultipartReaderによって返されます。 49 ErrNotMultipart = &ProtocolError{"request Content-Type isn't multipart/form-data"} 50 51 // Deprecated: ErrHeaderTooLongは、net/httpパッケージの何も返さなくなりました。 52 // 呼び出し元は、この変数とエラーを比較すべきではありません。 53 ErrHeaderTooLong = &ProtocolError{"header too long"} 54 55 // Deprecated: ErrShortBodyは、net/httpパッケージの何も返さなくなりました。 56 // 呼び出し元は、この変数とエラーを比較すべきではありません。 57 ErrShortBody = &ProtocolError{"entity body too short"} 58 59 // Deprecated: ErrMissingContentLengthは、net/httpパッケージの何も返さなくなりました。 60 // 呼び出し元は、この変数とエラーを比較すべきではありません。 61 ErrMissingContentLength = &ProtocolError{"missing ContentLength in HEAD response"} 62 ) 63 64 // Requestは、サーバーによって受信されたHTTPリクエストまたはクライアントによって送信されるHTTPリクエストを表します。 65 // 66 // フィールドの意味は、クライアントとサーバーの使用方法でわずかに異なります。 67 // 以下のフィールドに関する注意事項に加えて、[Request.Write] および [RoundTripper] のドキュメントを参照してください。 68 type Request struct { 69 // Methodは、HTTPメソッド(GET、POST、PUTなど)を指定します。 70 // クライアントリクエストの場合、空の文字列はGETを意味します。 71 Method string 72 73 // URLは、サーバーリクエストの場合に要求されるURI(URI)を指定するか、 74 // クライアントリクエストの場合にアクセスするURLを指定します。 75 // 76 // サーバーリクエストの場合、URLはRequestURIに格納されたRequest-Lineで指定されたURIから解析されます。 77 // ほとんどのリクエストでは、PathとRawQuery以外のフィールドは空になります。 (RFC 7230、セクション5.3を参照) 78 // 79 // クライアントリクエストの場合、URLのHostは接続するサーバーを指定し、 80 // RequestのHostフィールドはHTTPリクエストで送信するHostヘッダー値をオプションで指定します。 81 URL *url.URL 82 83 // サーバーリクエストのプロトコルバージョン。 84 // 85 // クライアントリクエストの場合、これらのフィールドは無視されます。 86 // HTTPクライアントコードは常にHTTP/1.1またはHTTP/2を使用します。 87 // 詳細については、Transportのドキュメントを参照してください。 88 Proto string 89 ProtoMajor int 90 ProtoMinor int 91 92 // Headerは、サーバーによって受信されたリクエストヘッダーフィールドまたはクライアントによって送信されるリクエストヘッダーフィールドを含みます。 93 // 94 // サーバーがヘッダーラインを含むリクエストを受信した場合、 95 // 96 // Host: example.com 97 // accept-encoding: gzip, deflate 98 // Accept-Language: en-us 99 // fOO: Bar 100 // foo: two 101 // 102 // その場合、 103 // 104 // Header = map[string][]string{ 105 // "Accept-Encoding": {"gzip, deflate"}, 106 // "Accept-Language": {"en-us"}, 107 // "Foo": {"Bar", "two"}, 108 // } 109 // 110 // 入力リクエストの場合、HostヘッダーはRequest.Hostフィールドに昇格し、Headerマップから削除されます。 111 // 112 // HTTPは、ヘッダー名が大文字小文字を区別しないことを定義しています。リクエストパーサーは、CanonicalHeaderKeyを使用してこれを実装し、ハイフンの後に続く最初の文字と任意の文字を大文字にし、残りを小文字にします。 113 // 114 // クライアントリクエストの場合、Content-LengthやConnectionなどの特定のヘッダーは必要に応じて自動的に書き込まれ、Headerの値は無視される場合があります。Request.Writeメソッドのドキュメントを参照してください。 115 Header Header 116 117 // Bodyは、リクエストの本文です。 118 // 119 // クライアントリクエストの場合、nilのBodyは、GETリクエストなど、リクエストに本文がないことを意味します。 120 // HTTPクライアントのTransportは、Closeメソッドを呼び出す責任があります。 121 // 122 // サーバーリクエストの場合、Request Bodyは常にnilではありませんが、本文が存在しない場合はすぐにEOFが返されます。 123 // サーバーはリクエストボディを閉じます。ServeHTTPハンドラーは閉じる必要はありません。 124 // 125 // Bodyは、ReadがCloseと同時に呼び出されることを許可する必要があります。 126 // 特に、Closeを呼び出すと、入力を待機しているReadがブロックされている場合は、それを解除する必要があります。 127 Body io.ReadCloser 128 129 // GetBodyは、Bodyの新しいコピーを返すオプションの関数を定義します。 130 // リダイレクトにより、Bodyを複数回読み取る必要がある場合にクライアントリクエストで使用されます。 131 // GetBodyの使用には、Bodyを設定する必要があります。 132 // 133 // サーバーリクエストの場合、使用されません。 134 GetBody func() (io.ReadCloser, error) 135 136 // ContentLengthは、関連するコンテンツの長さを記録します。 137 // 値-1は、長さが不明であることを示します。 138 // 値が0以上の場合、Bodyから指定されたバイト数を読み取ることができます。 139 // 140 // クライアントリクエストの場合、Bodyがnilでない場合、値0は不明として扱われます。 141 ContentLength int64 142 143 // TransferEncodingは、最も外側から最も内側までの転送エンコーディングをリストします。 144 // 空のリストは「identity」エンコーディングを示します。 145 // TransferEncodingは通常無視できます。チャンクエンコーディングは、 146 // リクエストの送信と受信時に必要に応じて自動的に追加および削除されます。 147 TransferEncoding []string 148 149 // Closeは、このリクエストに応答した後(サーバーの場合)またはこのリクエストを送信してその応答を読み取った後(クライアントの場合)に接続を閉じるかどうかを示します。 150 // 151 // サーバーリクエストの場合、HTTPサーバーがこれを自動的に処理し、このフィールドはHandlersによって必要ではありません。 152 // 153 // クライアントリクエストの場合、このフィールドを設定すると、 Transport.DisableKeepAlives が設定された場合と同様に、同じホストへのリクエスト間でTCP接続の再利用が防止されます。 154 Close bool 155 156 // サーバーリクエストの場合、HostはURLが要求されるホストを指定します。 157 // HTTP/1(RFC 7230 Section 5.4 による)の場合、これは「Host」ヘッダーの値またはURL自体で指定されたホスト名のいずれかです。 158 // HTTP/2の場合、これは「:authority」疑似ヘッダーフィールドの値です。 159 // 形式は「host:port」にすることができます。 160 // 国際ドメイン名の場合、HostはPunycodeまたはUnicode形式である場合があります。 161 // 必要に応じて、golang.org/x/net/idna を使用してどちらの形式にも変換できます。 162 // DNSリバインディング攻撃を防ぐために、サーバーハンドラーは、Hostヘッダーがハンドラー自身が権限を持つ値であることを検証する必要があります。 163 // 含まれるServeMuxは、特定のホスト名に登録されたパターンをサポートし、その登録されたハンドラーを保護します。 164 // 165 // クライアントリクエストの場合、HostはオプションでHostヘッダーを上書きして送信します。 166 // 空の場合、Request.Write メソッドは URL.Host の値を使用します。 167 // Hostには国際ドメイン名が含まれる場合があります。 168 Host string 169 170 // Formには、URLフィールドのクエリパラメータとPATCH、POST、またはPUTフォームデータを含む解析されたフォームデータが含まれます。 171 // ParseFormが呼び出された後にのみこのフィールドが使用可能です。 172 // HTTPクライアントはFormを無視し、代わりにBodyを使用します。 173 Form url.Values 174 175 // PostFormには、PATCH、POST、またはPUTボディパラメータから解析されたフォームデータが含まれます。 176 // 177 // ParseFormが呼び出された後にのみこのフィールドが使用可能です。 178 // HTTPクライアントはPostFormを無視し、代わりにBodyを使用します。 179 PostForm url.Values 180 181 // MultipartFormは、ファイルのアップロードを含む解析されたマルチパートフォームです。 182 // ParseMultipartFormが呼び出された後にのみこのフィールドが使用可能です。 183 // HTTPクライアントはMultipartFormを無視し、代わりにBodyを使用します。 184 MultipartForm *multipart.Form 185 186 // Trailerは、リクエスト本文の後に送信される追加のヘッダーを指定します。 187 // 188 // サーバーリクエストの場合、Trailerマップには最初にトレーラーキーのみが含まれ、nil値が含まれます。 189 // (クライアントは、後で送信するトレーラーを宣言します。) 190 // ハンドラーがBodyから読み取っている間、Trailerに参照しないでください。 191 // Bodyからの読み取りがEOFを返した後、Trailerを再度読み取ると、クライアントが送信した場合は非nil値が含まれます。 192 // 193 // クライアントリクエストの場合、Trailerは、後で送信するトレーラーキーを含むマップで初期化する必要があります。 194 // 値はnilまたは最終値である場合があります。ContentLengthは0または-1である必要があります。 195 // HTTPリクエストが送信された後、マップの値は、リクエストボディが読み取られている間に更新できます。 196 // ボディがEOFを返した後、呼び出し元はTrailerを変更してはいけません。 197 // 198 // 少数のHTTPクライアント、サーバー、またはプロキシがHTTPトレーラーをサポートしています。 199 Trailer Header 200 201 // RemoteAddrは、HTTPサーバーやその他のソフトウェアが、通常はログ記録のためにリクエストを送信したネットワークアドレスを記録できるようにします。 202 // このフィールドはReadRequestによって入力されず、定義された形式はありません。 203 // このパッケージのHTTPサーバーは、ハンドラーを呼び出す前にRemoteAddrを「IP:port」アドレスに設定します。 204 // このフィールドはHTTPクライアントによって無視されます。 205 RemoteAddr string 206 207 // RequestURIは、クライアントがサーバーに送信したRequest-Line(RFC 7230 Section 3.1.1)の変更されていないリクエストターゲットです。 208 // 通常、URLフィールドを代わりに使用する必要があります。 209 // HTTPクライアントリクエストでこのフィールドを設定することはエラーです。 210 RequestURI string 211 212 // TLSは、HTTPサーバーやその他のソフトウェアが、リクエストを受信したTLS接続に関する情報を記録できるようにします。 213 // このフィールドはReadRequestによって入力されず、定義された形式はありません。 214 // このパッケージのHTTPサーバーは、ハンドラーを呼び出す前にTLS有効な接続のためにこのフィールドを設定します。 215 // それ以外の場合は、このフィールドをnilのままにします。 216 // このフィールドはHTTPクライアントによって無視されます。 217 TLS *tls.ConnectionState 218 219 // Cancelは、クライアントリクエストがキャンセルされたと見なす必要があることを示すチャネルのオプションです。 220 // RoundTripperのすべての実装がCancelをサポートしているわけではありません。 221 // 222 // サーバーリクエストの場合、このフィールドは適用されません。 223 // 224 // Deprecated: NewRequestWithContextでRequestのコンテキストを設定してください。 225 // RequestのCancelフィールドとコンテキストの両方が設定されている場合、Cancelが尊重されるかどうかは未定義です。 226 Cancel <-chan struct{} 227 228 // Responseは、このリクエストが作成されたクライアントリダイレクト中にのみ設定されるリダイレクトレスポンスです。 229 Response *Response 230 231 // ctx is either the client or server context. It should only 232 // be modified via copying the whole Request using Clone or WithContext. 233 // It is unexported to prevent people from using Context wrong 234 // and mutating the contexts held by callers of the same request. 235 ctx context.Context 236 237 // The following fields are for requests matched by ServeMux. 238 pat *pattern 239 matches []string 240 otherValues map[string]string 241 } 242 243 // Contextは、リクエストのコンテキストを返します。コンテキストを変更するには、[Request.Clone] または [Request.WithContext] を使用してください。 244 // 245 // 返されるコンテキストは常にnilではありません。デフォルトでは、バックグラウンドコンテキストになります。 246 // 247 // 出力クライアントリクエストの場合、コンテキストはキャンセルを制御します。 248 // 249 // 入力サーバーリクエストの場合、クライアントの接続が閉じられたとき、リクエストがキャンセルされたとき(HTTP/2で)、またはServeHTTPメソッドが返されたときに、コンテキストがキャンセルされます。 250 func (r *Request) Context() context.Context 251 252 // WithContextは、そのコンテキストをctxに変更したrの浅いコピーを返します。提供されたctxはnilであってはなりません。 253 // 254 // 出力クライアントリクエストの場合、コンテキストはリクエストとそのレスポンスのライフタイム全体を制御します:接続の取得、リクエストの送信、レスポンスヘッダーとボディの読み取り。 255 // 256 // コンテキストを持つ新しいリクエストを作成するには、[NewRequestWithContext] を使用します。 257 // 新しいコンテキストを持つリクエストのディープコピーを作成するには、[Request.Clone] を使用します。 258 func (r *Request) WithContext(ctx context.Context) *Request 259 260 // Cloneは、そのコンテキストをctxに変更したrのディープコピーを返します。提供されたctxはnilであってはなりません。 261 // 262 // 出力クライアントリクエストの場合、コンテキストはリクエストとそのレスポンスのライフタイム全体を制御します:接続の取得、リクエストの送信、レスポンスヘッダーとボディの読み取り。 263 // 264 // 新しいコンテキストを持つリクエストを作成するには、NewRequestWithContextを使用します。 265 // コンテキストを変更せずに新しいリクエストを作成するには、Request.WithContextを使用します。 266 func (r *Request) Clone(ctx context.Context) *Request 267 268 // ProtoAtLeastは、リクエストで使用されるHTTPプロトコルがmajor.minor以上であるかどうかを報告します。 269 func (r *Request) ProtoAtLeast(major, minor int) bool 270 271 // UserAgentは、リクエストで送信された場合にクライアントのUser-Agentを返します。 272 func (r *Request) UserAgent() string 273 274 // Cookiesは、リクエストで送信されたHTTPクッキーを解析して返します。 275 func (r *Request) Cookies() []*Cookie 276 277 // CookiesNamedは、リクエストとともに送信された名前付きHTTPクッキーを解析し、 278 // マッチするものがなければ空のスライスを返します。 279 func (r *Request) CookiesNamed(name string) []*Cookie 280 281 // ErrNoCookieは、Cookieメソッドがクッキーを見つけられなかった場合にRequestによって返されます。 282 var ErrNoCookie = errors.New("http: named cookie not present") 283 284 // Cookieは、リクエストで提供された名前付きクッキーを返します。クッキーが見つからない場合は [ErrNoCookie] を返します。 285 // 複数のクッキーが指定された名前に一致する場合、1つのクッキーのみが返されます。 286 func (r *Request) Cookie(name string) (*Cookie, error) 287 288 // AddCookieは、リクエストにクッキーを追加します。RFC 6265 Section 5.4 に従い、 289 // AddCookieは1つ以上の [Cookie] ヘッダーフィールドを添付しません。つまり、すべてのクッキーが、 290 // セミコロンで区切られた同じ行に書き込まれます。 291 // AddCookieは、cの名前と値をサニタイズするだけで、すでにリクエストに存在するCookieヘッダーをサニタイズしません。 292 func (r *Request) AddCookie(c *Cookie) 293 294 // Refererは、リクエストで送信された場合に参照元のURLを返します。 295 // 296 // Refererは、HTTPの初期の日々からの誤りで、リクエスト自体で誤ってスペルがされています。 297 // この値はHeader["Referer"]として [Header] マップから取得することもできますが、 298 // メソッドとして利用可能にすることの利点は、代替の(正しい英語の)スペルreq.Referrer()を使用するプログラムをコンパイラが診断できるが、 299 // Header["Referrer"]を使用するプログラムを診断できないことです。 300 func (r *Request) Referer() string 301 302 // MultipartReaderは、これがmultipart/form-dataまたはmultipart/mixed POSTリクエストである場合、MIMEマルチパートリーダーを返します。 303 // それ以外の場合はnilとエラーを返します。 304 // リクエストボディをストリームとして処理するために、[Request.ParseMultipartForm] の代わりにこの関数を使用してください。 305 func (r *Request) MultipartReader() (*multipart.Reader, error) 306 307 // Writeは、ワイヤフォーマットでHTTP/1.1リクエスト(ヘッダーとボディ)を書き込みます。 308 // このメソッドは、リクエストの以下のフィールドを参照します。 309 // 310 // Host 311 // URL 312 // Method(デフォルトは "GET") 313 // Header 314 // ContentLength 315 // TransferEncoding 316 // Body 317 // 318 // Bodyが存在し、Content-Lengthが0以下であり、[Request.TransferEncoding] が "identity"に設定されていない場合、 319 // Writeはヘッダーに "Transfer-Encoding: chunked"を追加します。Bodyは送信後に閉じられます。 320 func (r *Request) Write(w io.Writer) error 321 322 // WriteProxyは、[Request.Write] と似ていますが、HTTPプロキシが期待する形式でリクエストを書き込みます。 323 // 特に、[Request.WriteProxy] は、RFC 7230のセクション5.3に従って、スキームとホストを含む絶対URIでリクエストの最初のRequest-URI行を書き込みます。 324 // WriteProxyは、r.Host または r.URL.Host を使用して、Hostヘッダーも書き込みます。 325 func (r *Request) WriteProxy(w io.Writer) error 326 327 // ParseHTTPVersionは、RFC 7230 Section 2.6 に従ってHTTPバージョン文字列を解析します。 328 // "HTTP/1.0"は(1, 0, true)を返します。注意:"HTTP/2"のようにマイナーバージョンがない文字列は無効です。 329 func ParseHTTPVersion(vers string) (major, minor int, ok bool) 330 331 // NewRequestは、[context.Background] を使用して [NewRequestWithContext] をラップします。 332 func NewRequest(method, url string, body io.Reader) (*Request, error) 333 334 // NewRequestWithContextは、メソッド、URL、およびオプションのボディが与えられた場合に新しい [Request] を返します。 335 // 336 // 提供されたbodyが [io.Closer] でも、返された [Request.Body] はbodyに設定され、ClientのDo、Post、PostForm、および [Transport.RoundTrip] によって(非同期に)閉じられます。 337 // 338 // NewRequestWithContextは、[Client.Do] または [Transport.RoundTrip] で使用するためのRequestを返します。 339 // Server Handlerをテストするためのリクエストを作成するには、net/http/httptestパッケージの [NewRequest] 関数を使用するか、 340 // [ReadRequest] を使用するか、またはRequestフィールドを手動で更新します。送信元のクライアントリクエストの場合、 341 // コンテキストはリクエストとその応答の全寿命を制御します:接続の取得、リクエストの送信、および応答ヘッダーとボディの読み取り。 342 // 入力リクエストフィールドと出力リクエストフィールドの違いについては、Requestタイプのドキュメントを参照してください。 343 // 344 // bodyが [*bytes.Buffer]、 [*bytes.Reader]、または [*strings.Reader] の場合、返されたリクエストのContentLengthはその正確な値に設定されます(-1の代わりに)、 345 // GetBodyが作成されます(307および308のリダイレクトがボディを再生できるように)、およびContentLengthが0の場合はBodyが [NoBody] に設定されます。 346 func NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error) 347 348 // BasicAuthは、リクエストがHTTP Basic認証を使用する場合、リクエストのAuthorizationヘッダーで提供されるユーザー名とパスワードを返します。 349 // RFC 2617 Section 2 を参照してください。 350 func (r *Request) BasicAuth() (username, password string, ok bool) 351 352 // SetBasicAuthは、提供されたユーザー名とパスワードを使用して、HTTP Basic認証を使用するようにリクエストのAuthorizationヘッダーを設定します。 353 // 354 // HTTP Basic認証では、提供されたユーザー名とパスワードは暗号化されません。 HTTPSリクエストでのみ使用することが一般的です。 355 // 356 // ユーザー名にはコロンを含めることはできません。一部のプロトコルでは、ユーザー名とパスワードを事前にエスケープする追加の要件がある場合があります。たとえば、OAuth2と一緒に使用する場合、両方の引数を最初に [url.QueryEscape] でURLエンコードする必要があります。 357 func (r *Request) SetBasicAuth(username, password string) 358 359 // ReadRequestは、bから受信したリクエストを読み取り、解析します。 360 // 361 // ReadRequestは、低レベルの関数であり、特殊なアプリケーションにのみ使用する必要があります。 362 // ほとんどのコードは、[Server] を使用してリクエストを読み取り、[Handler] インターフェイスを介して処理する必要があります。 363 // ReadRequestは、HTTP/1.xリクエストのみをサポートしています。 HTTP/2の場合は、golang.org/x/net/http2 を使用してください。 364 func ReadRequest(b *bufio.Reader) (*Request, error) 365 366 // MaxBytesReaderは、[io.LimitReader] に似ていますが、着信リクエストボディのサイズを制限するために使用されます。 367 // io.LimitReaderとは異なり、MaxBytesReaderの結果はReadCloserであり、制限を超えたReadに対して [*MaxBytesError] 型の非nilエラーを返し、Closeメソッドが呼び出されたときに基になるリーダーを閉じます。 368 // 369 // MaxBytesReaderは、クライアントが誤ってまたは悪意を持って大きなリクエストを送信してサーバーのリソースを浪費することを防止します。可能であれば、[ResponseWriter] に制限に達した後に接続を閉じるように指示します。 370 func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser 371 372 // MaxBytesErrorは、[MaxBytesReader] の読み取り制限を超えた場合に [MaxBytesReader] によって返されます。 373 type MaxBytesError struct { 374 Limit int64 375 } 376 377 func (e *MaxBytesError) Error() string 378 379 // ParseFormはr.Formとr.PostFormを埋めます。 380 // 381 // すべてのリクエストに対して、ParseFormはURLから生のクエリを解析し、r.Formを更新します。 382 // 383 // POST、PUT、およびPATCHリクエストの場合、それはまた、リクエストボディを読み取り、フォームとして解析し、その結果をr.PostFormとr.Formの両方に入れます。リクエストボディのパラメータは、r.FormのURLクエリ文字列値より優先されます。 384 // 385 // リクエストボディのサイズがすでに [MaxBytesReader] によって制限されていない場合、サイズは10MBに制限されます。 386 // 387 // 他のHTTPメソッド、またはContent-Typeがapplication/x-www-form-urlencodedでない場合、リクエストボディは読み取られず、r.PostFormはnilでない空の値に初期化されます。 388 // 389 // [Request.ParseMultipartForm] は自動的にParseFormを呼び出します。 390 // ParseFormは冪等です。 391 func (r *Request) ParseForm() error 392 393 // ParseMultipartFormは、リクエストボディをmultipart/form-dataとして解析します。 394 // リクエストボディ全体が解析され、そのファイルパーツの最大maxMemoryバイトがメモリに格納され、残りは一時ファイルに格納されます。 395 // ParseMultipartFormは必要に応じて [Request.ParseForm] を呼び出します。 396 // ParseFormがエラーを返した場合、ParseMultipartFormはそれを返しますが、リクエストボディの解析を続けます。 397 // ParseMultipartFormを1回呼び出した後、以降の呼び出しは効果がありません。 398 func (r *Request) ParseMultipartForm(maxMemory int64) error 399 400 // FormValueは、クエリの名前付きコンポーネントの最初の値を返します。 401 // 優先順位は以下の通りです: 402 // 1. application/x-www-form-urlencoded形式のフォームボディ(POST、PUT、PATCHのみ) 403 // 2. クエリパラメータ(常に) 404 // 3. multipart/form-data形式のフォームボディ(常に) 405 // 406 // FormValueは必要に応じて [Request.ParseMultipartForm] と [Request.ParseForm] を呼び出し、 407 // これらの関数が返すエラーは無視します。 408 // キーが存在しない場合、FormValueは空文字列を返します。 409 // 同じキーの複数の値にアクセスするには、ParseFormを呼び出し、 410 // その後で [Request.Form] を直接調べます。 411 func (r *Request) FormValue(key string) string 412 413 // PostFormValueは、POST、PUT、またはPATCHリクエストボディの名前付きコンポーネントの最初の値を返します。 414 // URLクエリパラメータは無視されます。 415 // 必要に応じて、PostFormValueは [Request.ParseMultipartForm] および [Request.ParseForm] を呼び出し、 416 // これらの関数によって返されるエラーを無視します。 417 // キーが存在しない場合、PostFormValueは空の文字列を返します。 418 func (r *Request) PostFormValue(key string) string 419 420 // FormFileは、指定されたフォームキーの最初のファイルを返します。 421 // 必要に応じて、FormFileは [Request.ParseMultipartForm] および [Request.ParseForm] を呼び出します。 422 func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) 423 424 // PathValueは、リクエストに一致した [ServeMux] パターンの名前付きパスワイルドカードの値を返します。 425 // リクエストがパターンに一致しなかった場合、またはパターンにそのようなワイルドカードがない場合、空の文字列を返します。 426 func (r *Request) PathValue(name string) string 427 428 // SetPathValue sets name to value, so that subsequent calls to r.PathValue(name) 429 // return value. 430 func (r *Request) SetPathValue(name, value string)