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)