Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 13140] ファイルの概要

このコミットは、Go言語の標準ライブラリ net/http パッケージにおける ErrBodyNotAllowed エラーメッセージの明確化を目的としています。特に、HTTPのHEADリクエストに対する応答でボディが許可されないケースをより具体的に示すように修正されています。

コミット

commit eacc3cc8a1ad28e58dd8d87a10d165c826ed285f
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Wed May 23 09:31:24 2012 -0700

    net/http: clarify ErrBodyNotAllowed error message
    
    It's usually due to writing on HEAD requests.
    
    R=golang-dev, rsc, r, r
    CC=golang-dev
    https://golang.org/cl/6206106

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/eacc3cc8a1ad28e58dd8d87a10d165c826ed285f

元コミット内容

net/http: clarify ErrBodyNotAllowed error message It's usually due to writing on HEAD requests.

このコミットは、net/http パッケージ内の ErrBodyNotAllowed エラーメッセージをより明確にすることを目的としています。特に、このエラーがHEADリクエストに対する書き込みによって発生することが多いという背景が示されています。

変更の背景

HTTPプロトコルには、様々なリクエストメソッド(GET, POST, HEADなど)とステータスコードが存在します。これらの組み合わせによっては、レスポンスボディの送信が許可されない場合があります。

元の ErrBodyNotAllowed エラーメッセージは「http: response status code does not allow body」(http: レスポンスステータスコードがボディを許可しません)となっていました。これは、ステータスコードが原因でボディが許可されないケースを指していましたが、コミットメッセージにあるように、実際にはHEADリクエストのような特定のリクエストメソッドの場合にもボディが許可されないという状況がありました。

HEADリクエストは、GETリクエストと同様にリソースのヘッダー情報のみを取得するためのものであり、レスポンスボディは含まれません。しかし、サーバーの実装によっては、HEADリクエストに対しても誤ってレスポンスボディを書き込もうとしてしまうことがあります。このような場合に、より適切なエラーメッセージを提供することで、開発者が問題の原因を特定しやすくすることが変更の背景にあります。

この変更は、エラーメッセージをより包括的にし、ステータスコードだけでなくリクエストメソッドもボディの許可/不許可に影響を与えることを明示することで、デバッグの効率を向上させることを意図しています。

前提知識の解説

HTTPリクエストメソッド

HTTP(Hypertext Transfer Protocol)は、Web上でデータをやり取りするためのプロトコルです。クライアントがサーバーにリクエストを送信する際に、そのリクエストの意図を示すために様々な「メソッド」を使用します。

  • GET: 指定されたリソースの表現を取得します。データはURLのクエリパラメータとして送信され、ボディは通常ありません。
  • POST: 指定されたリソースにデータを送信し、サーバーに処理を依頼します。データはリクエストボディに含まれます。
  • HEAD: GETリクエストと全く同じヘッダーを返しますが、レスポンスボディは含みません。これは、リソースのメタデータ(例: Content-Type, Content-Length)のみを確認したい場合や、リソースが存在するかどうかを確認したい場合に有用です。

HTTPステータスコード

HTTPステータスコードは、サーバーがクライアントのリクエストを処理した結果を示す3桁の数字です。例えば、200 OKはリクエストが成功したことを示し、404 Not Foundはリソースが見つからなかったことを示します。

レスポンスボディが許可されないケース

HTTPプロトコルの仕様(RFC 7231など)により、特定のHTTPメソッドやステータスコードの組み合わせでは、レスポンスボディを含めることが許可されていません。

  • HEADリクエスト: 前述の通り、HEADリクエストに対するレスポンスにはボディを含めるべきではありません。サーバーがHEADリクエストに対してボディを書き込もうとすると、プロトコル違反となります。
  • 特定のステータスコード:
    • 1xx (情報レスポンス): 例外的にボディを持つ場合がありますが、通常はボディを持ちません。
    • 204 No Content: リクエストは成功したが、レスポンスボディは含まれないことを示します。
    • 304 Not Modified: リソースが変更されていないことを示し、クライアントはキャッシュされたバージョンを使用すべきであることを意味します。このレスポンスにはボディを含めるべきではありません。

Go言語の net/http パッケージ

net/http はGo言語の標準ライブラリであり、HTTPクライアントとサーバーの実装を提供します。WebアプリケーションやAPIサーバーを構築する際に中心的に使用されます。このパッケージは、HTTPプロトコルの詳細を抽象化し、開発者が簡単にHTTP通信を扱えるように設計されています。

