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

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

このコミットは、Go言語のnet/httpパッケージに、HTTPステータスコード「418 I'm a teapot」を追加するものです。これは、RFC 2324で定義されたユーモラスなステータスコードであり、HTTPプロトコルにおける遊び心のある側面を反映しています。

コミット

commit 5fb82d8cf600ad7388306a0bf9899dc2a93aaafa
Author: David Symonds <dsymonds@golang.org>
Date:   Fri Feb 24 11:55:31 2012 +1100

    net/http: add overlooked 418 status code, per RFC 2324.
    
    R=golang-dev, bradfitz, rsc
    CC=golang-dev
    https://golang.org/cl/5688067

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

https://github.com/golang/go/commit/5fb82d8cf600ad7388306a0bf9899dc2a93aaafa

元コミット内容

net/http: add overlooked 418 status code, per RFC 2324.

R=golang-dev, bradfitz, rsc
CC=golang-dev
https://golang.org/cl/5688067

変更の背景

この変更は、HTTPステータスコード「418 I'm a teapot」をGo言語の標準ライブラリであるnet/httpパッケージに追加するものです。このステータスコードは、RFC 2324「Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)」で定義されています。

RFC 2324は、1998年4月1日にエイプリルフールのジョークとして公開された、風刺的なRFCです。これは、コーヒーポットを制御するためのプロトコルを定義しており、HTTPを不適切に拡張する方法を強調することを目的としていました。その中で、サーバーがコーヒーポットであり、コーヒーを淹れることができない場合に返されるエラーコードとして「418 I'm a teapot」が導入されました。

このコミットは、Goのnet/httpパッケージが、HTTPプロトコルの定義に忠実であるという原則に基づき、このユーモラスな、しかし公式に定義されたステータスコードを見落とさないように追加されたものと考えられます。これは、プロトコルの完全な実装を目指すGoの姿勢を示す一例とも言えます。

前提知識の解説

HTTPステータスコード

HTTPステータスコードは、Webサーバーがクライアントからのリクエストに対して、その結果を伝えるために使用する3桁の数字です。これらのコードは、リクエストが成功したか、リダイレクトが必要か、クライアントエラーが発生したか、サーバーエラーが発生したかなどを示します。例えば、200 OKはリクエストが成功したことを意味し、404 Not Foundはリクエストされたリソースが見つからなかったことを意味します。

RFC (Request for Comments)

RFCは、インターネット技術に関する公式な文書のシリーズです。インターネットのプロトコル、手順、プログラムなどを定義し、標準化するために使用されます。RFCは、インターネットコミュニティによって作成され、ピアレビュープロセスを経て公開されます。中には、RFC 2324のように、エイプリルフールのジョークとして公開される風刺的なものも存在します。

RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)

RFC 2324は、1998年4月1日に公開されたエイプリルフールのジョークRFCです。このRFCは、コーヒーポットを制御するためのプロトコルであるHTCPCPを定義しています。これは、HTTPをベースにしており、コーヒーを淹れるためのBREWメソッドや、ミルクや砂糖などの追加オプションを指定するためのヘッダーフィールドなどを導入しています。

このRFCの主な目的は、HTTPが不適切に拡張される可能性を風刺的に示すことでした。その中で、サーバーがコーヒーポットであり、コーヒーを淹れることができない場合に返されるエラーコードとして、418 I'm a teapotが定義されました。このステータスコードは、そのユーモラスな性質から、Web開発者の間で一種のイースターエッグやジョークとして広く知られるようになりました。

技術的詳細

418 I'm a teapotステータスコードは、HTTPのクライアントエラー(4xx)の範囲に属します。通常、4xxエラーはクライアントのリクエストに問題があることを示しますが、この418は非常に特殊なケースです。これは、クライアントがコーヒーを淹れるようにリクエストしたが、サーバーがコーヒーポットであるため、そのリクエストを処理できないことを示します。

このステータスコードは、実際のWebアプリケーションで広く使用されることはありませんが、開発者が遊び心のあるエラーメッセージを表示したり、特定の状況下でのデバッグ目的で使用したりすることがあります。また、一部のWebフレームワークやライブラリでは、このステータスコードがサポートされていることがあります。

Go言語のnet/httpパッケージにこのステータスコードが追加されたことは、GoがHTTPプロトコルの定義を厳密に遵守し、そのすべての側面(たとえそれがユーモラスなものであっても)を網羅しようとする姿勢を示しています。これにより、開発者はnet/httpパッケージを使用して、この特殊なステータスコードを簡単に利用できるようになります。

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

--- a/src/pkg/net/http/status.go
+++ b/src/pkg/net/http/status.go
@@ -43,6 +43,7 @@ const (
 	StatusUnsupportedMediaType         = 415
 	StatusRequestedRangeNotSatisfiable = 416
 	StatusExpectationFailed            = 417
+\tStatusTeapot                       = 418
 
 	StatusInternalServerError     = 500
 	StatusNotImplemented          = 501
@@ -90,6 +91,7 @@ var statusText = map[int]string{
 	StatusUnsupportedMediaType:         "Unsupported Media Type",
 	StatusRequestedRangeNotSatisfiable: "Requested Range Not Satisfiable",
 	StatusExpectationFailed:            "Expectation Failed",
+\tStatusTeapot:                       "I'm a teapot",
 
 	StatusInternalServerError:     "Internal Server Error",
 	StatusNotImplemented:          "Not Implemented",

コアとなるコードの解説

このコミットでは、src/pkg/net/http/status.goファイルに2つの変更が加えられています。

  1. constブロックへの追加: StatusExpectationFailed = 417の後に、StatusTeapot = 418が追加されています。これにより、StatusTeapotという定数が、HTTPステータスコード418を表す整数値として定義されます。Go言語では、このように定数としてステータスコードを定義することで、コードの可読性と保守性を高めています。

  2. statusTextマップへの追加: statusTextは、HTTPステータスコードの整数値に対応する標準的なテキストメッセージを格納するマップです。このマップに、StatusTeapot: "I'm a teapot"というエントリが追加されています。これにより、http.StatusText(http.StatusTeapot)のように呼び出すことで、「I'm a teapot」という文字列を取得できるようになります。これは、HTTPレスポンスのステータスラインに表示されるテキストメッセージとして使用されます。

これらの変更により、Goのnet/httpパッケージは、RFC 2324で定義された「418 I'm a teapot」ステータスコードを正式にサポートし、開発者がこのコードを簡単に利用できるようになりました。

関連リンク

参考にした情報源リンク