LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

前回は喋って欲しくない奴を黙らせる方法を書きましたが、今回は喋って欲しいのに喋ってくれない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

若干冗長気味に書いてますがこの方が分かりやすいかと思います。
これをコンソールで実行すると

<blockquote>
opening connection to example.com:80...
opened
&lt;- "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"
-&gt; "HTTP/1.1 200 OK\r\n"
-&gt; "Content-Encoding: gzip\r\n"
-&gt; "Accept-Ranges: bytes\r\n"
-&gt; "Cache-Control: max-age=604800\r\n"
-&gt; "Content-Type: text/html; charset=UTF-8\r\n"
-&gt; "Date: Tue, 11 Sep 2018 06:18:57 GMT\r\n"
-&gt; "Etag: \"1541025663+gzip\"\r\n"
-&gt; "Expires: Tue, 18 Sep 2018 06:18:57 GMT\r\n"
-&gt; "Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT\r\n"
-&gt; "Server: ECS (sjc/4FC1)\r\n"
-&gt; "Vary: Accept-Encoding\r\n"
-&gt; "X-Cache: HIT\r\n"
-&gt; "Content-Length: 606\r\n"
-&gt; "\r\n"
reading 606 bytes...
-&gt; "\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&gt;\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&lt;\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&lt;\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&lt;\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
</blockquote>

こんな感じになります。
どんなヘッダでどんなリクエストを投げて、どんなヘッダのどんなレスポンスが返ってきたのかを見るのに好都合ですね。

余談ですが似たようなことをcurlでやる場合は-vオプションを付けてあげると


<blockquote>
[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: */*
> 
&lt; HTTP/1.1 200 OK
&lt; Cache-Control: max-age=604800
&lt; Content-Type: text/html; charset=UTF-8
&lt; Date: Tue, 11 Sep 2018 06:32:59 GMT
&lt; Etag: "1541025663+gzip+ident"
&lt; Expires: Tue, 18 Sep 2018 06:32:59 GMT
&lt; Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
&lt; Server: ECS (sjc/4E67)
&lt; Vary: Accept-Encoding
&lt; X-Cache: HIT
&lt; Content-Length: 1270
&lt; 
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;Example Domain&lt;/title&gt;

    &lt;meta charset="utf-8" /&gt;
    &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8" /&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1" /&gt;
    &lt;style type="text/css"&gt;
    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;
        }
    }
    &lt;/style&gt;    
&lt;/head&gt;

&lt;body&gt;
&lt;div&gt;
    &lt;h1&gt;Example Domain&lt;/h1&gt;
    &lt;p&gt;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.&lt;/p&gt;
    &lt;p&gt;&lt;a href="http://www.iana.org/domains/example"&gt;More information...&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
* Connection #0 to host example.com left intact
</blockquote>

こんな感じで表示してくれます。

ただNet::HTTPでは付いていたAccept-Encodingヘッダがないからか、レスポンスボディが生データですね。
じゃ、ちょっと付けてみましょう。


<blockquote>
[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
> 
&lt; HTTP/1.1 200 OK
&lt; Content-Encoding: gzip
&lt; Accept-Ranges: bytes
&lt; Cache-Control: max-age=604800
&lt; Content-Type: text/html; charset=UTF-8
&lt; Date: Tue, 11 Sep 2018 06:36:54 GMT
&lt; Etag: "1541025663+gzip"
&lt; Expires: Tue, 18 Sep 2018 06:36:54 GMT
&lt; Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
&lt; Server: ECS (sjc/4E38)
&lt; Vary: Accept-Encoding
&lt; X-Cache: HIT
&lt; Content-Length: 606
&lt; 
 8TA��0�ri]V @1k��Z��$��+���l�I�I�Ue���Bf
                                                           &gt;���+�OF �I4hÅ^@^
&lt;�|ԅߎ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�&lt; ��G�כ7�ͱ17Vx2�U��
* Connection #0 to host example.com left intact
%       x��)�d�e�4/䤘~��Oi�s�dW�7�"��y\$]j&lt;�L�'�ɪ�Vg?Kr {=��΋]E�;�ƱX
�$�G  ���48������+c�hA����L��RIt�[4\���ma@localhost ~]#             TU��{��s+9�g]����H�4���#�KA�Z��ޭ�*r�
</blockquote>

あばばばばっばばっばばばばば。
gzip圧縮されたレスポンスボディがそのままバイナリで出力されて大変なことになりました。
でもどうやら中身は同じようです。

今回はNet::HTTPと同じ結果を返すヘッダをcurlのコマンドで探した形ですが、curlでは上手く動くのにNet::HTTPでは上手く動かないなんて時にはそれぞれのヘッダに差異がないかを調査します。
そんな時にNet::HTTPでの処理内容をコンソールにトレース表示する方法を知っておくと役立つかもしれません。

0
0
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
0
0