Error 1006 на сайте

I would like to get the reason websockets closed, so I can show the right message to the user. I have sok.onerror=function (evt) {//since there is an error, sockets will close so... sok.

Thought this might be handy for others. Knowing regex is useful, kids. Stay in school.

Edit: Turned it into a handy dandy function!

let specificStatusCodeMappings = {
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
};

function getStatusCodeString(code) {
    if (code >= 0 && code <= 999) {
        return '(Unused)';
    } else if (code >= 1016) {
        if (code <= 1999) {
            return '(For WebSocket standard)';
        } else if (code <= 2999) {
            return '(For WebSocket extensions)';
        } else if (code <= 3999) {
            return '(For libraries and frameworks)';
        } else if (code <= 4999) {
            return '(For applications)';
        }
    }
    if (typeof(specificStatusCodeMappings[code]) !== 'undefined') {
        return specificStatusCodeMappings[code];
    }
    return '(Unknown)';
}

Usage:

getStatusCodeString(1006); //'Abnormal Closure'

{
    '0-999': '(Unused)',
    '1016-1999': '(For WebSocket standard)',
    '2000-2999': '(For WebSocket extensions)',
    '3000-3999': '(For libraries and frameworks)',
    '4000-4999': '(For applications)'
}

{
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
}

Source (with minor edits for terseness): https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes

Thought this might be handy for others. Knowing regex is useful, kids. Stay in school.

Edit: Turned it into a handy dandy function!

let specificStatusCodeMappings = {
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
};

function getStatusCodeString(code) {
    if (code >= 0 && code <= 999) {
        return '(Unused)';
    } else if (code >= 1016) {
        if (code <= 1999) {
            return '(For WebSocket standard)';
        } else if (code <= 2999) {
            return '(For WebSocket extensions)';
        } else if (code <= 3999) {
            return '(For libraries and frameworks)';
        } else if (code <= 4999) {
            return '(For applications)';
        }
    }
    if (typeof(specificStatusCodeMappings[code]) !== 'undefined') {
        return specificStatusCodeMappings[code];
    }
    return '(Unknown)';
}

Usage:

getStatusCodeString(1006); //'Abnormal Closure'

{
    '0-999': '(Unused)',
    '1016-1999': '(For WebSocket standard)',
    '2000-2999': '(For WebSocket extensions)',
    '3000-3999': '(For libraries and frameworks)',
    '4000-4999': '(For applications)'
}

{
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
}

Source (with minor edits for terseness): https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes


Я хотел бы выяснить причину закрытия веб-сокетов, чтобы я мог показать правильное сообщение пользователю.

у меня есть

sok.onerror=function (evt) 
     {//since there is an error, sockets will close so...
       sok.onclose=function(e){
           console.log("WebSocket Error: " , e);}

Код всегда 1006 и причина всегда «». Но я хочу выделить разные заключительные причины.

Например, в командной строке указывается причина ошибки: «вы не можете удалить это, потому что база данных не позволит вам». Но на консоли Chrome причина по-прежнему «».

Есть ли другой способ отличить разные причины закрытия?


Ответы:


Код1006 закрытия — это специальный код, который означает, что соединение было закрыто ненормально (локально) реализацией браузера.

Если ваш браузер-клиент сообщает о закрытом коде 1006, вам следует изучить websocket.onerror(evt)событие, чтобы узнать подробности.

Однако Chrome редко сообщает о 1006причинах закрытия кода на стороне Javascript. Вероятно, это связано с правилами безопасности клиента в спецификации WebSocket для предотвращения злоупотребления WebSocket. (например, его использование для сканирования открытых портов на целевом сервере или для создания большого количества соединений для атаки типа «отказ в обслуживании»).

Обратите внимание, что Chrome часто сообщает о 1006закрытом коде, если во время HTTP-обновления до Websocket возникает ошибка (это шаг перед технически «подключением» WebSocket). По таким причинам, как неправильная аутентификация или авторизация, или неправильное использование протокола (например, запрос подпротокола, но сам сервер не поддерживает тот же подпротокол), или даже попытка поговорить с расположением сервера, которое не является WebSocket ( например, попытка подключиться к ws://images.google.com/)

По сути, если вы видите закрытый код 1006, у вас есть ошибка очень низкого уровня с самим WebSocket (похожая на «Невозможно открыть файл» или «Ошибка сокета»), не предназначенная для пользователя, поскольку указывает на проблему низкого уровня. с вашим кодом и реализацией. Устраните проблемы низкого уровня, а затем, когда вы подключитесь, вы можете включить более разумные коды ошибок. Вы можете добиться этого с точки зрения масштаба или серьезности вашего проекта. Пример: информация и уровень предупреждений являются частью конкретного протокола вашего проекта и не приводят к разрыву соединения. При создании отчетов о серьезных или фатальных сообщениях также используется протокол вашего проекта, чтобы передать столько деталей, сколько вы хотите, а затем закрывать соединение, используя ограниченные возможности потока закрытия WebSocket.

Имейте в виду, что коды закрытия WebSocket очень строго определены, а длина фразы / сообщения причины закрытия не может превышать 123 символа (это намеренное ограничение WebSocket).

Но не все потеряно, если вам просто нужна эта информация для отладки, подробности закрытия и его основная причина часто сообщаются с достаточным количеством деталей в консоли Javascript Chrome.







В моем случае и, возможно, в случае @BIOHAZARD это было так nginx proxy timeout. По умолчанию это 60sec без активности в сокете

Я изменил его на 24 часа nginxи решил проблему.

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;



Похоже, это тот случай, когда Chrome не совместим со стандартом WebSocket. Когда сервер инициирует закрытие и отправляет клиенту кадр закрытия, Chrome считает это ошибкой и сообщает об этом стороне JS с кодом 1006 без сообщения о причине. В моих тестах Chrome никогда не реагирует на инициированные сервером кадры закрытия (код закрытия 1000), предполагая, что код 1006, вероятно, означает, что Chrome сообщает о собственной внутренней ошибке.

PS Firefox v57.00 правильно обрабатывает этот случай и успешно доставляет сообщение о причине сервера на сторону JS.


Думал, что это может быть полезно для других. Знать регулярное выражение полезно, дети. Останься в школе.

Изменить: превратили его в удобную функцию денди!

let specificStatusCodeMappings = {
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
};

function getStatusCodeString(code) {
    if (code >= 0 && code <= 999) {
        return '(Unused)';
    } else if (code >= 1016) {
        if (code <= 1999) {
            return '(For WebSocket standard)';
        } else if (code <= 2999) {
            return '(For WebSocket extensions)';
        } else if (code <= 3999) {
            return '(For libraries and frameworks)';
        } else if (code <= 4999) {
            return '(For applications)';
        }
    }
    if (typeof(specificStatusCodeMappings[code]) !== 'undefined') {
        return specificStatusCodeMappings[code];
    }
    return '(Unknown)';
}

Применение:

getStatusCodeString(1006); //'Abnormal Closure'

{
    '0-999': '(Unused)',
    '1016-1999': '(For WebSocket standard)',
    '2000-2999': '(For WebSocket extensions)',
    '3000-3999': '(For libraries and frameworks)',
    '4000-4999': '(For applications)'
}

{
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
}

Источник (с небольшими правками для краткости): https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes


У меня возникла ошибка при использовании Chrome в качестве клиента и golang gorilla websocket в качестве сервера под прокси-сервером nginx

И отправка лишь некоторого «ping» сообщения от сервера к клиенту каждые x секунд решает проблему.


Это может быть ваш URL-адрес веб-сокета, который вы используете на устройстве, не тот же (вы нажимаете другой URL-адрес веб-сокета из android / iphonedevice)

  • I’ve searched for any related issues and avoided creating a duplicate issue.

Possibly related to, though couldn’t confirm: socketio/socket.io#2016

Description

I experience random disconnects on a remote connection to a server.

The disconnects do not happen when I run the code locally or remotely in Chromium. They only occur when running the code remotely in Firefox.

I have filed a bug report with Firefox (https://bugzilla.mozilla.org/show_bug.cgi?id=1478157).

However, I do not experience these disconnects when I switch the library to socket.io, which is the reason I’m also filing a bug report here.

Reproducible in:

version:
Node.js version(s): 10.9.0
OS version(s): Linux computer 4.18.3-arch1-1-ARCH
Firefox 62.0.2 on archlinux

Steps to reproduce:

  1. Download and extract attached testcase
  2. Run npm install
  3. Generate a private key and ssl certificate under localhost.key and localhost.crt (or modify the code to run insecurely)
  4. If running on server/domain, modify the «localhost» string in the last line of index.js to match the domain name
  5. Run node index.js

Expected result:

When running the code on a remote server, you shouldn’t experience disconnects.

Actual result:

I experience random disconnects with this output:

  • onopen
    open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 208, cancelBubble: false, originalTarget: WebSocket, … }
    mydomain.com:8443:45:9
    The connection to wss://mydomain.com:8443/ was interrupted while the page was loading. mydomain.com:8443:9:16
    onerror
    error { target: WebSocket, isTrusted: true, currentTarget: WebSocket, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 191826, cancelBubble: false, … }
    mydomain.com:8443:25:5
    onclose
    close { target: WebSocket, isTrusted: true, wasClean: false, code: 1006, reason: «», currentTarget: WebSocket, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false, … }
    mydomain.com:8443:20:5
    on open
    open { target: WebSocket, isTrusted: true, currentTarget: WebSocket, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 192111, cancelBubble: false, … }

Attachments:

testcase.tar.gz

I’m trying to send some data from server written in C# to browser client written in JS. When I send 12900 bytes sized messages then all going OK. If I’ll send message sized 67990 bytes then on server-side I’ll get no error and client side I’ll get disconnect with disconnect error 1006 with no other explanation. I can’t find somewhere any limitations related to message size. Here is C# code in which I’m trying to send data.

byte[] data =getDecodedMessage(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dataResponse)));
stream.Write(data, 0, data.Length);

asked Mar 14, 2018 at 15:32

Vladislav Vazhenin's user avatar

2

Based on question user3892585 answer I replaced bytesRaw.Length with bytesRaw.LongLengthin my encoding function for WebSocket data transfer. After doing this I didn’t receive socket error.

public static byte[] getEncodedMessage(byte[] bytesRaw)
    {
        List<byte> bytesFormatted = new List<byte>();
        bytesFormatted.Add(129);

        int indexStartRawData = -1; // it doesn't matter what value is
                                    // set here - it will be set now:

        if (bytesRaw.LongLength <= 125)
        {
            bytesFormatted.Add(Convert.ToByte(bytesRaw.LongLength));


            indexStartRawData = 2;
        }

        else if (bytesRaw.LongLength >= 126 && bytesRaw.LongLength <= 65535)
        {
            bytesFormatted.Add(126);
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 8) & 255));
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength) & 255));

            indexStartRawData = 4;
        }

        else
        {
            bytesFormatted.Add(127);
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 56) & 255));
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 48) & 255));


            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 40) & 255));
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 32) & 255));
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 24) & 255));
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 16) & 255));
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 8) & 255));
            bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength) & 255));

            indexStartRawData = 10;
        }
        // put raw data at the correct index
        bytesFormatted.InsertRange(indexStartRawData, bytesRaw);
        return bytesFormatted.ToArray();
    }

answered Mar 15, 2018 at 10:23

Vladislav Vazhenin's user avatar

Понравилась статья? Поделить с друзьями:
  • Error 10057 airport
  • Error 10054 warframe как исправить
  • Error 10054 tftp
  • Error 10054 firebird
  • Error 10054 ammyy admin