LINUX.ORG.RU

transfer-encoding: chunked

 


0

1

Можно ли используя subj получить следующий кейс:

  1. клиент подключается к серверу

  2. клиент получает от сервера данные

  3. соединение удерживается 20 секунд

  4. клиент передает серверу данные

  5. клиент закрывает соединение

Websocket, grpc не предлагать, интересует описанный кейс с помощью простого http.

★★

Ответ на: комментарий от sanwashere

Типа в первый раз делаем post с пустым телом и получаем данные, а второй раз post и инфой? это норм для http в одном соединении?

quester ★★ ()
Последнее исправление: quester (всего исправлений: 1 )
Ответ на: комментарий от quester

Потому 1.1 и выше - там подключение не закрывается по умолчанию после ответа.
А так да, что-то вроде такого:

Запрос 1:

GET /api/fetch HTTP/1.1
Host: www.example.org

Ответ 1:
HTTP/1.1 200 OK
Content-Type: application/x-myproto+json
Content-Length: 20

{ "field": "value" }

Запрос 2:
POST /api/report HTTP/1.1
Host: www.example.org
Content-Type: application/x-myproto+json
Content-Length: 20

{ "field": "value" }

Ответ 2:
HTTP/1.1 200 OK
Content-Length: 0

sanwashere ★★ ()
Последнее исправление: sanwashere (всего исправлений: 2 )
Ответ на: комментарий от theNamelessOne

http/2 работает со стримами, которые можно держать открытыми сколько нужно и гонять по ним данные в обе стороны

EugeneBas ★★ ()
Ответ на: комментарий от quester

Зачем тебе чему-то соответствовать, если обе стороны софта твои? Если же расчёт на то, что какая-то сторона может стать чужой - надо смотреть именно проблемы совместимости с тем что там будет, а не абстрактные спецификации непонятно зачем.

firkax ★★★ ()
Ответ на: комментарий от firkax

у меня условно 99 методов rest/http, а один вот такой странный, соответственно либо его оставлять http либо сбоку вкручивать ws и тд. так что радостно что это в стандарте

quester ★★ ()
Ответ на: комментарий от theNamelessOne

таки да, перечитал изначальный пост, почему-то думал, что вторую посылку данных должен был инициировать сервер

EugeneBas ★★ ()

Можно ли используя subj получить следующий кейс:

chunked не имеет отношение к такой асинхронной модели общения. Ближайшее похожее — это HTTP/1.1 pipelining, когда можно попытаться отправить следующий запрос, не дожидаясь окончания ответа на текущий, но это явно не твой случай.

keep-alive может показаться годным решением (послали первый запрос, получили ответ, ждем 20 секунд, посылаем второй запрос, вычитываем ответ на него), но reverse-proxy между клиентом и сервером легко поломает эту схему.

Единственное, что более-менее похоже и может работать в теории — expect 100-continue. Проблема в том, reverse proxy также может ломать эту штуку. Мне почему-то вспоминается, что когда-то nginx самостоятельно отсылал 100-continue ответ клиенту. Ну и данные, передаваемые сервером, придется запихать в заголовки первого ответа.

kawaii_neko ★★★★ ()

Соединяешься, делаешь GET-запрос, с connection keepalive заголовком. Сервер не разрывает соединение. Через 20 секунд делаешь POST-запрос и закрываешь соединение.

Сервер не обязан уважать заголовок keepalive, также это не обязаны уважать промежуточные прокси, но если ты контролируешь всю инфраструктуру, то работать оно будет именно так.

Chunked тут не при чём. Chunked это когда сторона, посылающая даныне, не знает заранее их длину.

А вообще не очень понятно, зачем тебе заострять внимание на том, что соединение не должно разрываться на эти 20 секунд. Скорей всего ты что-то делаешь не так. Оно может и не будет разрываться, но для твоего кода это не должно иметь значения.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 3 )
Ответ на: комментарий от quester

положим клиент и сервер мои, оба на golang

В этом случае возможно всё описанное и даже просто что угодно не по стандарту.

magnitoferon ()
Ответ на: комментарий от Legioner

Chunked тут не при чём. Chunked это когда сторона, посылающая даныне, не знает заранее их длину.

+1

magnitoferon ()
Ответ на: комментарий от Legioner

А вообще не очень понятно, зачем тебе заострять внимание на том, что соединение не должно разрываться на эти 20 секунд. Скорей всего ты что-то делаешь не так. Оно может и не будет разрываться, но для твоего кода это не должно иметь значения.

Всмысле не так. Чел просто делает свой вебсокет внутри обычного HTTP.

magnitoferon ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.