github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/http/response.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 Response reading and parsing.
     6  
     7  package http
     8  
     9  import (
    10  	"github.com/shogo82148/std/bufio"
    11  	"github.com/shogo82148/std/crypto/tls"
    12  	"github.com/shogo82148/std/errors"
    13  	"github.com/shogo82148/std/io"
    14  	"github.com/shogo82148/std/net/url"
    15  )
    16  
    17  // Responseは、HTTPリクエストからのレスポンスを表します。
    18  //
    19  // [Client] と [Transport] は、レスポンスヘッダが受信された後、サーバーからResponsesを返します。
    20  // レスポンスボディは、Bodyフィールドが読み取られるたびにオンデマンドでストリーミングされます。
    21  type Response struct {
    22  	Status     string
    23  	StatusCode int
    24  	Proto      string
    25  	ProtoMajor int
    26  	ProtoMinor int
    27  
    28  	// Headerは、ヘッダーキーを値にマップします。
    29  	// レスポンスに同じキーを持つ複数のヘッダーがある場合、それらはカンマ区切りで連結される場合があります。
    30  	// (RFC 7230 Section 3.2.2 では、複数のヘッダーがカンマ区切りのシーケンスとして意味的に等価である必要があります。)
    31  	// Headerの値がこの構造体の他のフィールド(ContentLength、TransferEncoding、Trailerなど)によって重複する場合、フィールド値が優先されます。
    32  	//
    33  	// マップ内のキーは正準化されます(CanonicalHeaderKeyを参照)。
    34  	Header Header
    35  
    36  	// Bodyは、レスポンスボディを表します。
    37  	//
    38  	// レスポンスボディは、Bodyフィールドが読み取られるたびにオンデマンドでストリーミングされます。
    39  	// ネットワーク接続が失敗した場合や、サーバーがレスポンスを終了した場合、Body.Read呼び出しはエラーを返します。
    40  	//
    41  	// http ClientおよびTransportは、Bodyが常にnilでないことを保証します。
    42  	// これは、ボディのないレスポンスまたは長さがゼロのボディを持つレスポンスでも同様です。
    43  	// Bodyを閉じるのは呼び出し側の責任です。
    44  	// デフォルトのHTTPクライアントのTransportは、Bodyが完全に読み取られて閉じられていない場合、
    45  	// HTTP/1.xの「keep-alive」TCP接続を再利用しない場合があります。
    46  	//
    47  	// サーバーが「chunked」Transfer-Encodingで返答した場合、Bodyは自動的にデチャンクされます。
    48  	//
    49  	// Go 1.12以降、Bodyは、WebSocketsおよびHTTP/2の「h2c」モードで使用される「101 Switching Protocols」レスポンスに成功した場合、io.Writerも実装します。
    50  	Body io.ReadCloser
    51  
    52  	// ContentLengthは、関連するコンテンツの長さを記録します。
    53  	// 値-1は、長さが不明であることを示します。
    54  	// Request.Methodが"HEAD"でない限り、0以上の値は、Bodyから指定されたバイト数を読み取ることができることを示します。
    55  	ContentLength int64
    56  
    57  	// TransferEncodingは、最も外側から最も内側の転送エンコーディングを含みます。
    58  	// 値がnilの場合、"identity"エンコーディングが使用されます。
    59  	TransferEncoding []string
    60  
    61  	// Closeは、ヘッダーがBodyの読み取り後に接続を閉じるよう指示したかどうかを記録します。
    62  	// この値はクライアントに対するアドバイスです。
    63  	// ReadResponseまたはResponse.Writeは、接続を閉じません。
    64  	Close bool
    65  
    66  	// Uncompressedは、レスポンスが圧縮されて送信されたが、httpパッケージによって解凍されたかどうかを報告します。
    67  	// trueの場合、Bodyから読み取ると、サーバーから実際に設定された圧縮されたコンテンツの代わりに、解凍されたコンテンツが返されます。
    68  	// ContentLengthは-1に設定され、"Content-Length"および"Content-Encoding"フィールドはresponseHeaderから削除されます。
    69  	// サーバーからの元のレスポンスを取得するには、Transport.DisableCompressionをtrueに設定します。
    70  	Uncompressed bool
    71  
    72  	// Trailerは、トレーラーキーをHeaderと同じ形式の値にマップします。
    73  	//
    74  	// Trailerには最初に、サーバーの"Trailer"ヘッダー値で指定されたキーごとに1つのnil値のみが含まれます。
    75  	// これらの値はHeaderに追加されません。
    76  	//
    77  	// BodyのRead呼び出しと同時にTrailerにアクセスしないでください。
    78  	//
    79  	// Body.Readがio.EOFを返した後、Trailerにはサーバーから送信されたトレーラー値が含まれます。
    80  	Trailer Header
    81  
    82  	// Requestは、このResponseを取得するために送信されたリクエストです。
    83  	// RequestのBodyはnilです(すでに消費されています)。
    84  	// これは、クライアントリクエストに対してのみ設定されます。
    85  	Request *Request
    86  
    87  	// TLSは、レスポンスを受信したTLS接続に関する情報を含みます。
    88  	// 非暗号化のレスポンスの場合、nilです。
    89  	// このポインタはレスポンス間で共有され、変更してはいけません。
    90  	TLS *tls.ConnectionState
    91  }
    92  
    93  // Cookiesは、Set-Cookieヘッダーで設定されたCookieを解析して返します。
    94  func (r *Response) Cookies() []*Cookie
    95  
    96  // ErrNoLocationは、[Response.Location] メソッドがLocationヘッダーが存在しない場合に返されます。
    97  var ErrNoLocation = errors.New("http: no Location header in response")
    98  
    99  // Locationは、レスポンスの「Location」ヘッダーのURLを返します。
   100  // 存在する場合、相対リダイレクトは [Response.Request] に対して相対的に解決されます。
   101  // Locationヘッダーが存在しない場合、[ErrNoLocation] が返されます。
   102  func (r *Response) Location() (*url.URL, error)
   103  
   104  // ReadResponseは、rからHTTPレスポンスを読み取り、返します。
   105  // reqパラメータは、この [Response] に対応する [Request] をオプションで指定します。
   106  // nilの場合、GETリクエストが想定されます。
   107  // クライアントは、resp.Bodyを読み取り終えたらresp.Body.Closeを呼び出す必要があります。
   108  // その呼び出しの後、クライアントはresp.Trailerを調べて、レスポンストレーラーに含まれるキー/値ペアを見つけることができます。
   109  func ReadResponse(r *bufio.Reader, req *Request) (*Response, error)
   110  
   111  // ProtoAtLeastは、レスポンスで使用されるHTTPプロトコルが少なくともmajor.minorであるかどうかを報告します。
   112  func (r *Response) ProtoAtLeast(major, minor int) bool
   113  
   114  // Writeは、HTTP/1.xサーバーレスポンス形式でrをwに書き込みます。
   115  // ステータス行、ヘッダー、ボディ、およびオプションのトレーラーを含みます。
   116  //
   117  // このメソッドは、レスポンスrの以下のフィールドを参照します。
   118  //
   119  //	StatusCode
   120  //	ProtoMajor
   121  //	ProtoMinor
   122  //	Request.Method
   123  //	TransferEncoding
   124  //	Trailer
   125  //	Body
   126  //	ContentLength
   127  //	Header, 非正準化キーの値は予測不可能な動作をします
   128  //
   129  // レスポンスボディは送信後に閉じられます。
   130  func (r *Response) Write(w io.Writer) error