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-buffer
や display-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>