6.50. kink/http/HTTP¶
6.50.1. http型¶
httpは、HTTPクライアントである。
6.50.1.1. Http.send(Req ...[$config={}])¶
sendメソッドは、リクエストを送信して、レスポンスを受け取る。
コンフィグメソッド:
• C.stream_resp
• C.timeout(Timeout_seconds)
• C.follow_redirect
• C.on_success($success): default = VAL.identity
• C.on_error($error): default = {(:Exc) Exc.raise }
タイムアウト
C.timeoutが呼ばれたら、sendの呼び出しは、Timeout_seconds秒後にタイムアウトする。sendがタイムアウトすると、IOエラーになる。
結果
クライアントがIOエラーなしにレスポンスを受け取った場合、sendは、resp値Respを引数として$successを末尾呼び出しする。C.stream_respが呼ばれた場合、 `Resp.content.have_bin?` はfalseであり、またRespは閉じられなければならない。C.stream_respが呼ばれなかった場合、 `Resp.content.have_bin?` はtrueであり、またRespは閉じなくて良い。
IOエラーが起きた場合、sendは、exceptionを引数として$errorを末尾呼び出しする。
リダイレクト
C.follow_redirectが呼ばれた場合、sendは、Fetch APIの `HTTP-redirect fetch` と同じようなやり方でリダイレクトを行う。
https://fetch.spec.whatwg.org/#http-redirect-fetch
事前条件
Reqはreq値でなければならない。
Req.headersは、Content-LengthやExpectのように、ルーティングやメッセージングを制御するヘッダを含んではならない。
Timeout_secondsは正のnum値でなければならない。
$successは、respを取る関数でなければならない。
$errorは、exceptionを取る関数でなければならない。
6.50.2. HTTP.new(...[$config={}])¶
newは、新しいhttp値を戻す。
コンフィグメソッド:
• C.tls_client(Tls_client): default = TLS_CLIENT.new(TRUST_ANCHOR.default)
• C.http_proxy(Http_proxy_uri)
• C.https_proxy(Https_proxy_uri)
• C.no_proxy(No_proxy_host): 複数回呼び出せる。
TLS
結果のhttp値は、HTTPSリクエストを発行するのにTls_clientを使う。
プロキシ
C.http_proxyが呼ばれた場合、HTTPリクエストはHttp_proxy_uriで指定されたURIのプロキシサーバに送られる。
C.https_proxyが呼ばれた場合、HTTPSリクエストはHttps_proxy_uriで指定されたURIのプロキシサーバに送られる。
リクエストのホスト名が、C.no_proxyの呼び出しで指定されたものである場合、プロキシは使われない。ホスト名はstrの同値性で比較される。正規化や名前解決は行われない。
:HTTP.require_from('kink/http/')
:REQ.require_from('kink/http/')
:Http <- HTTP.new{(:C)
C.http_proxy('http://proxy.example.org:8080')
C.no_proxy('127.0.0.1')
C.no_proxy('[::1]')
}
Http.send(REQ.new('GET' 'http://[::1]'))
# => proxy is skipped
Http.send(REQ.new('GET' 'http://[::0:0:1]'))
# => proxy is used, because ip address normalizaion is not performed
Http.send(REQ.new('GET' 'http://localhost'))
# => proxy is used, because name resolution is not performed
事前条件
Tls_clientはtls_client値でなければならない。
Http_proxy_uriは、[RFC 9110 - 4.2.1, 4.2.2]に規定されたURIのstr値でなければならない。ただしその形式は `http://{Host}:{Port}` または `https://{Host}:{Port}` でなければならない。
Https_proxy_uriは、[RFC 9110 - 4.2.1, 4.2.2]に規定されたURIのstr値でなければならない。ただしその形式は `http://{Host}:{Port}` または `https://{Host}:{Port}` でなければならない。
No_proxy_hostはstr値でなければならない。
6.50.3. HTTP.is?(Val)¶
is?は、Valがhttp値であるかどうかを戻す。