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 をサポートする Apache で CGI (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>
リンク
- Safari 開発メニューのユーザーエージェントのリストを変更する http://safarirealized.com/archives/51496746.html
- Undocumented Mac OS X:第4回 plist(プロパティリスト)とFoundation【後編】 http://www.itmedia.co.jp/enterprise/articles/0705/30/news011_2.html
- http://www.studyinghttp.net/rfc_ja/rfc2616#Sec14.43 ハイパーテキスト転送プロトコル -- HTTP/1.1 (日本語訳 橋本英彦氏)
- http://httpd.apache.org/docs/2.2/ja/mod/core.html Apache 2.2 ドキュメントコア機能
- KeepAlive, KeepAliveTimeout など