Net::HTTPにコンソール出力として喋らせる方法
前回は喋って欲しくない奴を黙らせる方法を書きましたが、今回は喋って欲しいのに喋ってくれないNet::HTTP
を喋らせます。
喋って欲しいのは実際に送ったリクエストやレスポンスの詳細です。
url = URI.parse('http://example.com/') req = Net::HTTP::Get.new(url.path) http = Net::HTTP.new(url.host, url.port) http.set_debug_output(STDOUT) # ポイントはココ # http.use_ssl = true # HTTPS通信ならココを有効化 res = http.start do |http| http.request(req) end
若干冗長気味に書いてますがこの方が分かりやすいかと思います。
これをコンソールで実行すると
opening connection to example.com:80…
opened
<- “GET / HTTP/1.1\r\nAccept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3\r\nAccept: */*\r\nUser-Agent: Ruby\r\nHost: example.com\r\n\r\n”
-> “HTTP/1.1 200 OK\r\n”
-> “Content-Encoding: gzip\r\n”
-> “Accept-Ranges: bytes\r\n”
-> “Cache-Control: max-age=604800\r\n”
-> “Content-Type: text/html; charset=UTF-8\r\n”
-> “Date: Tue, 11 Sep 2018 06:18:57 GMT\r\n”
-> “Etag: \”1541025663+gzip\”\r\n”
-> “Expires: Tue, 18 Sep 2018 06:18:57 GMT\r\n”
-> “Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT\r\n”
-> “Server: ECS (sjc/4FC1)\r\n”
-> “Vary: Accept-Encoding\r\n”
-> “X-Cache: HIT\r\n”
-> “Content-Length: 606\r\n”
-> “\r\n”
reading 606 bytes…
-> “\x1F\x8B\b\x00\x00\x00\x00\x00\x00\xFF\x8DTA\xAF\xD30\f\xBE\xEFW\x98r\x01i]\xF7\x80\aS\xD7V @\xE2\x02\x1C\xE0\xC21k\xDC\xD5Z\x93\x94$\xED6\xA1\xF7\xDFq\xDB\xBD\xAE\xE5\xED@+\xB5\x8E\x1D\x7F\xFEl\xC7I\x9EI\x93\xFBs\x8DPzUe\x8B\xE4\xF1\x87Bf\v\xE0’\xF1\xE4+\xCC>\x9F\x84\xAA+\x84OF\t\xD2I4h\x17\xC3\x16\x85^@^\n\xEB\xD0\xA7A\xE3\x8Bp\x13@\x94M\x8C\xA5\xF7u\x88\xBF\ej\xD3\xE0\xA3\xD1\x1E\xB5\x0F\xBB\xB0\x01\xE4\xC3*\r<\x9E|\xD4\x85\xDF\x8EP\xB7\x90\xB4P\x98\x06-\xE1\xB16\xD6O\xFC\x8F$}\x99Jl)\xC7\xB0_,\x814y\x12U\xE8rQazw\x85r\xFE\xCC\xC9t\f.\x81s\xE7\x82\xC1\xB63\xF2\f\x7Fz\xB1_\x8A\xFC\xB0\xB7\xA6\xD12\xCCMel\f\xCF\x8B5\xBF\xAF\xB6\xE3\x16%\xEC\x9Et\f\xEB\xAB\xAA\x16R\x92\xDE\xCFt\x053\r\v\xA1\xA8:\xC7\x10|\xAFQ\xC3\x0F\xA1]\xB0\x84\xE0\vV-z\xCA\x05|\xC3\x06Y3*\x96\xF0\xC1r\x06Kp\xBC5th\xA9\xB8\”\xF6\xC2C\xFF\x95\xD4NH\xF7\xE9\xC7\xF0v\xBD\xAEOOy\xDE\xA3\x02\xD1xs\x83\xEE\xFD\xCC\xE1V\xEE\xC5$\xFE\xCEX\x896\xB4BR\xE3b\xB8C\xB5\x9DP\x12qE\xFA\xB0\xE4\x7FK\x8E<\xCA\t\xC1G\xB8\xD7\x9B7\x9B\xCD\x04\xB1\xEBE(17Vx2\xCCU\e\x8DS\xD0\xF7\n%\tx\xA1\xC4)\xBCd\xF9\xAE\xCB\xF2\xE5\xB4e\xF3\x0E\xFEO&\x0F\xA34/\xE4\xA4\x98\xF3\x8A\xCD\xFA~\xC3\xF6Oi\xD6s\xEBX\xEF\xB1dW\x12\xC37\x89\xFA#\x9Au\xF2\”\x89\x86y\\$]j<\x9EL\xF2r\x90\xCB\xBB’\xA3\xC9\xAA\xC1Vg?Kr {=\xB0\x84\xCE\x8B]E\xAE\xE4^x\x03;\x84\xC6\xB1X\x18\vTU\x8D\xF3]\xD5[\x04\x1C\x10\x1D\xCF\x0F{\xE7\x8D\xE2\x01s+\xF8e\x1A\xCE\xF9\xDC9\x81g\xE4\xE1\xE0]\xD0\xF5\xD5\xEBH\xBE4\x8D\x87\xDA\x12#\xE7\x86KA\xBA\xEF’\xF0Z\xB8\x03\xA7\xDE\a\xAD\xD1*r\x8E\r\xAB$\xAAG\xD6\t\xDF\x17\x16\x8B4\xE8n\x8D8\x8A\x8E\xC7\xE3\x8A\x84\x16+c\xF7\xD1\x10\xCFE\x97hA\xF6\xD5X\xE4\xF0\x8C\xA7\xFA\x18\xAB\x15\x83\x89\xAC\aL\xA2\xBERIt\xA9[4\\o\x7F\x01\b\x95\xAA\x8B\xF6\x04\x00\x00”
read 606 bytes
Conn keep-alive
こんな感じになります。
どんなヘッダでどんなリクエストを投げて、どんなヘッダのどんなレスポンスが返ってきたのかを見るのに好都合ですね。
余談ですが似たようなことをcurl
でやる場合は-v
オプションを付けてあげると
[yamama@localhost ~]# curl -v http://example.com/
* About to connect() to example.com port 80 (#0)
* Trying 93.184.216.34…
* Connected to example.com (93.184.216.34) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: example.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Cache-Control: max-age=604800
< Content-Type: text/html; charset=UTF-8
< Date: Tue, 11 Sep 2018 06:32:59 GMT
< Etag: “1541025663+gzip+ident”
< Expires: Tue, 18 Sep 2018 06:32:59 GMT
< Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
< Server: ECS (sjc/4E67)
< Vary: Accept-Encoding
< X-Cache: HIT
< Content-Length: 1270
<
<!doctype html>
<html>
<head>
<title>Example Domain</title><meta charset=”utf-8″ />
<meta http-equiv=”Content-type” content=”text/html; charset=utf-8″ />
<meta name=”viewport” content=”width=device-width, initial-scale=1″ />
<style type=”text/css”>
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: “Open Sans”, “Helvetica Neue”, Helvetica, Arial, sans-serif;}
div {
width: 600px;
margin: 5em auto;
padding: 50px;
background-color: #fff;
border-radius: 1em;
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
body {
background-color: #fff;
}
div {
width: auto;
margin: 0 auto;
border-radius: 0;
padding: 1em;
}
}
</style>
</head><body>
<div>
<h1>Example Domain</h1>
<p>This domain is established to be used for illustrative examples in documents. You may use this
domain in examples without prior coordination or asking for permission.</p>
<p><a href=”http://www.iana.org/domains/example”>More information…</a></p>
</div>
</body>
</html>
* Connection #0 to host example.com left intact
こんな感じで表示してくれます。
ただNet::HTTP
では付いていたAccept-Encoding
ヘッダがないからか、レスポンスボディが生データですね。
じゃ、ちょっと付けてみましょう。
[yamama@localhost ~]# curl -v -H “Accept-Encoding: gzip” http://example.com/
* About to connect() to example.com port 80 (#0)
* Trying 93.184.216.34…
* Connected to example.com (93.184.216.34) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: example.com
> Accept: */*
> Accept-Encoding: gzip
>
< HTTP/1.1 200 OK
< Content-Encoding: gzip
< Accept-Ranges: bytes
< Cache-Control: max-age=604800
< Content-Type: text/html; charset=UTF-8
< Date: Tue, 11 Sep 2018 06:36:54 GMT
< Etag: “1541025663+gzip”
< Expires: Tue, 18 Sep 2018 06:36:54 GMT
< Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
< Server: ECS (sjc/4E38)
< Vary: Accept-Encoding
< X-Cache: HIT
< Content-Length: 606
<
8TA��0�ri]V @1k��Z��$��+���l�I�I�Ue���Bf
>���+�OF �I4hÅ^@^
<�|ԅߎP���P�-�6�Ol)ǰ_,�4yUazw�r���t.�s���3_��Melϋ5����t뫪R���t3
��:�|�Qá]��
z�|�Y3*�p�5th��”��NHv��OOyޣ�xs��$��X�6�BRC��PqE�< ��G�כ7�ͱ17Vx2�U��
* Connection #0 to host example.com left intact
% x��)�d�e�4/䤘~��Oi�s�dW�7�”��y\$]j<�L�’�ɪ�Vg?Kr {=��]E�;�ƱX
�$�G ���48������+c�hA����L��RIt�[4\���ma@localhost ~]# TU��{��s+9�g]����H�4���#�KA�Z��ޭ�*r�
あばばばばっばばっばばばばば。
gzip圧縮されたレスポンスボディがそのままバイナリで出力されて大変なことになりました。
でもどうやら中身は同じようです。
今回はNet::HTTP
と同じ結果を返すヘッダをcurl
のコマンドで探した形ですが、curl
では上手く動くのにNet::HTTP
では上手く動かないなんて時にはそれぞれのヘッダに差異がないかを調査します。
そんな時にNet::HTTP
での処理内容をコンソールにトレース表示する方法を知っておくと役立つかもしれません。
カバー写真はフリー写真素材ぱくたそから段田隼人さん。
マンガとアニメとゲームから錬成された宇宙大好きエンジニア。 軌道エレベーターで行ける静止軌道上のコロニーに住まいを移し、ゲームやってマンガ読んでアニメ見て爆睡、ゲームやってマンガ読んでアニメ見て爆睡、という生活を夢見ながら今日もコードを書き続けるのだった。
TAG
- Android
- AWS
- Bitrise
- CodePipeline
- Firebase
- HTML
- iOS
- IoT
- JavaScript
- KPI
- Linux
- Mac
- Memcached
- MGRe
- MGReのゆるガチエンジニアブログ
- MySQL
- PHP
- PICK UP
- PR
- Python
- Ruby
- Ruby on Rails
- SEO
- Swift
- TIPS
- UI/UX
- VirtualBox
- Wantedly
- Windows
- アクセス解析
- イベントレポート
- エンジニアブログ
- ガジェット
- カスタマーサクセス
- サーバ技術
- サービス
- セキュリティ
- セミナー・展示会
- テクノロジー
- デザイン
- プレスリリース
- マーケティング施策
- マネジメント
- ラボ
- リーンスタートアップ
- 企画
- 会社紹介
- 会社紹介資料
- 勉強会
- 実績紹介
- 拡張性
- 採用
- 日常
- 書籍紹介
- 歓迎会
- 社内イベント
- 社員インタビュー
- 社長ブログ
- 視察
- 開発環境