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