背景
Faradayを使って外部のAPIからデータを取得するスクリプトを書いているけど、HttpStatusによる挙動をテストしたい。外部APIなので、いろんなレスポンスのHttpStatusを自由に変更できないので、自前でテスト用のサーバーを用意したいけど手間を掛けたくない。そんな時にWEBrickで簡単に環境を作れるよ、というお話。
Webrickの起動と使い方
WEBRickサーバーの起動用スクリプトと、ページ用のスクリプトを用意する。
#!/usr/local/bin/ruby
# frozen_string_literal: true
require 'webrick'
opts = {
BindAddress: '0.0.0.0',
Port: '7777',
DocumentRoot: './',
CGIInterpreter: '/usr/local/bin/ruby' # 環境による。DockerのRubyコンテナならこれでいい
}
server = WEBrick::HTTPServer.new(opts)
# /page にアクセスしたら page.rb を cgi で動かす
server.mount('/page', WEBrick::HTTPServlet::CGIHandler, './page.rb')
Signal.trap(:INT){ server.server } # Ctrl+C で止める
server.start # サーバースタート
#!/usr/local/bin/ruby
# frozen_string_literal: true
$SAFE = 1
require 'cgi'
cgi = CGI.new
cgi.out(type: 'text/html',
charset: 'UTF-8',
status: 200) do
# return する文字列がBodyとして出力される
'<html>Hello World</html>'
end
これらを同じディレクトリに設置して webrick.rb
を実行すればよい。
$ ruby webrick.rb
[2020-03-04 02:43:08] INFO WEBrick 1.4.2
[2020-03-04 02:43:08] INFO ruby 2.6.3 (2019-04-16) [x86_64-linux]
[2020-03-04 02:43:08] INFO WEBrick::HTTPServer#start: pid=240 port=7777
これでhttp://localhost:7777/
にアクセス出来る。
CGIでRubyファイルを実行しているのだ
webrick.rb
でWEBRickサーバーの実行を書いている。特に難しい内容はない。server.mount('/page', WEBrick::HTTPServlet::CGIHandler, './page.rb')
としているので、http://localhost:7777/page
に接続すると page.rb
が実行される。
エンドポイントを追加したい場合は同じようにマウントしてやれば良い。
webrick.rb
でCGIInterpreter
を指定しているのでRubyでcgiが実行される。
page.rb
でHTTP Status Code を変える
page.rb
で普通にRubyのコードを書いたら良い。これも難しいことはない。
ハッシュの status: 200
を404にしたり502にすればよい。
もろもろめんどくさいからワンライナーでいいじゃん
$ ruby -rwebrick -e 'Thread.start{s=WEBrick::HTTPServer.new(
DocumentRoot:".", Port:"7777", CGIInterpreter:"/usr/local/bin/ruby");
s.mount("/page", WEBrick::HTTPServlet::CGIHandler, "./page.rb");
s.start}; gets'
http://localhost:7777/page
にアクセス出来る