http.ResponseWriter インターフェースは、HTTPレスポンスを構築するために使用されます。このインターフェースを通じて、ヘッダーの設定やレスポンスボディの書き込みが行われます。

技術的詳細

このコミットの技術的な変更は、Go言語の net/http パッケージ内のエラー定義の文字列定数を変更することにあります。

Go言語では、エラーは error インターフェースを実装する型として表現されます。標準ライブラリでは、errors.New 関数を使ってシンプルなエラーメッセージを持つエラー値を生成することがよくあります。

変更前は、ErrBodyNotAllowed エラーは以下のように定義されていました。

var (
    ErrBodyNotAllowed  = errors.New("http: response status code does not allow body")
)

このメッセージは、レスポンスボディが許可されない理由が「ステータスコード」に限定されているかのように読めます。しかし、実際にはHTTPメソッド(特にHEAD)もボディの許可/不許可に影響を与えます。

変更後の定義は以下のようになります。

var (
    ErrBodyNotAllowed  = errors.New("http: request method or response status code does not allow body")
)

この変更により、エラーメッセージは「リクエストメソッドまたはレスポンスステータスコードがボディを許可しません」となり、より正確で包括的な情報を提供するようになりました。これにより、開発者がこのエラーに遭遇した際に、ステータスコードだけでなく、リクエストメソッド(特にHEADリクエスト)も原因として考慮するよう促されます。

この変更は、コードの振る舞いを変更するものではなく、エラーメッセージのテキストのみを変更するものです。しかし、エラーメッセージはデバッグの際に非常に重要な情報源となるため、その正確性は開発効率に直結します。

コアとなるコードの変更箇所

変更は src/pkg/net/http/server.go ファイルの1箇所のみです。

