[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
rfc.http
- HTTP このモジュールは、RFC2616 "Hypertext Transfer Protocol – HTTP/1.1" で定義されているHTTP/1.1に対する簡単なクライアントAPIを提供します。 (RFC2616).
現在のAPIは、プロトコルの一部のみ実装されています。 GET、HEAD、POSTリクエストのみがサポートされており、 HTTP/1.0のサーバーとはうまく通信できません。 また、HTTP/1.1の先進的機能、例えば永続的接続などはサポートしていません。 これらの機能は、将来のバージョンで追加されるでしょう。
サーバから接続が切られた場合や、サーバの返したHTTPレスポンスのフォーマットが
正しくない場合に投げられるコンディションです。<error>
を継承します。
serverに、それぞれHTTPのGET、HEAD、POSTリクエストを送り、 サーバの応答を返します。
サーバが "3xx" のリダイレクトを指示する応答を返した場合、これらの手続きは デフォルトで、応答のメッセージヘッダの "location" で返されるURIに従うよう 試みます。リダイレクションを抑制するには、下の"キーワード引数"を参照してください。
必須の引数:
server引数では、文字列でHTTPサーバ名を指定します。
サーバ名は、オプションでコロンに続いてポート番号を付加できます。
Examples: "w3c.org"
, "mycompany.com:8080"
.
request-uri引数は、RFC2616で規定されているリクエストURIで、通常これは HTTP URLのパス部分です。
http-post
は、サーバへポストされる文字列、bodyを第3引数として
取ります。ボディは"そのまま"送られるので、呼び出し側は必要なエスケープや
エンコーディングを行う必要があります。
あるURLのコンテンツを取得する最もシンプルなフォームは次のようになるでしょう。
(http-get "practical-scheme.net" "/gauche/index.html") |
プロクシを通してのアクセスは、serverにプロクシ・サーバを指定し、 request-uriに完全なURIを渡すことで行えますが、まだテストされていません。
戻り値: 全ての手続きは3つの値を返します。
1つ目は、RFC2616で定義されているステータスコードの文字列値(例えば、成功時の 200、"Not found"の404など)です。
2つ目は、パーズされたヘッダのリストで、リストの要素は(header-name
value …)
です。header-nameはヘッダの文字列名(例えば、
"content-type"や"location"など)で、valueは対応する値の文字列値です。
ヘッダ名は小文字に変換されます。値は、RFC2822で定義されている無指定行区切
(ソフト・ライン・ブレイク)が除かれる以外はそのままです。
サーバが同じ名前のヘッダを1つ以上返した場合は、
1つのリストに統合されます。それ以外では、2つ目の戻り値に
おけるヘッダのリストの順番は、サーバの応答での順番と同じです。
3つ目の戻り値は、サーバの応答におけるメッセージボディです。
デフォルトでは、文字列で表現されたメッセージボディそのものです。
サーバの応答がボディを持たない場合、3つ目の戻り値は#f
です。
キーワード引数によって、メッセージボディがどのように扱われるかを制御できます。
例えば、中間的な文字列を作らずに、返されたメッセージボディを直接ファイルに
格納することが出来ます。詳細は以下で説明しています。
キーワード引数:
デフォルトで、これらの手続きはリクエストメッセージに"Host"
ヘッダ・フィールドを
追加するだけです。他のヘッダ・フィールドを追加するためにキーワード引数を
与えることができます。
(http-get "foo.bar.com" "/index.html" :accept-language "ja" :user-agent "My Scheme Program/1.0") |
以下のキーワード引数は手続きによって解釈され、リクエストヘッダには現れません。
真の値が与えられた場合、リダイレクションには従わなくなります。すなわち、 手続きは"3xx"のメッセージをそのまま返します。
これらのキーワード引数によりメッセージ・ボディがどのように扱われるかを カスタマイズできます。sinkには出力ポートを、flusherには2引数を 取る手続きを渡さなければなりません。
手続きがメッセージ・ボディを受信し始めると、sinkへ受け取った データ片をフィードします。手続きがメッセージ・ボディを受信し終わると、 flusherに与えられた手続きが、sinkと(手続きからの2つ目の 戻り値と同じフォーマットの)メッセージ・ヘッダ・フィールドのリストとともに 呼び出されます。flusherの戻り値が、手続きからの3つ目の戻り値と なります。
したがって、sinkのデフォルト値は、新しく開かれた文字列ポートで、
flusherのデフォルト値は(lambda (sink headers) (get-output-string sink))
とも言えます。
以下のサンプルは、(とても大きい可能性のある)文字列バッファを作らずに、 メッセージ・ボディを直接ファイルに保存します。
(call-with-output-file "page.html" (lambda (out) (http-get "www.schemers.org" "/" :sink out :flusher (lambda _ #t)))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Shiro Kawai on October, 7 2008 using texi2html 1.78.