github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/http/responsecontroller.go (about)

     1  // Copyright 2022 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 http
     6  
     7  import (
     8  	"github.com/shogo82148/std/bufio"
     9  	"github.com/shogo82148/std/net"
    10  	"github.com/shogo82148/std/time"
    11  )
    12  
    13  // ResponseControllerは、HTTPハンドラーがレスポンスを制御するために使用されます。
    14  //
    15  // [Handler.ServeHTTP] メソッドが返された後にResponseControllerを使用することはできません。
    16  type ResponseController struct {
    17  	rw ResponseWriter
    18  }
    19  
    20  // NewResponseControllerは、リクエスト用の [ResponseController] を作成します。
    21  //
    22  // ResponseWriterは、[Handler.ServeHTTP] メソッドに渡された元の値である必要があります。
    23  // または、元のResponseWriterを返すUnwrapメソッドを持っている必要があります。
    24  //
    25  // ResponseWriterが次のいずれかのメソッドを実装している場合、ResponseControllerは
    26  // 適切に呼び出します。
    27  //
    28  //	Flush()
    29  //	FlushError() error // エラーを返す代替Flush
    30  //	Hijack() (net.Conn、*bufio.ReadWriter、error)
    31  //	SetReadDeadline(deadline time.Time) error
    32  //	SetWriteDeadline(deadline time.Time) error
    33  //	EnableFullDuplex() error
    34  //
    35  // ResponseWriterがメソッドをサポートしていない場合、ResponseControllerは
    36  // [ErrNotSupported] に一致するエラーを返します。
    37  func NewResponseController(rw ResponseWriter) *ResponseController
    38  
    39  // Flushは、バッファリングされたデータをクライアントにフラッシュします。
    40  func (c *ResponseController) Flush() error
    41  
    42  // Hijackは、呼び出し元が接続を引き継ぐことを可能にします。
    43  // 詳細については、Hijackerインターフェースを参照してください。
    44  func (c *ResponseController) Hijack() (net.Conn, *bufio.ReadWriter, error)
    45  
    46  // SetReadDeadlineは、ボディを含むリクエスト全体の読み取りの期限を設定します。
    47  // 期限が超過した後にリクエストボディから読み取りを行うと、エラーが返されます。
    48  // ゼロ値は期限がないことを意味します。
    49  //
    50  // 期限が超過した後に読み取り期限を設定しても、期限は延長されません。
    51  func (c *ResponseController) SetReadDeadline(deadline time.Time) error
    52  
    53  // SetWriteDeadlineは、レスポンスの書き込みの期限を設定します。
    54  // 期限が超過した後にレスポンスボディに書き込みを行うと、ブロックされず、
    55  // データがバッファリングされている場合は成功する可能性があります。
    56  // ゼロ値は期限がないことを意味します。
    57  //
    58  // 期限が超過した後に書き込み期限を設定しても、期限は延長されません。
    59  func (c *ResponseController) SetWriteDeadline(deadline time.Time) error
    60  
    61  // EnableFullDuplexは、リクエストハンドラが [Request.Body] からの読み取りを交互に行い、
    62  // [ResponseWriter] への書き込みと交互に行うことを示します。
    63  //
    64  // HTTP/1リクエストの場合、Go HTTPサーバーはデフォルトで、レスポンスの書き込みを開始する前に
    65  // リクエストボディの未読部分を消費し、ハンドラがリクエストから読み取りとレスポンスの書き込みを
    66  // 同時に行うことを防止します。EnableFullDuplexを呼び出すと、この動作が無効になり、
    67  // ハンドラがリクエストからの読み取りを続けながらレスポンスを同時に書き込むことができるようになります。
    68  //
    69  // HTTP/2リクエストの場合、Go HTTPサーバーは常に並行して読み取りとレスポンスを許可します。
    70  func (c *ResponseController) EnableFullDuplex() error