Net::HTTPにコンソール出力として喋らせる方法
PICK UP POST

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

  • このエントリーをはてなブックマークに追加
やまま
スペシャリスト やまま yamama

マンガとアニメとゲームから錬成された宇宙大好きエンジニア。 軌道エレベーターで行ける静止軌道上のコロニーに住まいを移し、ゲームやってマンガ読んでアニメ見て爆睡、ゲームやってマンガ読んでアニメ見て爆睡、という生活を夢見ながら今日もコードを書き続けるのだった。