РЕЗЮМЕ: Safari сообщает 304 ответа, хотя он получает 200 на запросы XHR
Здравствуйте. У меня странная ситуация с Safari, и я уже в конце пути, пытаясь исследовать его самостоятельно, надеюсь, кто-то здесь сталкивался с этим в прошлом.
В настоящее время я начал использовать свое приложение (толстый клиент Sencha Touch, взаимодействующий с RESTful API, обслуживаемым NodeJS) в Safari и заметил, что браузер иногда (на самом деле: примерно 5 раз из 6) неправильно обрабатывает ответы сервера, и сообщать о них (в сетевой консоли инструментов разработчика) как 304 ответа без содержимого вместо 200 ответов с содержимым JSON, которые фактически доставляются. (И приложение ведет себя соответственно - ответы без содержания 304 заставляют приложение предполагать, что у него нет данных, и оно отвечает таким образом, так что это не просто косметическая проблема на панели разработчика.)
Заголовки даже не верны - вот непересекающийся набор заголовков Response, сообщенных Safari для двух случаев (я подтвердил, что содержимое request и заголовки идентичны для двух):
200
- Access-Control-Allow-Credentials: правда
- Access-Control-Allow-Headers: *
- Access-Control-Allow-метода: GET, POST, UPDATE, DELETE, OPTIONS
- Access-Control-Allow-Origin: не определено
- Content-Type: применение / JSON; кодировка = UTF-8
304
- Content-Type: текст / JavaScript
- Дата последнего изменения: вс, 20 ноября 2011 г. 22:30:45 GMT
- Сервер: lightnode
- Transfer-Encoding: Идентичность
(я опустил заголовки ответа, которые идентичны между ними.)
Несколько других заметок
- Я проверил, что ответы, отправленные сервером, идентичны на каждый запрос, и tcpdump'ed трафик, и подтвердил, что сервер отправляет 200 кодов ответов (и заголовков), которые затем сообщаются и обрабатываются Safari. поскольку 304 ответа не содержат содержимого (и с поддельными заголовками выше.) Safari сообщает об ответе, который никогда не отправлялся.
- Вышеприведенные заголовки 304 выглядят аналогично тому, что может быть отправлено вместе со статическим содержимым в этом приложении, но я подтвердил, что оба ответа обслуживаются одним и тем же путем кода (сервер API, т. Е. Не задействован «легкий узел», эти заголовки создаются Safari.)
- Я никогда не вижу такого поведения в Chrome
- Я подтвердил ту же ошибку поведения приложения в Mobile Safari (для которого построен Sencha Touch, наряду со всеми другими браузерами WebKit, такими как Safari и Chrome), но не смог подтвердить фиктивная обработка ответов, поскольку iOS на самом деле не предоставляет эту низкоуровневую отладочную информацию.
- Здесь нет проблем с XSS / CORS, API и статический контент обслуживаются из одного домена.
- Да, я сделал все обычные операции инициализации cookie / cache / restart / etc, безрезультатно.
Версия
- Safari: 5.1.1
- OSX: 10.7.2