github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/http/server.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 server. See RFC 7230 through 7235.
     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/log"
    15  	"github.com/shogo82148/std/net"
    16  
    17  	"github.com/shogo82148/std/sync"
    18  	"github.com/shogo82148/std/sync/atomic"
    19  	"github.com/shogo82148/std/time"
    20  )
    21  
    22  // HTTPサーバーで使用されるエラー。
    23  var (
    24  	// ErrBodyNotAllowedは、HTTPメソッドまたはレスポンスコードがボディを許可しない場合に、ResponseWriter.Write呼び出しによって返されます。
    25  	ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body")
    26  
    27  	// ErrHijackedは、Hijackerインターフェースを使用して基礎となる接続がハイジャックされた場合に、ResponseWriter.Write呼び出しによって返されます。
    28  	// ハイジャックされた接続でのゼロバイト書き込みは、他の副作用なしにErrHijackedを返します。
    29  	ErrHijacked = errors.New("http: connection has been hijacked")
    30  
    31  	// ErrContentLengthは、Handlerが宣言されたサイズを持つContent-Lengthレスポンスヘッダーを設定し、宣言されたバイト数よりも多くのバイトを書き込もうとした場合に、ResponseWriter.Write呼び出しによって返されます。
    32  	ErrContentLength = errors.New("http: wrote more than the declared Content-Length")
    33  
    34  	// Deprecated: ErrWriteAfterFlushは、net/httpパッケージの何も返さなくなったため、もはや返されません。
    35  	// 呼び出し元は、この変数に対してエラーを比較するべきではありません。
    36  	ErrWriteAfterFlush = errors.New("unused")
    37  )
    38  
    39  // Handlerは、HTTPリクエストに応答します。
    40  //
    41  // [Handler.ServeHTTP] は、応答ヘッダーとデータを [ResponseWriter] に書き込んでから返す必要があります。
    42  // 返すことで、リクエストが完了したことを示します。
    43  // ServeHTTPの呼び出しの完了後または同時に、 [ResponseWriter] を使用するか、[Request.Body]から読み取ることはできません。
    44  //
    45  // HTTPクライアントソフトウェア、HTTPプロトコルバージョン、およびクライアントとGoサーバーの間の中間者によっては、
    46  // [ResponseWriter]に書き込んだ後に [Request.Body] から読み取ることができない場合があります。
    47  // 注意深いハンドラーは、最初に [Request.Body] を読み取り、その後に応答する必要があります。
    48  //
    49  // ボディを読み取る以外の場合、ハンドラーは提供されたRequestを変更してはいけません。
    50  //
    51  // ServeHTTPがパニックを起こすと、サーバー(ServeHTTPの呼び出し元)は、パニックの影響がアクティブなリクエストに限定されたものであると仮定します。
    52  // サーバーはパニックを回復し、サーバーエラーログにスタックトレースを記録し、ネットワーク接続を閉じるか、HTTP/2 RST_STREAMを送信します。
    53  // クライアントが中断された応答を見るが、サーバーがエラーをログに記録しないように、 [ErrAbortHandler] の値でパニックを発生させることで、ハンドラーを中止できます。
    54  type Handler interface {
    55  	ServeHTTP(ResponseWriter, *Request)
    56  }
    57  
    58  // ResponseWriterインターフェースは、HTTPハンドラーがHTTPレスポンスを構築するために使用されます。
    59  //
    60  // [Handler.ServeHTTP] が返された後に、ResponseWriter を使用することはできません。
    61  type ResponseWriter interface {
    62  	Header() Header
    63  
    64  	Write([]byte) (int, error)
    65  
    66  	WriteHeader(statusCode int)
    67  }
    68  
    69  // Flusherインターフェースは、HTTPハンドラーがバッファリングされたデータをクライアントにフラッシュすることを許可するResponseWriterによって実装されます。
    70  //
    71  // デフォルトのHTTP/1.xおよびHTTP/2 [ResponseWriter] 実装は [Flusher] をサポートしていますが、ResponseWriterラッパーはサポートしていない場合があります。
    72  // ハンドラーは常にランタイムでこの機能をテストする必要があります。
    73  //
    74  // FlushをサポートするResponseWriterであっても、クライアントがHTTPプロキシを介して接続されている場合、
    75  // バッファリングされたデータがレスポンスが完了するまでクライアントに到達しない場合があります。
    76  type Flusher interface {
    77  	Flush()
    78  }
    79  
    80  // Hijackerインターフェースは、HTTPハンドラーが接続を引き継ぐことを許可するResponseWriterによって実装されます。
    81  //
    82  // HTTP/1.x接続のデフォルト [ResponseWriter] はHijackerをサポートしていますが、HTTP/2接続は意図的にサポートしていません。
    83  // ResponseWriterラッパーもHijackerをサポートしていない場合があります。
    84  // ハンドラーは常にランタイムでこの機能をテストする必要があります。
    85  type Hijacker interface {
    86  	Hijack() (net.Conn, *bufio.ReadWriter, error)
    87  }
    88  
    89  // CloseNotifierインターフェースは、基礎となる接続が切断されたときに検出できるResponseWriterによって実装されます。
    90  //
    91  // このメカニズムは、レスポンスが準備される前にクライアントが切断された場合、サーバー上の長時間の操作をキャンセルするために使用できます。
    92  //
    93  // Deprecated: CloseNotifierインターフェースは、Goのコンテキストパッケージより前に実装されました。
    94  // 新しいコードでは、[Request.Context] を使用する必要があります。
    95  type CloseNotifier interface {
    96  	CloseNotify() <-chan bool
    97  }
    98  
    99  var (
   100  	// ServerContextKeyは、コンテキストキーです。
   101  	// HTTPハンドラーでContext.Valueと一緒に使用して、ハンドラーを開始したサーバーにアクセスできます。
   102  	// 関連する値の型は*Serverです。
   103  	ServerContextKey = &contextKey{"http-server"}
   104  
   105  	// LocalAddrContextKeyは、コンテキストキーです。
   106  	// HTTPハンドラーでContext.Valueと一緒に使用して、接続が到着したローカルアドレスにアクセスできます。
   107  	// 関連する値の型はnet.Addrです。
   108  	LocalAddrContextKey = &contextKey{"local-addr"}
   109  )
   110  
   111  // TrailerPrefixは、[ResponseWriter.Header] マップのキーに対するマジックプレフィックスで、
   112  // 存在する場合は、マップエントリが実際にはレスポンストレーラーであることを示します。
   113  // プレフィックスは、ServeHTTP呼び出しが終了し、値がトレーラーに送信された後に削除されます。
   114  //
   115  // このメカニズムは、ヘッダーが書き込まれる前には不明なトレーラーにのみ使用することができます。
   116  // トレーラーのセットが固定されている場合、またはヘッダーが書き込まれる前に既知の場合、通常のGoトレーラーメカニズムが推奨されます。
   117  //
   118  //	https://pkg.go.dev/net/http#ResponseWriter
   119  //	https://pkg.go.dev/net/http#example-ResponseWriter-Trailers
   120  const TrailerPrefix = "Trailer:"
   121  
   122  // DefaultMaxHeaderBytesは、HTTPリクエストのヘッダーの許容される最大サイズです。
   123  // これは、[Server.MaxHeaderBytes] を設定することで上書きできます。
   124  const DefaultMaxHeaderBytes = 1 << 20
   125  
   126  // TimeFormatは、HTTPヘッダーで時間を生成するときに使用する時間形式です。
   127  // [time.RFC1123] のようですが、タイムゾーンとしてGMTがハードコードされています。
   128  // フォーマットされる時間はUTCである必要があります。
   129  //
   130  // この時間形式を解析するには、[ParseTime] を参照してください。
   131  const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"
   132  
   133  var _ closeWriter = (*net.TCPConn)(nil)
   134  
   135  // ErrAbortHandlerは、ハンドラーを中止するためのセンチネルパニック値です。
   136  // ServeHTTPからのパニックはすべて、クライアントへの応答を中止しますが、
   137  // ErrAbortHandlerでパニックすると、サーバーのエラーログにスタックトレースを記録しないようにすることができます。
   138  var ErrAbortHandler = errors.New("net/http: abort Handler")
   139  
   140  // HandlerFunc型は、HTTPハンドラーとして通常の関数を使用できるようにするためのアダプタです。
   141  // fが適切なシグネチャを持つ関数である場合、HandlerFunc(f)はfを呼び出す [Handler] です。
   142  type HandlerFunc func(ResponseWriter, *Request)
   143  
   144  // ServeHTTPは、f(w, r) を呼び出します。
   145  func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)
   146  
   147  // Errorは、指定されたエラーメッセージとHTTPコードでリクエストに応答します。
   148  // それ以外に、リクエストを終了しません。呼び出し元は、wに対してさらに書き込みが行われないようにする必要があります。
   149  // エラーメッセージはプレーンテキストである必要があります。
   150  func Error(w ResponseWriter, error string, code int)
   151  
   152  // NotFoundは、HTTP 404 not foundエラーでリクエストに応答します。
   153  func NotFound(w ResponseWriter, r *Request)
   154  
   155  // NotFoundHandlerは、各リクエストに「404ページが見つかりません」という応答を返す単純なリクエストハンドラーを返します。
   156  func NotFoundHandler() Handler
   157  
   158  // StripPrefixは、リクエストURLのPath(および設定されている場合はRawPath)から指定された接頭辞を削除し、ハンドラーhを呼び出してHTTPリクエストを処理するハンドラーを返します。
   159  // prefixで始まらないパスのリクエストには、HTTP 404 not foundエラーで応答します。
   160  // 接頭辞は完全に一致する必要があります。リクエストの接頭辞にエスケープされた文字が含まれている場合、応答もHTTP 404 not foundエラーになります。
   161  func StripPrefix(prefix string, h Handler) Handler
   162  
   163  // Redirectは、リクエストに対してurlにリダイレクトする応答を返します。
   164  // urlは、リクエストパスに対する相対パスである場合があります。
   165  //
   166  // 提供されたコードは通常、[StatusMovedPermanently]、[StatusFound]、または [StatusSeeOther] の3xx範囲にあります。
   167  //
   168  // Content-Typeヘッダーが設定されていない場合、[Redirect] はそれを"text/html; charset=utf-8"に設定し、小さなHTML本文を書き込みます。
   169  // Content-Typeヘッダーを任意の値、nilを含む任意の値に設定すると、その動作が無効になります。
   170  func Redirect(w ResponseWriter, r *Request, url string, code int)
   171  
   172  // RedirectHandlerは、受信した各リクエストを、指定されたステータスコードを使用して、指定されたURLにリダイレクトするリクエストハンドラーを返します。
   173  //
   174  // 提供されたコードは通常、[StatusMovedPermanently]、[StatusFound]、または [StatusSeeOther] の3xx範囲にあります。
   175  func RedirectHandler(url string, code int) Handler
   176  
   177  // ServeMuxは、HTTPリクエストマルチプレクサーです。
   178  // それは、登録されたパターンのリストに対して、各受信リクエストのURLを一致させ、
   179  // URLに最も近いパターンのハンドラーを呼び出します。
   180  //
   181  // # Patterns
   182  //
   183  // パターンは、リクエストのメソッド、ホスト、およびパスに一致することができます。
   184  // いくつかの例:
   185  //
   186  //   - "/index.html" は、任意のホストとメソッドに対してパス "/index.html" に一致します。
   187  //   - "GET /static/" は、"/static/" で始まるGETリクエストに一致します。
   188  //   - "example.com/" は、ホスト "example.com" への任意のリクエストに一致します。
   189  //   - "example.com/{$}" は、ホストが "example.com" でパスが "/" のリクエストに一致します。
   190  //   - "/b/{bucket}/o/{objectname...}" は、最初のセグメントが "b" で、3番目のセグメントが "o" のパスに一致します。
   191  //     "bucket" は2番目のセグメントを示し、"objectname" はパスの残りを示します。
   192  //
   193  // 一般的に、パターンは以下のようになります。
   194  //
   195  //	[METHOD][HOST]/[PATH]
   196  //
   197  // すべての3つの部分はオプションです。"/" は有効なパターンです。
   198  // METHODが存在する場合、後に単一のスペースもしくはタブが続く必要があります。
   199  //
   200  // パターンのリテラル(ワイルドカードでない)部分は、リクエストの対応する部分と大文字小文字を区別して一致します。
   201  //
   202  // メソッドのないパターンはすべてのメソッドに一致します。メソッドがGETの場合、GETとHEADの両方のリクエストに一致します。
   203  // それ以外の場合、メソッドは完全に一致する必要があります。
   204  //
   205  // ホストのないパターンはすべてのホストに一致します。ホストがあるパターンは、そのホストのURLにのみ一致します。
   206  //
   207  // パスには、{NAME}または{NAME...}のワイルドカードセグメントを含めることができます。
   208  // 例えば、"/b/{bucket}/o/{objectname...}" です。
   209  // ワイルドカード名は有効なGo識別子でなければなりません。
   210  // ワイルドカードは完全なパスセグメントでなければなりません。つまり、スラッシュに続き、スラッシュまたは文字列の終わりに続く必要があります。
   211  // 例えば、"/b_{bucket}" は有効なパターンではありません。
   212  //
   213  // 通常、ワイルドカードはリクエストURLの次のリテラルスラッシュ(%2Fではない)で終わる、単一のパスセグメントにのみ一致します。
   214  // ただし、"..."が存在する場合、ワイルドカードは、スラッシュを含むURLパスの残り全体に一致します。
   215  // (したがって、"..."ワイルドカードはパターンの末尾以外に現れることはできません。)
   216  // ワイルドカードの一致は、ワイルドカードの名前を指定して [Request.PathValue] を呼び出すことで取得できます。
   217  // パスの末尾にスラッシュがある場合、匿名の "..." ワイルドカードとして機能します。
   218  //
   219  // 特別なワイルドカード {$} は、URLの末尾にのみ一致します。
   220  // 例えば、パターン "/{$}" はパス "/" にのみ一致し、パターン "/" はすべてのパスに一致します。
   221  //
   222  // 一致には、パターンパスと受信リクエストパスの両方が、セグメントごとにエスケープされていない状態で使用されます。
   223  // したがって、パス "/a%2Fb/100%25" は、2つのセグメント "a/b" と "100%" を持つと見なされます。
   224  // パターン "/a%2fb/" はそれに一致しますが、パターン "/a/b/" は一致しません。
   225  //
   226  // # Precedence
   227  //
   228  // 2つ以上のパターンがリクエストに一致する場合、最も具体的なパターンが優先されます。
   229  // パターンP1がP2よりも具体的であるとは、P1がP2のリクエストの厳密なサブセットに一致する場合を指します。
   230  // つまり、P2がP1のすべてのリクエストに一致し、それ以上に一致する場合です。
   231  // もし、どちらも具体的でない場合、そのパターンは競合します。
   232  // このルールには、後方互換性のための1つの例外があります:
   233  // 2つのパターンがそれ以外の場合に競合し、1つはホストを持ち、もう1つは持っていない場合、
   234  // ホストを持つパターンが優先されます。
   235  // [ServeMux.Handle]または[ServeMux.HandleFunc]に渡されるパターンが
   236  // すでに登録されている他のパターンと競合する場合、それらの関数はパニックを引き起こします。
   237  //
   238  // 一般的なルールの例として、"/images/thumbnails/"は"/images/"よりも具体的であり、両方とも登録できます。
   239  // 前者は"/images/thumbnails/"で始まるパスに一致し、後者は"/images/"サブツリー内の他のパスに一致します。
   240  //
   241  // 別の例として、パターン"GET /"と"/index.html"を考えてみてください。
   242  // 両方が"/index.html"のGETリクエストに一致しますが、前者のパターンはすべての他のGETおよびHEADリクエストに一致し、
   243  // 後者のパターンは異なるメソッドを使用する"/index.html"のすべてのリクエストに一致します。
   244  // パターンは競合します。
   245  //
   246  // # Trailing-slash redirection
   247  //
   248  // 末尾スラッシュまたは "..." ワイルドカードを使用して登録されたサブツリーのハンドラを持つ [ServeMux] を考えてみてください。
   249  // ServeMuxが末尾スラッシュのないサブツリールートのリクエストを受信した場合、
   250  // 末尾スラッシュを追加してリクエストをリダイレクトします。
   251  // この動作は、末尾スラッシュまたは "..." ワイルドカードを使用しないパスの別個の登録によって上書きできます。
   252  // 例えば、"/images/"を登録すると、ServeMuxは"/images"のリクエストを"/images/"にリダイレクトします。
   253  // "/images"が別途登録されていない限りです。
   254  //
   255  // # Request sanitizing
   256  //
   257  // ServeMuxは、URLリクエストパスとHostヘッダーをサニタイズし、ポート番号を削除し、.または..セグメントまたは重複したスラッシュを含むリクエストを同等のクリーンなURLにリダイレクトします。
   258  //
   259  // # Compatibility
   260  //
   261  // ServeMuxのパターン構文と一致動作は、Go 1.22で大幅に変更されました。
   262  // 古い動作を復元するには、GODEBUG環境変数を "httpmuxgo121=1" に設定します。
   263  // この設定は、プログラムの起動時に1回だけ読み取られます。実行中の変更は無視されます。
   264  //
   265  // 互換性のない変更には以下が含まれます。
   266  //   - ワイルドカードは1.21では通常のリテラルパスセグメントでした。
   267  //     例えば、パターン "/{x}" は1.21ではそのパスのみに一致しますが、1.22では1つのセグメントのパスに一致します。
   268  //   - 1.21では、既存のパターンと競合しない限り、パターンは拒否されませんでした。
   269  //     1.22では、構文的に無効なパターンは [ServeMux.Handle] および [ServeMux.HandleFunc] でパニックを引き起こします。
   270  //     例えば、1.21では、パターン "/{" と "/a{x}" はそれ自身に一致しますが、1.22では無効であり、登録時にパニックを引き起こします。
   271  //   - 1.22では、パターンの各セグメントがエスケープ解除されますが、1.21ではそうではありませんでした。
   272  //     例えば、1.22ではパターン "/%61" はパス "/a" ("%61"は "a"のURLエスケープシーケンス) に一致しますが、
   273  //     1.21ではパス "/%2561" のみに一致します("%25"はパーセント記号のエスケープです)。
   274  //   - パターンをパスに一致させる場合、1.22ではパスの各セグメントがエスケープ解除されますが、1.21ではパス全体がエスケープ解除されます。
   275  //     この変更は、スラッシュに隣接する%2Fエスケープを持つパスがどのように処理されるかに影響します。
   276  //     詳細については、https://go.dev/issue/21955 を参照してください。
   277  type ServeMux struct {
   278  	mu       sync.RWMutex
   279  	tree     routingNode
   280  	index    routingIndex
   281  	patterns []*pattern
   282  	mux121   serveMux121
   283  }
   284  
   285  // NewServeMuxは、新しい [ServeMux] を割り当てて返します。
   286  func NewServeMux() *ServeMux
   287  
   288  // DefaultServeMuxは、[Serve] によって使用されるデフォルトの [ServeMux] です。
   289  var DefaultServeMux = &defaultServeMux
   290  
   291  // Handlerは、r.Method、r.Host、およびr.URL.Pathを参照して、
   292  // 指定されたリクエストに使用するハンドラーを返します。
   293  // 常にnilでないハンドラーを返します。
   294  // パスが正規形式でない場合、ハンドラーは正規パスにリダイレクトする内部生成ハンドラーになります。
   295  // ホストにポートが含まれている場合、ハンドラーの一致時には無視されます。
   296  //
   297  // CONNECTリクエストでは、パスとホストは変更されずに使用されます。
   298  //
   299  // Handlerは、リクエストに一致する登録済みのパターン、または内部で生成されたリダイレクトの場合はリダイレクトをたどった後に一致するパスを返します。
   300  //
   301  // リクエストに適用される登録済みハンドラーがない場合、
   302  // Handlerは「ページが見つかりません」というハンドラーと空のパターンを返します。
   303  func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string)
   304  
   305  // ServeHTTPは、リクエストURLに最も近いパターンを持つハンドラにリクエストをディスパッチします。
   306  func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)
   307  
   308  // Handleは、指定されたパターンのハンドラを登録します。
   309  // 登録済みのパターンと競合する場合、Handleはパニックを発生させます。
   310  func (mux *ServeMux) Handle(pattern string, handler Handler)
   311  
   312  // HandleFuncは、指定されたパターンのハンドラ関数を登録します。
   313  // 登録済みのパターンと競合する場合、HandleFuncはパニックを発生させます。
   314  func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))
   315  
   316  // Handleは、[DefaultServeMux]に指定されたパターンのハンドラを登録します。
   317  // [ServeMux]のドキュメントには、パターンの一致方法が説明されています。
   318  func Handle(pattern string, handler Handler)
   319  
   320  // HandleFuncは、[DefaultServeMux]に指定されたパターンのハンドラ関数を登録します。
   321  // [ServeMux]のドキュメントには、パターンの一致方法が説明されています。
   322  func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
   323  
   324  // Serveは、リスナーlに対して着信HTTP接続を受け入れ、それぞれに新しいサービスgoroutineを作成します。
   325  // サービスgoroutineはリクエストを読み取り、その後handlerを呼び出して応答します。
   326  //
   327  // ハンドラは通常nilであり、その場合は [DefaultServeMux] が使用されます。
   328  //
   329  // TLS Config.NextProtosで"h2"が設定された [*tls.Conn] 接続を返すリスナーがある場合、HTTP/2サポートが有効になります。
   330  //
   331  // Serveは常にnilでないエラーを返します。
   332  func Serve(l net.Listener, handler Handler) error
   333  
   334  // ServeTLSは、リスナーlに対して着信HTTPS接続を受け入れ、それぞれに新しいサービスgoroutineを作成します。
   335  // サービスgoroutineはリクエストを読み取り、その後handlerを呼び出して応答します。
   336  //
   337  // ハンドラは通常nilであり、その場合は [DefaultServeMux] が使用されます。
   338  //
   339  // さらに、サーバーの証明書と対応する秘密鍵を含むファイルを提供する必要があります。
   340  // 証明書が認証局によって署名されている場合、certFileはサーバーの証明書、中間証明書、およびCAの証明書を連結したものである必要があります。
   341  //
   342  // ServeTLSは常にnilでないエラーを返します。
   343  func ServeTLS(l net.Listener, handler Handler, certFile, keyFile string) error
   344  
   345  // Serverは、HTTPサーバーを実行するためのパラメータを定義します。
   346  // Serverのゼロ値は有効な構成です。
   347  type Server struct {
   348  	// Addrは、サーバーがリッスンするためのTCPアドレスをオプションで指定します。
   349  	// 形式は「host:port」です。空の場合、「:http」(ポート80)が使用されます。
   350  	// サービス名はRFC 6335で定義され、IANAによって割り当てられます。
   351  	// アドレスの形式の詳細については、net.Dialを参照してください。
   352  	Addr string
   353  
   354  	Handler Handler
   355  
   356  	// DisableGeneralOptionsHandlerがtrueの場合、"OPTIONS *"リクエストをHandlerに渡します。
   357  	// それ以外の場合、200 OKとContent-Length: 0で応答します。
   358  	DisableGeneralOptionsHandler bool
   359  
   360  	// TLSConfigは、ServeTLSとListenAndServeTLSで使用するためのTLS構成をオプションで提供します。
   361  	// この値はServeTLSとListenAndServeTLSによってクローンされるため、tls.Config.SetSessionTicketKeysなどのメソッドを使用して構成を変更することはできません。
   362  	// SetSessionTicketKeysを使用するには、TLSリスナーを使用してServer.Serveを使用します。
   363  	TLSConfig *tls.Config
   364  
   365  	// ReadTimeoutは、ボディを含むリクエスト全体を読み取るための最大時間です。
   366  	// ゼロまたは負の値はタイムアウトがないことを意味します。
   367  	//
   368  	// ReadTimeoutは、ハンドラが各リクエストボディの許容可能な締め切りまたはアップロードレートを決定することを許可しないため、
   369  	// 大抵のユーザーはReadHeaderTimeoutを使用することを好むでしょう。
   370  	// 両方を使用することもできます。
   371  	ReadTimeout time.Duration
   372  
   373  	// ReadHeaderTimeoutは、リクエストヘッダを読み取るために許される時間です。
   374  	// ヘッダを読み取った後、接続の読み取りデッドラインはリセットされ、
   375  	// ハンドラは本文にとって何が遅すぎると考えられるかを決定できます。
   376  	// もしゼロならば、ReadTimeoutの値が使用されます。
   377  	// もし負の値、またはゼロでReadTimeoutがゼロまたは負の値の場合、タイムアウトはありません。
   378  	ReadHeaderTimeout time.Duration
   379  
   380  	// WriteTimeoutは、レスポンスの書き込みがタイムアウトする前の最大時間です。
   381  	// 新しいリクエストヘッダーが読み取られるたびにリセットされます。
   382  	// ReadTimeoutと同様に、ハンドラがリクエストごとに決定を下すことを許可しません。
   383  	// ゼロまたは負の値はタイムアウトがないことを意味します。
   384  	WriteTimeout time.Duration
   385  
   386  	// IdleTimeoutは、keep-alivesが有効な場合に次のリクエストを待つための最大時間です。
   387  	// もしゼロならば、ReadTimeoutの値が使用されます。
   388  	// もし負の値、またはゼロでReadTimeoutがゼロまたは負の値の場合、タイムアウトはありません。
   389  	IdleTimeout time.Duration
   390  
   391  	// MaxHeaderBytesは、リクエストヘッダーのキーと値、およびリクエストラインを解析するためにサーバーが読み取ることができる最大バイト数を制御します。
   392  	// リクエストボディのサイズには影響しません。
   393  	// ゼロの場合、DefaultMaxHeaderBytesが使用されます。
   394  	MaxHeaderBytes int
   395  
   396  	// TLSNextProtoは、ALPNプロトコルアップグレードが発生した場合に提供されたTLS接続の所有権を引き継ぐための関数をオプションで指定します。
   397  	// マップキーはネゴシエートされたプロトコル名です。
   398  	// Handler引数はHTTPリクエストを処理するために使用され、RequestのTLSとRemoteAddrを初期化します(設定されていない場合)。
   399  	// 関数が返されると、接続は自動的に閉じられます。
   400  	// TLSNextProtoがnilでない場合、HTTP/2サポートは自動的に有効になりません。
   401  	TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
   402  
   403  	// ConnStateは、クライアント接続の状態が変化したときに呼び出されるオプションのコールバック関数を指定します。
   404  	// 詳細については、ConnState型と関連する定数を参照してください。
   405  	ConnState func(net.Conn, ConnState)
   406  
   407  	// ErrorLogは、接続の受け入れ時のエラー、ハンドラの予期しない動作、および
   408  	// FileSystemの基礎となるエラーに対するオプションのロガーを指定します。
   409  	// nilの場合、ログはlogパッケージの標準ロガーを使用して行われます。
   410  	ErrorLog *log.Logger
   411  
   412  	// BaseContextは、このサーバーの着信リクエストのベースコンテキストを返すオプションの関数を指定します。
   413  	// 提供されたListenerは、リクエストを開始する特定のリスナーです。
   414  	// BaseContextがnilの場合、デフォルトはcontext.Background()です。
   415  	// nilでない場合、非nilのコンテキストを返す必要があります。
   416  	BaseContext func(net.Listener) context.Context
   417  
   418  	// ConnContextは、新しい接続cに使用されるコンテキストを変更するオプションの関数を指定します。
   419  	// 提供されたctxはBaseContextから派生し、ServerContextKeyの値を持ちます。
   420  	ConnContext func(ctx context.Context, c net.Conn) context.Context
   421  
   422  	inShutdown atomic.Bool
   423  
   424  	disableKeepAlives atomic.Bool
   425  	nextProtoOnce     sync.Once
   426  	nextProtoErr      error
   427  
   428  	mu         sync.Mutex
   429  	listeners  map[*net.Listener]struct{}
   430  	activeConn map[*conn]struct{}
   431  	onShutdown []func()
   432  
   433  	listenerGroup sync.WaitGroup
   434  }
   435  
   436  // Closeは、すべてのアクティブなnet.Listenerと、[StateNew]、[StateActive]、または [StateIdle] の状態にある接続をすぐに閉じます。
   437  // 優雅なシャットダウンには、[Server.Shutdown] を使用してください。
   438  //
   439  // Closeは、WebSocketsなどのハイジャックされた接続を閉じようとはせず(そしてそれらについては何も知りません)、試みません。
   440  //
   441  // Closeは、[Server] の基礎となるListener(s)を閉じる際に返される任意のエラーを返します。
   442  func (srv *Server) Close() error
   443  
   444  // Shutdownは、アクティブな接続を中断することなく、サーバーを正常にシャットダウンします。
   445  // Shutdownは、まずすべてのオープンなリスナーを閉じ、次にすべてのアイドル状態の接続を閉じ、
   446  // そして接続がアイドル状態に戻ってから無期限に待機し、その後シャットダウンします。
   447  // 提供されたコンテキストがシャットダウンが完了する前に期限切れになった場合、
   448  // Shutdownはコンテキストのエラーを返します。それ以外の場合は、[Server] の基礎となる
   449  // Listener(s)を閉じる際に返される任意のエラーを返します。
   450  //
   451  // Shutdownが呼び出されると、[Serve]、[ListenAndServe]、および
   452  // [ListenAndServeTLS] はすぐに [ErrServerClosed] を返します。プログラムが
   453  // 終了せず、代わりにShutdownが返るのを待つことを確認してください。
   454  //
   455  // Shutdownは、WebSocketsのようなハイジャックされた接続を閉じたり、それらを待つことは試みません。
   456  // Shutdownの呼び出し元は、長時間稼働する接続に対してシャットダウンを別途通知し、
   457  // 必要に応じてそれらが閉じるのを待つべきです。シャットダウン通知関数を登録する方法については、
   458  // [Server.RegisterOnShutdown] を参照してください。
   459  //
   460  // Shutdownを呼び出した後、サーバーを再利用することはできません。Serveなどのメソッドを呼び出すと、ErrServerClosedが返されます。
   461  func (srv *Server) Shutdown(ctx context.Context) error
   462  
   463  // RegisterOnShutdownは、[Server.Shutdown] 時に呼び出す関数を登録します。
   464  // これは、ALPNプロトコルアップグレードを受けた接続やハイジャックされた接続を優雅にシャットダウンするために使用できます。
   465  // この関数は、プロトコル固有の優雅なシャットダウンを開始する必要がありますが、シャットダウンが完了するのを待つ必要はありません。
   466  func (srv *Server) RegisterOnShutdown(f func())
   467  
   468  // ConnStateは、サーバーへのクライアント接続の状態を表します。
   469  // これは、オプションの [Server.ConnState] フックによって使用されます。
   470  type ConnState int
   471  
   472  const (
   473  	// StateNewは、すぐにリクエストを送信することが期待される新しい接続を表します。
   474  	// 接続はこの状態で開始し、StateActiveまたはStateClosedに移行します。
   475  	StateNew ConnState = iota
   476  
   477  	// StateActiveは、1バイト以上のリクエストを読み取った接続を表します。
   478  	// StateActiveのServer.ConnStateフックは、リクエストがハンドラに入る前に発生し、
   479  	// リクエストが処理されるまで再び発生しません。
   480  	// リクエストが処理された後、状態はStateClosed、StateHijacked、またはStateIdleに移行します。
   481  	// HTTP/2の場合、StateActiveはゼロから1つのアクティブなリクエストに移行するときに発生し、
   482  	// すべてのアクティブなリクエストが完了するまでにしか移行しません。
   483  	// つまり、ConnStateはリクエストごとの作業に使用できません。
   484  	// ConnStateは接続の全体的な状態のみを示します。
   485  	StateActive
   486  
   487  	// StateIdleは、リクエストの処理が完了し、新しいリクエストを待機しているkeep-alive状態の接続を表します。
   488  	// 接続はStateIdleからStateActiveまたはStateClosedに移行します。
   489  	StateIdle
   490  
   491  	// StateHijackedは、ハイジャックされた接続を表します。
   492  	// これは終端状態です。StateClosedに移行しません。
   493  	StateHijacked
   494  
   495  	// StateClosedは、閉じられた接続を表します。
   496  	// これは終端状態です。ハイジャックされた接続はStateClosedに移行しません。
   497  	StateClosed
   498  )
   499  
   500  func (c ConnState) String() string
   501  
   502  // AllowQuerySemicolonsは、URLクエリ内のエスケープされていないセミコロンをアンパサンドに変換し、ハンドラhを呼び出すハンドラを返します。
   503  //
   504  // これにより、Go 1.17以前のクエリパラメータをセミコロンとアンパサンドの両方で分割する動作が復元されます(golang.org/issue/25192 を参照)。
   505  // ただし、この動作は多くのプロキシと一致せず、不一致がセキュリティ上の問題を引き起こす可能性があります。
   506  //
   507  // AllowQuerySemicolonsは、[Request.ParseForm] が呼び出される前に呼び出す必要があります。
   508  func AllowQuerySemicolons(h Handler) Handler
   509  
   510  // ListenAndServeは、TCPネットワークアドレスsrv.Addrでリッスンし、
   511  // [Serve] を呼び出して着信接続のリクエストを処理します。
   512  // 受け入れられた接続は、TCP keep-alivesを有効にするように構成されます。
   513  //
   514  // srv.Addrが空白の場合、":http"が使用されます。
   515  //
   516  // ListenAndServeは常に非nilのエラーを返します。[Server.Shutdown] または [Server.Close] の後、
   517  // 返されるエラーは [ErrServerClosed] です。
   518  func (srv *Server) ListenAndServe() error
   519  
   520  // ErrServerClosedは、[Server.Shutdown] または [Server.Close] の呼び出し後、[Server.Serve]、[ServeTLS]、[ListenAndServe]、および [ListenAndServeTLS] メソッドによって返されます。
   521  var ErrServerClosed = errors.New("http: Server closed")
   522  
   523  // Serveは、Listener lで着信接続を受け入れ、それぞれに新しいサービスgoroutineを作成します。
   524  // サービスgoroutineはリクエストを読み取り、srv.Handlerを呼び出してそれに応答します。
   525  //
   526  // Listenerが [*tls.Conn] 接続を返し、TLS Config.NextProtosで「h2」が構成されている場合、HTTP/2サポートが有効になります。
   527  //
   528  // Serveは常に非nilのエラーを返し、lを閉じます。
   529  // [Server.Shutdown] または [Server.Close] の後、返されるエラーは [ErrServerClosed] です。
   530  func (srv *Server) Serve(l net.Listener) error
   531  
   532  // ServeTLSは、Listener lで着信接続を受け入れ、それぞれに新しいサービスgoroutineを作成します。
   533  // サービスgoroutineはTLSのセットアップを実行し、リクエストを読み取り、srv.Handlerを呼び出してそれに応答します。
   534  //
   535  // [Server] のTLSConfig.CertificatesまたはTLSConfig.GetCertificateがどちらも設定されていない場合、
   536  // サーバーの証明書と対応する秘密鍵が含まれるファイルを提供する必要があります。
   537  // 証明書が認証局によって署名されている場合、certFileはサーバーの証明書、中間証明書、およびCAの証明書を連結したものである必要があります。
   538  //
   539  // ServeTLSは常に非nilのエラーを返し、lを閉じます。
   540  // [Server.Shutdown] または [Server.Close] の後、返されるエラーは [ErrServerClosed] です。
   541  func (srv *Server) ServeTLS(l net.Listener, certFile, keyFile string) error
   542  
   543  // SetKeepAlivesEnabledは、HTTP keep-alivesが有効かどうかを制御します。
   544  // デフォルトでは、keep-alivesは常に有効になっています。非常にリソースが制限された環境またはシャットダウン中のサーバーのみ、それらを無効にする必要があります。
   545  func (srv *Server) SetKeepAlivesEnabled(v bool)
   546  
   547  // ListenAndServeは、TCPネットワークアドレスaddrでリッスンし、
   548  // [Serve] を呼び出して着信接続のリクエストを処理します。
   549  // 受け入れられた接続は、TCP keep-alivesを有効にするように構成されます。
   550  //
   551  // ハンドラは通常nilであり、その場合は [DefaultServeMux] が使用されます。
   552  //
   553  // ListenAndServeは常に非nilのエラーを返します。
   554  func ListenAndServe(addr string, handler Handler) error
   555  
   556  // ListenAndServeTLSは、[ListenAndServe] と同じように動作しますが、HTTPS接続を想定しています。
   557  // さらに、サーバーの証明書と一致する秘密鍵を含むファイルを提供する必要があります。
   558  // 証明書が認証局によって署名されている場合、certFileはサーバーの証明書、中間証明書、およびCAの証明書を連結したものである必要があります。
   559  func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error
   560  
   561  // ListenAndServeTLSは、TCPネットワークアドレスsrv.Addrでリッスンし、
   562  // [ServeTLS] を呼び出して着信TLS接続のリクエストを処理します。
   563  // 受け入れられた接続は、TCP keep-alivesを有効にするように構成されます。
   564  //
   565  // [Server] のTLSConfig.CertificatesまたはTLSConfig.GetCertificateがどちらも設定されていない場合、
   566  // サーバーの証明書と対応する秘密鍵が含まれるファイルを提供する必要があります。
   567  // 証明書が認証局によって署名されている場合、certFileはサーバーの証明書、中間証明書、およびCAの証明書を連結したものである必要があります。
   568  //
   569  // srv.Addrが空白の場合、":https"が使用されます。
   570  //
   571  // ListenAndServeTLSは常に非nilのエラーを返します。[Server.Shutdown] または
   572  // [Server.Close] の後、返されるエラーは [ErrServerClosed] です。
   573  func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error
   574  
   575  // TimeoutHandlerは、指定された時間制限でhを実行する [Handler] を返します。
   576  //
   577  // 新しいHandlerは、各リクエストを処理するためにh.ServeHTTPを呼び出しますが、
   578  // 呼び出しがその時間制限を超えて実行されると、ハンドラは503 Service Unavailableエラーと
   579  // そのボディ内の指定されたメッセージで応答します。
   580  // (もしmsgが空であれば、適切なデフォルトメッセージが送信されます。)
   581  // そのようなタイムアウトの後、hによるその [ResponseWriter] への書き込みは
   582  // [ErrHandlerTimeout] を返します。
   583  //
   584  // TimeoutHandlerは [Pusher] インターフェースをサポートしますが、
   585  // [Hijacker] または [Flusher] インターフェースはサポートしません。
   586  func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler
   587  
   588  // ErrHandlerTimeout is returned on [ResponseWriter] Write calls
   589  // in handlers which have timed out.
   590  var ErrHandlerTimeout = errors.New("http: Handler timeout")
   591  
   592  var _ Pusher = (*timeoutWriter)(nil)
   593  
   594  // MaxBytesHandlerは、[ResponseWriter] と [Request.Body] をMaxBytesReaderでラップしてhを実行する [Handler] を返します。
   595  func MaxBytesHandler(h Handler, n int64) Handler