2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-22

概要

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

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?