--- a/src/pkg/net/http/server.go
+++ b/src/pkg/net/http/server.go
@@ -31,7 +31,7 @@ import (
 // Errors introduced by the HTTP server.
 var (
  ErrWriteAfterFlush = errors.New("Conn.Write called after Flush")
- ErrBodyNotAllowed  = errors.New("http: response status code does not allow body")
+ ErrBodyNotAllowed  = errors.New("http: request method or response status code does not allow body")
  ErrHijacked        = errors.New("Conn has been hijacked")
  ErrContentLength   = errors.New("Conn.Write wrote more than the declared Content-Length")
 )

コアとなるコードの解説

この変更は、Go言語の net/http パッケージ内で定義されているグローバル変数 ErrBodyNotAllowed の初期化文字列を変更しています。

server.go ファイルは、GoのHTTPサーバーの実装に関連するコードを含んでいます。このファイル内で、HTTPサーバーが内部的に使用する様々なエラーが var ブロックで定義されています。

ErrBodyNotAllowed は、HTTPレスポンスのボディを書き込もうとした際に、その操作がHTTPプロトコルのルールに違反している場合に発生するエラーです。具体的には、レスポンスボディが許可されない状況でボディを書き込もうとした際に、このエラーが返されることになります。

変更前は、エラーメッセージが「response status code does not allow body」と、ステータスコードのみに焦点を当てていました。これは、例えば 204 No Content304 Not Modified のようなステータスコードが設定されたレスポンスにボディを含めることができないという状況を指していました。

しかし、HTTPプロトコルでは、リクエストメソッド(特にHEADメソッド)もレスポンスボディの有無に影響を与えます。HEADリクエストに対するレスポンスは、ステータスコードが何であれ、ボディを含めるべきではありません。

このコミットは、エラーメッセージを「request method or response status code does not allow body」に変更することで、この両方のケースをカバーするようにしました。これにより、開発者がこのエラーメッセージを見たときに、ステータスコードだけでなく、処理中のリクエストメソッドも原因として考慮に入れることができるようになり、デバッグがより容易になります。

これは、コードの振る舞いを変更する「機能的な変更」ではなく、エラーメッセージという「ユーザーインターフェース」の改善であり、開発者の体験を向上させるためのものです。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • RFC 7231 (Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content)
  • GitHubのコミット履歴
  • Goのコードレビューシステム (Gerrit) のCL (Change-List) ページ: https://golang.org/cl/6206106 (これはコミットメッセージに記載されているリンクであり、この変更に関する議論や詳細が含まれている可能性があります。)

[インデックス 13140] ファイルの概要

このコミットは、Go言語の標準ライブラリ net/http パッケージにおける ErrBodyNotAllowed エラーメッセージの明確化を目的としています。特に、HTTPのHEADリクエストに対する応答でボディが許可されないケースをより具体的に示すように修正されています。

コミット

commit eacc3cc8a1ad28e58dd8d87a10d165c826ed285f
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Wed May 23 09:31:24 2012 -0700

    net/http: clarify ErrBodyNotAllowed error message
    
    It's usually due to writing on HEAD requests.
    
    R=golang-dev, rsc, r, r
    CC=golang-dev
    https://golang.org/cl/6206106

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/eacc3cc8a1ad28e58dd8d87a10d165c826ed285f

元コミット内容

net/http: clarify ErrBodyNotAllowed error message It's usually due to writing on HEAD requests.

このコミットは、net/http パッケージ内の ErrBodyNotAllowed エラーメッセージをより明確にすることを目的としています。特に、このエラーがHEADリクエストに対する書き込みによって発生することが多いという背景が示されています。

変更の背景

HTTPプロトコルには、様々なリクエストメソッド(GET, POST, HEADなど)とステータスコードが存在します。これらの組み合わせによっては、レスポンスボディの送信が許可されない場合があります。

元の ErrBodyNotAllowed エラーメッセージは「http: response status code does not allow body」(http: レスポンスステータスコードがボディを許可しません)となっていました。これは、ステータスコードが原因でボディが許可されないケースを指していましたが、コミットメッセージにあるように、実際にはHEADリクエストのような特定のリクエストメソッドの場合にもボディが許可されないという状況がありました。

HEADリクエストは、GETリクエストと同様にリソースのヘッダー情報のみを取得するためのものであり、レスポンスボディは含まれません。しかし、サーバーの実装によっては、HEADリクエストに対しても誤ってレスポンスボディを書き込もうとしてしまうことがあります。このような場合に、より適切なエラーメッセージを提供することで、開発者が問題の原因を特定しやすくすることが変更の背景にあります。

この変更は、エラーメッセージをより包括的にし、ステータスコードだけでなくリクエストメソッドもボディの許可/不許可に影響を与えることを明示することで、デバッグの効率を向上させることを意図しています。

前提知識の解説

HTTPリクエストメソッド

HTTP(Hypertext Transfer Protocol)は、Web上でデータをやり取りするためのプロトコルです。クライアントがサーバーにリクエストを送信する際に、そのリクエストの意図を示すために様々な「メソッド」を使用します。

  • GET: 指定されたリソースの表現を取得します。データはURLのクエリパラメータとして送信され、ボディは通常ありません。
  • POST: 指定されたリソースにデータを送信し、サーバーに処理を依頼します。データはリクエストボディに含まれます。
  • HEAD: GETリクエストと全く同じヘッダーを返しますが、レスポンスボディは含みません。これは、リソースのメタデータ(例: Content-Type, Content-Length)のみを確認したい場合や、リソースが存在するかどうかを確認したい場合に有用です。

HTTPステータスコード

HTTPステータスコードは、サーバーがクライアントのリクエストを処理した結果を示す3桁の数字です。例えば、200 OKはリクエストが成功したことを示し、404 Not Foundはリソースが見つからなかったことを示します。

レスポンスボディが許可されないケース

HTTPプロトコルの仕様(RFC 7231など)により、特定のHTTPメソッドやステータスコードの組み合わせでは、レスポンスボディを含めることが許可されていません。

  • HEADリクエスト: 前述の通り、HEADリクエストに対するレスポンスにはボディを含めるべきではありません。サーバーがHEADリクエストに対してボディを書き込もうとすると、プロトコル違反となります。
  • 特定のステータスコード:
    • 1xx (情報レスポンス): 例外的にボディを持つ場合がありますが、通常はボディを持ちません。
    • 204 No Content: リクエストは成功したが、レスポンスボディは含まれないことを示します。
    • 304 Not Modified: リソースが変更されていないことを示し、クライアントはキャッシュされたバージョンを使用すべきであることを意味します。このレスポンスにはボディを含めるべきではありません。

Go言語の net/http パッケージ

net/http はGo言語の標準ライブラリであり、HTTPクライアントとサーバーの実装を提供します。WebアプリケーションやAPIサーバーを構築する際に中心的に使用されます。このパッケージは、HTTPプロトコルの詳細を抽象化し、開発者が簡単にHTTP通信を扱えるように設計されています。

http.ResponseWriter インターフェースは、HTTPレスポンスを構築するために使用されます。このインターフェースを通じて、ヘッダーの設定やレスポンスボディの書き込みが行われます。

技術的詳細

このコミットの技術的な変更は、Go言語の net/http パッケージ内のエラー定義の文字列定数を変更することにあります。

Go言語では、エラーは error インターフェースを実装する型として表現されます。標準ライブラリでは、errors.New 関数を使ってシンプルなエラーメッセージを持つエラー値を生成することがよくあります。

変更前は、ErrBodyNotAllowed エラーは以下のように定義されていました。

var (
    ErrBodyNotAllowed  = errors.New("http: response status code does not allow body")
)

このメッセージは、レスポンスボディが許可されない理由が「ステータスコード」に限定されているかのように読めます。しかし、実際にはHTTPメソッド(特にHEAD)もボディの許可/不許可に影響を与えます。

変更後の定義は以下のようになります。

var (
    ErrBodyNotAllowed  = errors.New("http: request method or response status code does not allow body")
)

この変更により、エラーメッセージは「リクエストメソッドまたはレスポンスステータスコードがボディを許可しません」となり、より正確で包括的な情報を提供するようになりました。これにより、開発者がこのエラーに遭遇した際に、ステータスコードだけでなく、リクエストメソッドも原因として考慮するよう促されます。

この変更は、コードの振る舞いを変更するものではなく、エラーメッセージのテキストのみを変更するものです。しかし、エラーメッセージはデバッグの際に非常に重要な情報源となるため、その正確性は開発効率に直結します。

コアとなるコードの変更箇所

変更は src/pkg/net/http/server.go ファイルの1箇所のみです。

--- a/src/pkg/net/http/server.go
+++ b/src/pkg/net/http/server.go
@@ -31,7 +31,7 @@ import (
 // Errors introduced by the HTTP server.
 var (
  ErrWriteAfterFlush = errors.New("Conn.Write called after Flush")
- ErrBodyNotAllowed  = errors.New("http: response status code does not allow body")
+ ErrBodyNotAllowed  = errors.New("http: request method or response status code does not allow body")
  ErrHijacked        = errors.New("Conn has been hijacked")
  ErrContentLength   = errors.New("Conn.Write wrote more than the declared Content-Length")
 )

コアとなるコードの解説

この変更は、Go言語の net/http パッケージ内で定義されているグローバル変数 ErrBodyNotAllowed の初期化文字列を変更しています。

server.go ファイルは、GoのHTTPサーバーの実装に関連するコードを含んでいます。このファイル内で、HTTPサーバーが内部的に使用する様々なエラーが var ブロックで定義されています。

ErrBodyNotAllowed は、HTTPレスポンスのボディを書き込もうとした際に、その操作がHTTPプロトコルのルールに違反している場合に発生するエラーです。具体的には、レスポンスボディが許可されない状況でボディを書き込もうとした際に、このエラーが返されることになります。

変更前は、エラーメッセージが「response status code does not allow body」と、ステータスコードのみに焦点を当てていました。これは、例えば 204 No Content304 Not Modified のようなステータスコードが設定されたレスポンスにボディを含めることができないという状況を指していました。

しかし、HTTPプロトコルでは、リクエストメソッド(特にHEADメソッド)もレスポンスボディの有無に影響を与えます。HEADリクエストに対するレスポンスは、ステータスコードが何であれ、ボディを含めるべきではありません。

このコミットは、エラーメッセージを「request method or response status code does not allow body」に変更することで、この両方のケースをカバーするようにしました。これにより、開発者がこのエラーメッセージを見たときに、ステータスコードだけでなく、処理中のリクエストメソッドも原因として考慮に入れることができるようになり、デバッグがより容易になります。

これは、コードの振る舞いを変更する「機能的な変更」ではなく、エラーメッセージという「ユーザーインターフェース」の改善であり、開発者の体験を向上させるためのものです。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • RFC 7231 (Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content)
  • GitHubのコミット履歴
  • Goのコードレビューシステム (Gerrit) のCL (Change-List) ページ: https://golang.org/cl/6206106 (これはコミットメッセージに記載されているリンクであり、この変更に関する議論や詳細が含まれている可能性があります。)
  • Web検索結果: "Go net/http ErrBodyNotAllowed HEAD request"