Предварительная загрузка HTTP2-сервера не отправляет данные cookie

В свете новой поддержки Cloudflare для HTTP2 server push, я пытаюсь предварительно загрузить запрос AJAX, который выполняется в Javascript в конце тела HTML. Тестирование проводится в Chrome Canary. Запрос делается в заголовках, поэтому его можно кэшировать для немедленной загрузки при повторном запросе.

Заголовок:

Link: </request>; rel=preload;

Это успешно запускает этот https://www.example.org/request. Он отправляет на этот URL следующие заголовки запросов:

Принять: * / *

Референт: https://www.example.org/request

User-Agent: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, например Gecko) Chrome / 52.0.2726.0 Safari / 537.36

X-Requested-With: XMLHttpRequest

Проблема в том, что данные cookie не отправляются с запросом предварительной загрузки, а отправляются с существующим Javascript. Я не могу найти никакой информации о том, как это исправить, и даже о том, правильное ли это поведение. Похоже, что в спецификации нет упоминания о файлах cookie, поэтому, по-видимому, он должен обрабатываться как любой другой тип запроса.


person StackOverflowAcc    schedule 06.05.2016    source источник
comment
Есть ли шанс, что вы придумали обходной путь, который можно было бы добавить в качестве ответа?   -  person jayphelps    schedule 20.08.2020


Ответы (1)


Server Push по существу отправляет данные TCP вниз клиенту после всего лишь одного запроса TCP от клиента. Единственная возможность клиенту получить данные от клиента - это первоначальный запрос. Клиенты не могут отправлять запросы на сервер.

Диаграмма HTTP2 сервера

Что касается файлов cookie; вам нужно будет получить их из исходного запроса, когда данные отправляются, сервер не имеет возможности получить дополнительные заголовки. Здесь нам могут помочь серверные события или веб-сокеты.

Как указано в RFC 7540.

A complete header block consists of either:

 a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag
set, or

 a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag cleared
and one or more CONTINUATION frames, where the last CONTINUATION
frame has the END_HEADERS flag set.

Раздел PUSH_PROMISE 4.3 этого RFC подробно описывает, как он может содержать фрагменты блока заголовка.

Позвольте мне сообщить вам следующую цитату:

HTTP 2.0 server push не заменяет такие технологии, как Server-Sent Events (SSE) или WebSocket. Ресурсы, доставляемые через HTTP 2.0 server push, обрабатываются браузером, но не попадают в код приложения - нет JavaScript API для получения уведомлений об этих событиях.

Примеры кода Node.js о том, как вы можете реализовать это в: Инновации с HTTP 2.0 Server Push

person mjsa    schedule 10.05.2016
comment
Спасибо за подробный ответ. Теперь порядок для меня ясен, но почему он предотвращает отправку файла cookie, который был установлен до текущего коллективного запроса? Например, постоянный идентификатор сеанса. Не нужно ничего получать. - person StackOverflowAcc; 12.05.2016