Chromium закрывает WebSocket без объяснения

У меня есть Chromium 12.0.742.112 (90304), и я пытаюсь установить с ним простой сервер WebSocket. Я получаю запрос на рукопожатие, такой как

Upgrade: WebSocket
Connection: Upgrade
Host: akira:22222
Origin: http://akira:22222
Sec-WebSocket-Key1: ;39LP*eC48 n /r0P6  v6548
Sec-WebSocket-Key2: 1 0  r 362547    4  4  G

, за которым следуют 8 ключевых байтов, в данном случае 88 09 F9 EE 21 13 F4 0D. Я проверил, что это те же самые клавиши, которые показывает Chromium на вкладке Сетевая консоль. Рассчитываю первые две клавиши как

Key1: 3948066548 / 4 = 987016637
Key2: 1036254744 / 12 = 86354562

и посылаю ответ:

000001  48 54 54 50  2F 31 2E 31  20 31 30 31  20 57 65 62  HTTP/1.1 101 Web
000011  20 53 6F 63  6B 65 74 20  50 72 6F 74  6F 63 6F 6C   Socket Protocol
000021  20 48 61 6E  64 73 68 61  6B 65 0D 0A  55 70 67 72   Handshake..Upgr
000031  61 64 65 3A  20 57 65 62  53 6F 63 6B  65 74 0D 0A  ade: WebSocket..
000041  43 6F 6E 6E  65 63 74 69  6F 6E 3A 20  55 70 67 72  Connection: Upgr
000051  61 64 65 0D  0A 53 65 63  2D 57 65 62  53 6F 63 6B  ade..Sec-WebSock
000061  65 74 2D 4F  72 69 67 69  6E 3A 20 68  74 74 70 3A  et-Origin: http:
000071  2F 2F 61 6B  69 72 61 3A  32 32 32 32  32 0D 0A 53  //akira:22222..S
000081  65 63 2D 57  65 62 53 6F  63 6B 65 74  2D 4C 6F 63  ec-WebSocket-Loc
000091  61 74 69 6F  6E 3A 20 77  73 3A 2F 2F  61 6B 69 72  ation: ws://akir
0000A1  61 3A 32 32  32 32 32 2F  73 6F 63 6B  65 74 0D 0A  a:22222/socket..
0000B1  0D 0A FF F4  2E 12 9D DC  12 C2 56 40  B8 09 F3 84  ..........V@....
0000C1  CA EF .. ..  .. .. .. ..  .. .. .. ..  .. .. .. ..  ..##############

Chromium просто закрывает розетку, даже не печатая сообщение в консоли JS. Я не могу сказать, что я делаю неправильно?

Серверный код находится в Lua (таким образом, почему вышеупомянутый шестнадцатеричный дамп индексируется начиная с 1):

require('crypto')
local handshake = {
    "HTTP/1.1 101 Web Socket Protocol Handshake",
    "Upgrade: WebSocket",
    "Connection: Upgrade",
    "Sec-WebSocket-Origin: " .. request.header.origin,
    "Sec-WebSocket-Location: " ..
        request.header.origin:gsub('http:', 'ws:') .. "/socket",
'\r\n'}

log.debug("Request header:\n%s\n", table.concat(request.rawheader, '\n'))

local client = response.socket
client:settimeout(10)

local keys =
    {request.header.sec_websocket_key1, request.header.sec_websocket_key2}
local sum = {}
for i, k in ipairs(keys) do
    local nspc = 0
    sum[i] = ''
    k:gsub('%d', function(n) sum[i] = sum[i] ..n end)
    k:gsub(' ', function() nspc = nspc + 1 end)
    log.debug("Key%d: %s / %d = ", i, sum[i], nspc)
    sum[i] = tostring(tonumber(sum[i]) / nspc)
    log.debug("%s\n", sum[i])
end

local key = assert(client:receive(8))
local bytes = {key:byte(1, #key)}
local keydump = {}
for i = 1, #bytes do keydump[i] = ('%02X'):format(bytes[i]) end
log.debug("Key3: %s\n", table.concat(keydump, ' '))

local resp = crypto.evp.digest('md5', table.concat(sum) .. key, true)
handshake = table.concat(handshake, '\r\n') .. resp

client:settimeout(0.1)
log.debug("Send handshake:\n%s\n", rena.debug.hexdump(handshake))
client:send(handshake)

repeat
    local res, err = client:receive('*l')
    if res then log.debug("R: %s\n", res) end

    local res, err = client:send("Test " .. tostring(os.time()) .. '\n')
    if res then socket.sleep(1)
    elseif err == 'timeout' then log.debug("WS: Timed out\n")
    elseif err == 'closed' then log.debug("WS: Closed\n")
    else log.error("WS: Error: %s\n", tostring(err))
    end
until not res

(Этот сценарий загружается серверным сценарием, который устанавливает некоторые переменные, такие как запрос и ответ, и использует LureCrypto для MD5). Все выглядит правильно (хотя я замечаю, что все примеры показывают хорошие символы ASCII для двоичных ключей, в то время как мои в основном непечатаемые), но он просто закрывает сокет.

К сожалению, Chromium является единственным браузером, который поддерживает WebSocket вообще (если только нет возможности включить его в Firefox 6?), поэтому я не могу проверить что-либо еще.

-121--1920507- Запрос LinQ с несколькими таблицами и извлечением данных Я выполняю запрос для внутреннего соединения 4 таблиц и должен извлечь данные и преобразовать их в последовательность и поместить в массив для них. var query = из a в context.as соединения b в...

Я делаю запрос для внутреннего соединения 4 таблиц, и я должен извлечь данные и преобразовать в последовательность и поместить их в массив для него.

    var query = from a in context.as
                            join b in context.bs on a.prikey equals b.forkey
                            join c in context.cs on b.prikey equals c.forkey
                            join d in context.ds on c.prikey equals d.forkey
                            where b.gender == gender
                            where c.age == age
                            select new
                            {
                                a.Name,
                                a.Age,
                                b.Gender,
                            };
string[] results = new string[] {}
return results;

Обычно, если используется одна таблица a as = множественное число таблицы a

as t = query.First() 
string[] results = new string[] {t.Name, t.Age, t.Gender}
return results;

Мне не хватает шага для извлечения данных.

6
задан vinz 29 September 2011 в 06:56
поделиться