Skip to content

Commit 0c1674d

Browse files
committed
Добавлен пример по работе с https для cohttp_eio
1 parent fb5bd8f commit 0c1674d

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

docs/libraries/concurrency/eio.md

Whitespace-only changes.

docs/libraries/web/cohttp.md

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ let () =
7171
7272
Это актуально не только для библиотек, но и при разработки приложений.
7373
74-
## Eio бекенд
74+
## [Eio](../concurrency/eio.md)-бекенд
7575
7676
::: details Всем новичкам посвящается
7777
@@ -82,25 +82,56 @@ let () =
8282
:::
8383
8484
> [!WARNING] Использовать ли в продакшене?
85-
> Какой-либо документации по использованию Eio-бекенда нету, на GitHub можно найти [много issue](https://github.com/mirage/ocaml-cohttp/issues?q=is%3Aissue+is%3Aopen+eio) связанные с ним. Поэтому использовать только на свой страх и риск, хотя должно быть всё стабильно. Пока что экосистема сырая.
85+
> Вполне стабильно, но какой-либо документации по использованию Eio-бекенда нету. На GitHub [не так много issue](https://github.com/mirage/ocaml-cohttp/issues?q=is%3Aissue+is%3Aopen+eio) связанных с ним. Разбираться со всем придётся самостоятельно, либо просить помощи на [форуме](../../community.md).
8686
8787
Примеры использования можно найти тут: <https://github.com/mirage/ocaml-cohttp/tree/master/cohttp-eio/examples>.
8888
8989
### HTTPS
9090
91+
Для настройки шифрования потребуется дополнительные телодвижение в отличие от стандартаного `unix`-бекенда, где всё работает из коробки.
92+
9193
> [!NOTE] Зависимости
9294
>
93-
> - `tls-eio` (либо билдинги к `eio-ssl`, если вообще возможно)
95+
> - `tls-eio` &mdash; OCaml-реализация TLS
9496
> - `mirage-crypto-rng-eio`
97+
> - `ca-certs` &mdash; для загрузки системного сертификата
9598
96-
Для работы TLS требуется сертификат:
97-
98-
```ocaml
99-
let null_auth ?ip:_ ~host:_ _ =
100-
Ok None (* Warning: use a real authenticator in your code! *)
101-
```
102-
103-
Чтобы загрузить системный используется библиотека [ca-certs](https://github.com/mirage/ca-certs/blob/main/lib/ca_certs.mli).
99+
> [!NOTE] Пример HTTP-клиента
100+
>
101+
> ```ocaml
102+
> open Cohttp_eio
103+
>
104+
> let https =
105+
> (* Загрузка системного (корневого) сертификата. *)
106+
> let authenticator = Ca_certs.authenticator () |> Result.get_ok in
107+
> let tls_config = Tls.Config.client ~authenticator () in
108+
> fun uri raw ->
109+
> let host =
110+
> Uri.host uri
111+
> |> Option.map (fun x -> Domain_name.(host_exn (of_string_exn x)))
112+
> in
113+
> Tls_eio.client_of_flow ?host tls_config raw
114+
>
115+
> let main env =
116+
> let client = Client.make ~https:(Some https) env#net in
117+
> (* Switch управляет ресурсами, поэтому каждый запрос должен использовать новый switch. *)
118+
> Eio.Switch.run @@ fun sw ->
119+
> let resp, body =
120+
> Client.get ~sw client (Uri.of_string "https://example.com")
121+
> in
122+
> (* ... *)
123+
> if Http.Status.compare resp.status `OK = 0 then
124+
> (* Чтение тела из потока. *)
125+
> print_string @@ Eio.Buf_read.(parse_exn take_all) body ~max_size:max_int
126+
> else Fmt.epr "Unexpected HTTP status: %a" Http.Status.pp resp.status
127+
>
128+
> let () =
129+
> Eio_main.run @@ fun env ->
130+
> Mirage_crypto_rng_eio.run (module Mirage_crypto_rng.Fortuna) env @@ fun () ->
131+
> main env
132+
> ```
133+
>
134+
> Если вы планируете обращаться только к _одному_ сервису, то можно убрать парсинг хоста и передавать в `Tls_eio.client_of_flow` просто константу.
104135
105136
## Related
106137

0 commit comments

Comments
 (0)