[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.19 rfc.http - HTTP

Module: rfc.http

このモジュールは、RFC2616 "Hypertext Transfer Protocol – HTTP/1.1" で定義されているHTTP/1.1に対する簡単なクライアントAPIを提供します。 (RFC2616).

現在のAPIは、プロトコルの一部のみ実装されています。 GET、HEAD、POSTリクエストのみがサポートされており、 HTTP/1.0のサーバーとはうまく通信できません。 また、HTTP/1.1の先進的機能、例えば永続的接続などはサポートしていません。 これらの機能は、将来のバージョンで追加されるでしょう。

Condition: <http-error>

サーバから接続が切られた場合や、サーバの返したHTTPレスポンスのフォーマットが 正しくない場合に投げられるコンディションです。<error>を継承します。

Function: http-get server request-uri &keyword sink flusher no-redirect …
Function: http-head server request-uri &keyword no-redirect …
Function: http-post server request-uri body &keyword sink flusher no-redirect …

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")

以下のキーワード引数は手続きによって解釈され、リクエストヘッダには現れません。

no-redirect

真の値が与えられた場合、リダイレクションには従わなくなります。すなわち、 手続きは"3xx"のメッセージをそのまま返します。

sink, flusher

これらのキーワード引数によりメッセージ・ボディがどのように扱われるかを カスタマイズできます。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.