Techいつもコードのことばかり考えている人のために。protocolのstatus-lineに入るreason-phraseについて調べることになりました。その結果をまとめておきます。status-lineのreason-phraseとは?まずはstatus-lineのreason-pheraseについておさらいします。Found」といった内容がサーバサイトの処理結果に応じてクライアントに返されます。7230で以下のように定義されています。requestの成否が返されます。その一覧はRFC7231で確認することができます。続くreason-phraseには人間が理解できるようにstatus-codeの内容を簡潔に示すテキストが入ります。7230では以下のように定義されていて、あまり現代では必要性無さそうです。clients.更には続けてクライアントソフトは無視すべきであると書かれています。7230で以下のように定義されています。)先頭がアスタリスクなので、全て省略しても規格上は正しい、つまりreason-phraseは規格上省略可です。一応RFC7231にstatus-codeごとにreason-phraseの推奨案が記載されていますが、あくまで推奨なので独自に変えたとしてもプロトコルの動作に影響を与えないこととなっています(それで挙動が変わることが有れば実装の方が誤り、という事です)。普段サーバアプリケーションを書いていてreason-phraseのことをいちいち気にすることは無いと思いますが、これは一般的にアプリケーションサーバ側でよしなに処理してくれるからです。いくつか実装を見てみましょう。WEBrickはご存じの通り、Rackというインタフェースを通じて接続されています。Rackのインタフェース上、status-codeしか渡せないので、Sinatraではreason-phraseを設定していませんが、WEBrick側でreason-phraseを設定してくれます。https://github.com/ruby/webrick/blob/43fc65e0619f033d02e8f4a0d647687f20939240/lib/webrick/httpresponse.rb#L125-L128ちなみにRackの中でもreason-phraseが定義されていますが、WEBrickでは独自に定義されています。Servlet)JavaのServlet、例えばJetty実装では、以下のように定義されています。https://github.com/eclipse/jetty.project/blob/6fd3351272ba949dc80d160c18f0e403757a0c0d/jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java#L27-L33Servletにはエラーレスポンスを即時に返すsendErrorというメソッドが有りますが、以下のようにreason-phraseを取得しています。8.5以降でreason-phraseはデフォルトでは送信されなくなっていて、オプションで送信するように変更可能なものの、その設定自体は非推奨となっています。9からはこのオプションすら削除されるそうです。response独自のreason-phraseを設定する冒頭で説明した通り、reason-phraseは規格上は推奨案は有っても厳格な定義はされていません。先ほどのServletのSendErrorメソッドの第二引数に任意の文字列を渡せば独自のreason-phraseを設定することができ、規格上も問題ありません。RackやPSGI(Perl)と言った言語でのインタフェースではstatus-codeしか渡さないので、アプリ側から独自のreason-phraseを定義する方法は無さそうです(serverの実装しだい...でも見たことが無い...)。HTTP/2最近普及してきたHTTP/2では規格自体にreason-phraseが無いそうです。古いServletの規格では2つの引数を取るsetStatusというメソッドが用意されていて、status-codeと独自のreason-phraseを設定し、かつbody部を定義することができました。2.5.1ではこれが使われています(reason-phraseが設定されていない時は、status-codeのみをセットするsetStatusが使われるが、ユーザーコード側からは見えないように隠蔽されている)。2.1以降)では2つの引数を取るsetStatusは非推奨になり、独自のreason-phraseを設定したい場合は、body部無しにただしにエラーを返す(エラー例外を送出し、エラーログに出力される)SendErrorメソッドを使うしか有りません。現在のServletではエラーが発生した時に、body無しで簡潔にエラー内容を伝えたい時(ログに残したい時)に使う思想のようです。先ほどのTomcatのように、そもそもreason-phraseを一切送信しない実装も有るので、必ずクライアント側に送信される保証は無く、あまり使い道は無さそうです。7230)現代では「status-lineのreason-phraseにこだわってはいけないこと」がよく分かりました。Type-Sを買った月別アーカイブはてなブログをはじめよう!magnoliakさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。