任意のHTTPステータスコードを任意の時間で返す

ロードバランサーなどの実験をしていると、バックエンドのweb/appサーバーから任意の時間で任意のステータスコードを返したくなることがあります。Apcheの挙動との一致を気にしたりしないという前提で、Sinatraで書くと非常にシンプルです。

プログラム

#web_test.rb
require 'sinatra'
get '/:code/:timeout' do
  status params[:code]
  sleep params[:timeout].to_f
  body "Status #{params[:code]}\n Timeout #{params[:timeout]}"
end

設置〜実行方法

Amazon Linux (Redhat Enterprise Linux, CentOS互換)の場合です。

#yum install rubygems
#gem install sinatra
#vim webtest.rb
#ruby -rubygems web_test.rb
[2012-04-25 06:08:02] INFO  WEBrick 1.3.1
[2012-04-25 06:08:02] INFO  ruby 1.8.7 (2011-12-28) [x86_64-linux]
== Sinatra/1.3.2 has taken the stage on 4567 for development with backup from WEBrick
[2012-04-25 06:08:02] INFO  WEBrick::HTTPServer#start: pid=1906 port=4567

デフォルトではポート番号4567が使用されるので、80番などを使いたい場合は、

#ruby -rubygems web_test.rb -p 80

などとしてください。

使用例

5秒後に400 Bad Requestを返す。
$ time wget localhost:4567/400/5
--2012-04-25 05:53:28--  http://localhost:4567/400/5
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:4567... connected.
HTTP request sent, awaiting response... 400 Bad Request
2012-04-25 05:53:33 ERROR 400: Bad Request.

real	0m5.011s
user	0m0.002s
sys	0m0.005s
1.35秒後に500 Internal Server Errorを返す。
$ time wget localhost:4567/500/1.35 
--2012-04-25 06:05:29--  http://localhost:4567/500/1.35
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:4567... connected.
HTTP request sent, awaiting response... 500 Internal Server Error
2012-04-25 06:05:30 ERROR 500: Internal Server Error.

real	0m1.361s
user	0m0.003s
sys	0m0.003s

小数点2桁目ぐらいからは怪しいですが、数秒の精度であれば任意のステータスコードを任意の時間が経過した時刻で返すことができます。

これぞ3分クッキング・・・。