Describe checked datagram startup and bounded TCP HUP handling

This commit is contained in:
evgeny committed 2026-10-24 13:54:40 +02:00
1 parent e2ee5f2397
commit f10a6f70c5
2 files changed
+41 -14

No files matched your search

+7
View File
@@ -44,11 +44,15 @@ socks_proxy_conn_free_all(&conns, &conn_count); // все соединения
`inst/ua/conns/count/next_stream_id` заимствуются и должны жить до закрытия listener и всех клиентов.
Закрытие listener сохраняет активных клиентов. Вызовы и callbacks выполняются в uasync владельца.
Адрес listener — IPv4:port; порт 0 выбирает ОС, фактический порт возвращает `socks_proxy_get_port()`.
При создании через `tcp_proxy_client_create` каждый включённый listener обязателен:
пустой/неверный адрес или ошибка bind/listen откатывают создание всего клиента.
### Ключевые нюансы
- **Backpressure:** DATA ждёт CONNECTED и кредита `proxy_flow`. Неотправленные байты сохраняются
в `tx_buf/tx_len` и отправляются порциями до 4096. При доступном окне ставится router send-ready
waiter; safety-net 500 мс возобновляет отправку с обычным force=0. Чтение tcp_io ограничено его очередью.
HUP сохраняет high/low-water и ручную остановку чтения; временно снятая регистрация fd
восстанавливается после освобождения очереди. Запись не зависит от паузы чтения.
- **Несколько соединений:** управляются через связный список `struct socks_proxy_conn*` + счётчик. В HTTP keep-alive каждое сообщение получает новый upstream stream; клиентский TCP-сокет сохраняется. Pipelining обрабатывается последовательно, включая запросы к разным адресатам.
- **stream_id** генерируется монотонно (`++next_stream_id`), передаётся в заголовке ETCP-пакетов для мультиплексирования.
@@ -172,3 +176,6 @@ SOCKS greeting принимает только предложенный мето
Нормативные размеры сообщений и порядок байтов — в [proxy_protocol.md](../../doc/proxy_protocol.md).
Контракты чистого HTTP codec (обнуление состояния, emit/source_len, used и EOF) — в [http_proxy.h](http_proxy.h).
`test_socks_http_proxy` проверяет 16 byte-exact загрузок и двусторонний TLS shutdown.
`UTUN_TEST_TLS_ABRUPT=1` отдельно воспроизводит обрыв TLS: реальные EPIPE/ENOTCONN
остаются ошибками TCP и диагностируются, уже доставленные ответы сохраняются.