Ruby
HTTP
WEBRick

【備忘録】RubyのWEBrickのワンライナーの便利利用法

More than 1 year has passed since last update.

概要

HTTP通信を行うドキュメントを開発していると、HTTP通信の中身を確認したい時が結構あります。

Faradayなどでは、ログに出力にある程度出力できますが、POST時のボディや:multipartを使った場合には、送信元からだとなかなか確認できません。

その際にどうワンライナー側で確認するにはどうしたらいいかをまとめて見ました。

基本

ruby -rwebrick -e "WEBrick::HTTPServer.new( DocumentRoot: '.', Port: 80 ).start"

こちらは一般的なワンライナーですね。

これでlocalhost80番ポートにカレントディレクトリが公開されます。

実行結果
[2016-07-22 18:57:17] INFO  WEBrick 1.3.1
[2016-07-22 18:57:17] INFO  ruby 2.2.4 (2015-12-16) [x64-mingw32]
[2016-07-22 18:57:17] INFO  WEBrick::HTTPServer#start: pid=12112 port=80
xxxxxxxxxx - - [22/Jul/2016:18:57:21 東京 (標準時)] "GET /e.txt HTTP/1.1" 200 1
- -> /e.txt

当然、ボディもヘッダも出ません。

ボディのみをそのまま出力する

ruby -rwebrick -e "WEBrick::HTTPServer.new( RequestCallback: Proc.new{|req,res| puts req.body }, DocumentRoot: '.', Port: 80).start"

RequestCallback:はリクエストがあった際に呼ばれるProcオブジェクトを指定できるキーで、リクエスト前に呼ばれます。

reqresはそれぞれWEBrick::HTTPRequestのインスタンスとWEBrick::HTTPResponseのインスタンスが設定されますが、リクエスト直後に呼び出されるので、レスポンス側にデータはありません。

実行結果
[2016-07-22 18:42:24] INFO  WEBrick 1.3.1
[2016-07-22 18:42:24] INFO  ruby 2.2.4 (2015-12-16) [x64-mingw32]
[2016-07-22 18:42:24] INFO  WEBrick::HTTPServer#start: pid=3736 port=80
-------------RubyMultipartPost
Content-Disposition: form-data; name="test"; filename="local.path"
Content-Length: 9
Content-Type: text/plain
Content-Transfer-Encoding: binary

meta_data
-------------RubyMultipartPost
Content-Disposition: form-data; name="test2"; filename="local.path"
Content-Length: 10
Content-Type: text/plain
Content-Transfer-Encoding: binary

meta_data2
-------------RubyMultipartPost--

xxxxxxxxxx - - [22/Jul/2016:18:42:24 東京 (標準時)] "GET /e.txt HTTP/1.1" 200 1
- -> /e.txt

ボディを出すことが出来ました。

全部だす

ruby -rwebrick -e "WEBrick::HTTPServer.new( DocumentRoot: '.',RequestCallback: Proc.new{|req,res| puts req.raw_header; puts ''; puts req.body }).start"

ヘッダも含めて全部HTTPっぽく出すにはヘッダとボディをそれぞれ出す必要があります。

そのためのメソッドがWEBrick::HTTPRequestクラスにはraw_headerという名前でありますので、これを利用して出力しています。

実行結果
[2016-07-22 18:48:13] INFO  WEBrick 1.3.1
[2016-07-22 18:48:13] INFO  ruby 2.2.4 (2015-12-16) [x64-mingw32]
[2016-07-22 18:48:14] INFO  WEBrick::HTTPServer#start: pid=3344 port=80
User-Agent: Faraday v0.9.2
Content-Type: multipart/form-data; boundary=-----------RubyMultipartPost
Content-Length: 425
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
Connection: close
Host: localhost

-------------RubyMultipartPost
Content-Disposition: form-data; name="test"; filename="local.path"
Content-Length: 9
Content-Type: text/plain
Content-Transfer-Encoding: binary

meta_data
-------------RubyMultipartPost
Content-Disposition: form-data; name="test2"; filename="local.path"
Content-Length: 10
Content-Type: text/plain
Content-Transfer-Encoding: binary

meta_data2
-------------RubyMultipartPost--

xxxxxxxxxx - - [22/Jul/2016:18:48:14 東京 (標準時)] "GET /e.txt HTTP/1.1" 200 1
- -> /e.txt

ヘッダも出るようになりました。