У SockJS проблемы с IE9

Я видел отчет об аналогичной ошибке здесь: https://groups.google.com/forum/?fromgroups=#!topic/sockjs/QNtA1_p_arU, но моя проблема выглядит иначе.

Моя настройка: клиенты подключаются к https://www.mysite.com/sockjs для SockJS, а фактическая страница обслуживается по адресу https://www.mysite.com/blah/blah/blah. Все внешние элементы на странице (например, css и js) обслуживаются с помощью https, включая SockJS-Client (https://d1fxtkz8shb9d2.cloudfront.net/sockjs-0.3.js, который должен быть 0.3. 4 для последней версии). Бэкэнд сделан на SockJS-Tornado.

Проблема 1. Я указываю следующие протоколы для использования:

var options = {protocols_whitelist: ["websocket", "xhr-streaming", "xdr-streaming", "xhr-polling", "xdr-polling", "iframe-htmlfile", "iframe-eventsource", "iframe-xhr-polling"], debug: true};             
conn = new SockJS("https://www.mysite.com/sockjs", options);

Однако, похоже, что IE9 просто использует наихудший из возможных протоколов iframe-htmlfile, поскольку я вижу следующее в журнале сервера:

INFO:root:200 GET /sockjs/info?t=1353062888578 (127.0.0.1) 0.51ms
INFO:root:200 GET /sockjs/iframe.html (127.0.0.1) 22.21ms

Почему он не использует xdr-streaming или xdr-polling? В документе SockJS эти два протокола помечены как «IE8, 9 (cookies = no)». Означает ли это, что SockJS будет использовать их только тогда, когда файлы cookie отключены для браузера?

Проблема 2: при использовании протокола iframe-htmlfile пользователь получит на странице предупреждение 'Only Secure Content is Displayed', которое сигнализирует о проблеме смешанного содержания. Однако ни один из других протестированных браузеров не сообщает об этом предупреждении (например, Chrome, FireFox, Safari), и, как упоминалось ранее, каждый внешний ресурс на странице обслуживается через https. Почему это? Связано ли это с этим конкретным протоколом iframe-htmlfile?

В то же время SockJS изо всех сил пытается подключиться к серверу и отправить сообщения. Вот что я вижу в логе сервера:

INFO:root:200 GET /sockjs/info?t=1353062888578 (127.0.0.1) 0.51ms
INFO:root:200 GET /sockjs/iframe.html (127.0.0.1) 22.21ms
INFO:root:200 GET /sockjs/info?t=1353062922712 (127.0.0.1) 0.39ms
connection openned for: 127.0.0.1
INFO:root:200 GET /sockjs/info?t=1353062963868 (127.0.0.1) 0.36ms
WARNING:root:Read error on 12: [Errno 104] Connection reset by peer
WARNING:root:error on read
Traceback (most recent call last):
  File "/home/ml/envs/.virtualenvs/sockapp/local/lib/python2.7/site-packages/tornado/iostream.py", line 355, in _handle_read
    if self._read_to_buffer() == 0:
  File "/home/ml/envs/.virtualenvs/sockapp/local/lib/python2.7/site-packages/tornado/iostream.py", line 422, in _read_to_buffer
    chunk = self._read_from_socket()
  File "/home/ml/envs/.virtualenvs/sockapp/local/lib/python2.7/site-packages/tornado/iostream.py", line 403, in _read_from_socket
    chunk = self.socket.recv(self.read_chunk_size)
error: [Errno 104] Connection reset by peer
subject disconnection from: None
Message handled in: 0 ms
INFO:root:200 GET /sockjs/369/rpf1d1vl/htmlfile?c=_jp.aepnvri (127.0.0.1) 60006.30ms

Последняя ошибка, кажется, тайм-аут. Соединение открывается, когда я закрываю диалоговое окно с предупреждением в IE9, но после этого от браузера не поступает сообщение (браузер должен отправить сообщение, как только соединение будет открыто). Интересно, связано ли это с предупреждением о смешанном содержании раньше.


person MLister    schedule 16.11.2012    source источник


Ответы (1)


Думаю, мы смогли определить ваши проблемы в списке рассылки SockJS. Краткое резюме:

Проблема 1. Ваш сервер требовал, чтобы клиент использовал только транспорт, который создает файлы cookie (по причинам балансировки нагрузки). Это означает, что транспорт на основе XDR нельзя использовать (XDR не может создавать файлы cookie).

Проблема 2 — вы забыли установить параметр sockjs_url на стороне сервера, чтобы включить sockjs javascript с https (а не с http). Вот почему у вас были предупреждения о смешанном содержании.

person Marek    schedule 22.11.2012