概要
HTTP通信を行うドキュメントを開発していると、HTTP通信の中身を確認したい時が結構あります。
Faradayなどでは、ログに出力にある程度出力できますが、POST時のボディや:multipart
を使った場合には、送信元からだとなかなか確認できません。
その際にどうワンライナー側で確認するにはどうしたらいいかをまとめて見ました。
基本
ruby -rwebrick -e "WEBrick::HTTPServer.new( DocumentRoot: '.', Port: 80 ).start"
こちらは一般的なワンライナーですね。
これでlocalhost
の80
番ポートにカレントディレクトリが公開されます。
[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
オブジェクトを指定できるキーで、リクエスト前に呼ばれます。
req
とres
はそれぞれ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
ヘッダも出るようになりました。