Drakma メモ(3)

ユーザエージェント

Web ブラウザの Safari は、開発者向けのメニューがついていて、ユーザエージェントを変更できる。変更できるユーザエージェントの一覧は XML で定義されている。Drakma の場合は、関数 http-request にユーザエージェントのためのキーワード引数が指定できるようになっていて、さらに関数 user-agent-string が文字列を作っていた。drakma 自身、firefox, explorer, opera, safari の他、文字列を与えればそのまま使われる。
調べてみたところユーザエージェントは本当は任意の文字列、ではないので、Drakma の名乗るユーザエージェントはあまりよくないかもしれない(リンク ユーザエージェントの識別情報 参照)。

持続的接続

Drakma の場合 :keep-alive t :close nil を指定して、ストリームを使い回すことができる。

  • drakma のサイトに例がある。 "now we are going to re-use a socket for the second connection to the same server this will also work with chunked encoding" と書いているあたり
  • HTTP 1.1 をサポートする ApacheCGI (today.cgi)を作成した(Hunchentoot を使うと混乱しそうなのでまずは Apache とした)。 内容はなんでもよいがリクエスト毎に結果が変わる何か、が欲しかっただけ。
  • ここで「チャンク形式エンコーディング」というものの理解が必要になる。
    • drakma では CHUNGA ( Portable chunked streams for Common Lisp) というものが使われている(Drakma と同じく Dr. Edi Weitz による)。
    • todo

todo

REST-TEST> (let ((uri (format nil "http://127.0.0.1:8080/today.cgi")))
             (http-request uri
                           :want-stream t
                           :external-format-out :utf-8
                           :keep-alive t
                           :close nil))
#<FLEXI-STREAMS:FLEXI-IO-STREAM {100523E911}>
200
((:DATE . "Sat, 10 Sep 2011 23:33:05 GMT") (:SERVER . "Apache/2.2.3 (CentOS)")
 (:KEEP-ALIVE . "timeout=600, max=100") (:CONNECTION . "Keep-Alive")
 (:TRANSFER-ENCODING . "chunked") (:CONTENT-TYPE . "text/html; charset=utf-8"))
#<PURI:URI http://127.0.0.1:8080/today.cgi>
#<FLEXI-STREAMS:FLEXI-IO-STREAM {100523E911}>
NIL
"OK"
REST-TEST> (setq *my-stream* *)
#<FLEXI-STREAMS:FLEXI-IO-STREAM {100523E911}>
REST-TEST> (drakma::read-body *my-stream* '((:DATE . "Sat, 10 Sep 2011 23:33:05 GMT") (:SERVER . "Apache/2.2.3 (CentOS)")
 (:KEEP-ALIVE . "timeout=600, max=100") (:CONNECTION . "Keep-Alive")
 (:TRANSFER-ENCODING . "chunked") (:CONTENT-TYPE . "text/html; charset=utf-8")) nil t)
"<!DOCTYPE html
	PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
	 \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"ja-JP\" xml:lang=\"ja-JP\">
<head>
<title>hello world</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
</head>
<body>
<h1>2011年9月11日(日) 8時33分5秒
</h1>
</body>
</html>"
NIL
REST-TEST> (let ((uri (format nil "http://127.0.0.1:8080/today.cgi")))
             (http-request uri
                           :want-stream t
                           :external-format-out :utf-8
                           :keep-alive t
                           :stream *my-stream*
                           :close nil))
#<FLEXI-STREAMS:FLEXI-IO-STREAM {100523E911}>
200
((:DATE . "Sat, 10 Sep 2011 23:33:59 GMT") (:SERVER . "Apache/2.2.3 (CentOS)")
 (:KEEP-ALIVE . "timeout=600, max=99") (:CONNECTION . "Keep-Alive")
 (:TRANSFER-ENCODING . "chunked") (:CONTENT-TYPE . "text/html; charset=utf-8"))
#<PURI:URI http://127.0.0.1:8080/today.cgi>
#<FLEXI-STREAMS:FLEXI-IO-STREAM {100523E911}>
NIL
"OK"
REST-TEST> (drakma::read-body *my-stream* '((:DATE . "Sat, 10 Sep 2011 23:33:59 GMT") (:SERVER . "Apache/2.2.3 (CentOS)")
 (:KEEP-ALIVE . "timeout=600, max=99") (:CONNECTION . "Keep-Alive")
 (:TRANSFER-ENCODING . "chunked") (:CONTENT-TYPE . "text/html; charset=utf-8")) nil t)
"<!DOCTYPE html
	PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
	 \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"ja-JP\" xml:lang=\"ja-JP\">
<head>
<title>hello world</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
</head>
<body>
<h1>2011年9月11日(日) 8時33分59秒
</h1>
</body>
</html>"
NIL
REST-TEST> 

リンク