Я видел отчет об аналогичной ошибке здесь: 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, но после этого от браузера не поступает сообщение (браузер должен отправить сообщение, как только соединение будет открыто). Интересно, связано ли это с предупреждением о смешанном содержании раньше.