Я создаю свой собственный Http-сервер со встроенной поддержкой Websockets для школьного проекта.Ошибка авторизации веб-узла Safari
В основном я тестировал все на Chrome, и все выглядит хорошо, но у меня проблемы с Safari (10.0.2).
При установлении рукопожатия WebSocket connection to 'ws://192.168.0.213' failed: Status line contains non-ASCII character
появляется как ошибка в консоли разработки, имейте в виду, Chrome работает так, как ожидалось.
Вот Обменялись Headers
заголовка запроса (Safari => Сервер)
GET/HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 192.168.0.213
Origin: http://192.168.0.213
Cookie: session=MDQ5M2UzYTctODg5NC00ZTEwLWJlOWEtYjBiZTRkNzdiYTRj
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: 9/Mj26XS0JxG+Y+lDTvMcQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0.2 Safari/602.3.12
заголовка ответа (Server => Safari) Заголовок
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Upgrade:websocket
Sec-WebSocket-Accept:rpx9CefKAgOdM7RzjhLuWEcCIso=
Raw Response
[72][84][84][80][47][49][46][49][32][49]
[48][49][32][83][119][105][116][99][104][105]
[110][103][32][80][114][111][116][111][99][111]
[108][115][13][10][67][111][110][110][101][99]
[116][105][111][110][58][85][112][103][114][97]
[100][101][13][10][85][112][103][114][97][100]
[101][58][87][101][98][115][111][99][107][101]
[116][13][10][83][101][99][45][87][101][98]
[83][111][99][107][101][116][45][65][99][99]
[101][112][116][58][53][120][86][118][113][57]
[52][121][97][53][84][56][51][88][65][82]
[115][78][119][74][69][88][97][78][97][108]
[99][61][13][10][13][10]
Как это beeng генерируется (C#)
string handshakeString = $"HTTP/1.1 {(int)StatusCode.SwitchingProtocols} {StatusCode.SwitchingProtocols.GetStatusMessage()}" + Environment.NewLine
+ "Connection:Upgrade" + Environment.NewLine
+ "Upgrade:Websocket" + Environment.NewLine
+ "Sec-WebSocket-Accept:" + Convert.ToBase64String($"{_initHeader["Sec-WebSocket-Key"]}258EAFA5-E914-47DA-95CA-C5AB0DC85B11".Sha1()) + Environment.NewLine
+ Environment.NewLine;
byte[] handshake = Encoding.ASCII.GetBytes(handshakeString); // <- There is the ASCII part
await SendFrameData(OpCode.Text, handshake); // This frame neither gets fragmented or masked
Я понимаю, что должна быть проблема с кодировкой заголовка, но этот заголовок будет закодирован в ASCII и отправить с OpCode 0x1 (текст) для Клиента, и он работает в Chrome. Мне не хватает некоторых заголовков/значений?
Спасибо, Дэвид
Очевидно, что это не все ASCII, иначе Safari не будет жаловаться на это. Как выглядит ваш код сервера? Как выглядят фактические необработанные байты? –
@RemyLebeau Я только что добавил код сервера и необработанные байты. –
Что делает 'SendFrameData()' на самом деле? На этом этапе связи протокол по-прежнему является HTTP, а не WebSocket, поэтому, если 'SendFrameData (OpCode.Text, handshake)' не отправляет 'handshake' * как-есть *, но обертывает его в рамку WebSocket, тогда вы развращают сообщения. Вы не можете отправлять фреймы WebSocket до тех пор, пока * после того, как был отправлен ответ HTTP '101'. –