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値であるかどうかを戻す。