« ^ »

url-retrieve-synchronicallyのデバッグについて

所要時間: 約 2分

url-retrieve-synchronicallyはURLで指定されたリソースにアクセスするための関数。 この関数はいろいろと使いにくいところがあるのでデバッグの方法をちょっとだけ書いておく。

(require 'url)

通常のアクセス

第一引数にURLの文字列を指定すると、そのURLにアクセスする。

(url-retrieve-synchronously "https://example.com/")
#<buffer  *http example.com:443*>

戻り値はバッファが返ってくる。

リクエストの詳細を確認する

どのようなデータが送られたのかなどを確認するにはurl-debugにtを設定する。

(setq url-debug t)

この値を設定してurl-retrieve-synchronouslyを実行すると *URL-DEBUG* というバッファが作成されてログが出力される。

(url-retrieve-synchronously "https://example.com/")

出力はこのようになる。

xhttp -> Contacting host: example.com:443
http -> Marking connection as busy: example.com:443 #<process example.com>
http -> Request is: 
GET / HTTP/1.1
MIME-Version: 1.0
Connection: keep-alive
Extension: Security/Digest Security/SSL
Host: example.com
Accept-encoding: gzip
Accept: */*
User-Agent: URL/Emacs Emacs/26.1 (OpenStep; x86_64-apple-darwin17.5.0)


retrieval -> Spinning in url-retrieve-synchronously: nil (#<buffer  *http example.com:443*-253616>)
http -> url-http-end-of-document-sentinel in buffer ( *http example.com:443*-253616)
http -> Contacting host: example.com:443
http -> Marking connection as busy: example.com:443 #<process example.com>
http -> Request is: 
GET / HTTP/1.1
MIME-Version: 1.0
Connection: keep-alive
Extension: Security/Digest Security/SSL
Host: example.com
Accept-encoding: gzip
Accept: */*
User-Agent: URL/Emacs Emacs/26.1 (OpenStep; x86_64-apple-darwin17.5.0)


retrieval -> Spinning in url-retrieve-synchronously: nil (#<buffer  *http example.com:443*-253616>)
http -> url-http-end-of-document-sentinel in buffer ( *http example.com:443*-253616)
http -> Marking connection as free: example.com:443 #<process example.com>
http -> Activating callback in buffer ( *http example.com:443*-253616): #[128 "\302\303\304p#\210\300\305\240\210\301p\240\207" [(nil) (#<buffer  *http example.com:443*-253616>) url-debug retrieval "Synchronous fetching done (%S)" t] 5 "

(fn &rest IGNORED)"] (nil)
retrieval -> Synchronous fetching done (#<buffer  *http example.com:443*-253616>)

HTTPリクエストヘッダなどが確認できる。

BODYを確認する

url-retrieve-synchronously はバッファを返すので 返されたバッファに switch-to-bufferdisplay-buffer などでバッファを切り替えれば良い。

(switch-to-buffer (url-retrieve-synchronously "https://example.com/"))
#<buffer  *http example.com:443*-114057>

バッファの中身はこんな感じ。

HTTP/1.1 200 OK
Content-Encoding: gzip
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 14 May 2019 12:45:54 GMT
Etag: "1541025663+ident+gzip"
Expires: Tue, 21 May 2019 12:45:54 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (sec/976A)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 606

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