4

私は単純な Sinatra アプリを作成しています。ユーザーが特定のデータを含むリクエストを投稿した場合、メッセージ CLIENT_ERROR などでエラー '453' (カスタム エラー コード) を返したいと考えています。

問題は、Sinatra のドキュメントを調べていくつかのテストを行ったところ、応答エラー メッセージを設定する方法が見つからず、応答ステータスだけでした。

したがって、シナトラ応答を設定した場合

get '/' do
   response.status = 453
end

私はエラーコードを正しく取得します:

curl -v localhost:4567

* About to connect() to localhost port 4567 (#0)
*   Trying 127.0.0.1... connected
> GET / HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4     libidn/1.23 librtmp/2.3
> Host: localhost:4567
> Accept: */*
> 
< HTTP/1.1 453 
< X-Frame-Options: sameorigin
< X-XSS-Protection: 1; mode=block
< Content-Type: text/html;charset=utf-8
< Content-Length: 0
< Connection: keep-alive
< Server: thin 1.3.1 codename Triple Espresso
< 
* Connection #0 to host localhost left intact
* Closing connection #0

しかし、私がしたいのは:

< HTTP/1.1 453 CLIENT_ERROR

私が持っているのと同じ方法

< HTTP/1.1 200 OK

すべてが計画通りに進むとき。

Sinatra/Rack を使用してこれを行う方法はありますか?

4

2 に答える 2

4

ステータスメッセージは、使用しているサーバーによって生成されます。たとえば、Thinでは、メッセージはで生成され、Thin::HTTP_STATUS_CODES応答行はで生成されます。WEBrickThin::Responseでは、メッセージはで生成されWEBrick::HHTPStatus::StatusMessage、応答はで生成されWEBrick::HTTPResponseます。

使用しているサーバーがわかっている場合は、エラーを適切なハッシュに追加できます。

シンの場合:

require 'thin'
Thin::HTTP_STATUS_CODES[453] = "Client Error"

および出力:

$ curl -v localhost:4567
* About to connect() to localhost port 4567 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 4567 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
> Host: localhost:4567
> Accept: */*
> 
< HTTP/1.1 453 Client Error
< X-Frame-Options: sameorigin
< X-XSS-Protection: 1; mode=block
< Content-Type: text/html;charset=utf-8
< Content-Length: 0
< Connection: keep-alive
< Server: thin 1.4.1 codename Chromeo
< 
* Connection #0 to host localhost left intact
* Closing connection #0

とWEBrickで:

require 'webrick'
WEBrick::HTTPStatus::StatusMessage[453] = "Client Error"

これは出力を与えます:

$ curl -v localhost:4567
* About to connect() to localhost port 4567 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 4567 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
> Host: localhost:4567
> Accept: */*
> 
localhost - - [13/Aug/2012:01:41:48 BST] "GET / HTTP/1.1" 453 0
- -> /
< HTTP/1.1 453 Client Error 
< X-Frame-Options: sameorigin
< X-Xss-Protection: 1; mode=block
< Content-Type: text/html;charset=utf-8
< Content-Length: 0
< Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
< Date: Mon, 13 Aug 2012 00:41:48 GMT
< Connection: Keep-Alive
< 
* Connection #0 to host localhost left intact
* Closing connection #0
于 2012-08-13T00:56:33.317 に答える
4

カスタム HTTP ステータス コードは使用しないことをお勧めします。一般的に使用できるものがあると思われる場合は、インターネット ドラフトを作成し、IETF 仕様プロセスを検討してください。

于 2012-08-13T08:03:09.577 に答える