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