Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Endpoints dont get info.arguments #2

Closed
klen opened this issue Nov 3, 2011 · 9 comments
Closed

Endpoints dont get info.arguments #2

klen opened this issue Nov 3, 2011 · 9 comments

Comments

@klen
Copy link
Contributor

klen commented Nov 3, 2011

Прежде всего спасибо за вашу работу.

Я не уверен, что это баг, но мне такое поведение кажется странным.

Если определены SockectConenction вида:

class ChatConnection(SocketConnection):
    def on_open(self, info):
        self.send('Chat open connection')
        self.send(info.arguments)


class RouterConnection(SocketConnection):
    def on_open(self, info):
        self.send('Router open connection')
        self.send(info.arguments)

    __endpoints__ = {'/chat': ChatConnection,
                    '/ping': PingConnection}

и осуществляется подключение с аргументами

    var chat = new io.connect('http://localhost:8001/chat?test=chat');

То при подключении к chat каналу , сначала создается объект типа RouterConnection и вызывается его метод on_open (здесь query аргументы от сервера приходят), потом создается объект ChatConnection и вызывается его метод on_open, но здесь уже не приходят аргументы от сервера.

Вопрос: Так и должно быть? Я ожидал что при подключении на localhost/chat будет создан только подключение ChatConnection и до него должны дойти аргументы запроса (request.arguments).

@mrjoes
Copy link
Owner

mrjoes commented Nov 3, 2011

Явная бага socket.io - он перестал отправлять arguments для multiplexed соединений.

Грубо говоря, для примера выше, происходит следующее:

  1. socket.io открывает сервер по URL и передает параметры сразу через URL, так что их принимает дефолтный хендлер
  2. По открытому соединению посылается пакет на соединение к '/chat' без параметров

Должно быть наоборот:

  1. Без параметров подключение к серверу
  2. Отправка пакета вида: '1:::/chat?test=chat' для виртуального соединения.

В целом - я открою у них тикет.

@mrjoes mrjoes closed this as completed Nov 3, 2011
@klen
Copy link
Contributor Author

klen commented Nov 3, 2011

Спасибо.

@mrjoes
Copy link
Owner

mrjoes commented Nov 3, 2011

Как вариант обхода проблемы, на текущий момент, могу посоветовать следующее.

Например есть ситуация, когда необходимо передавать некий token, по которому можно будет определить пользователя:

  1. Делать авторизацию в роутере
  2. Из виртуальных соединений делать что-то типа: self.session.conn.current_user_id
  3. При открытии соединения, в клиенте, убедиться что token передается в первом вызове (socket.io сохраняет параметры на уровне сессии, а не отдельного соединения - кто первый вызвал io.connect, того и тапки).

Тикет открыл: socketio/socket.io-client#331

@klen
Copy link
Contributor Author

klen commented Nov 3, 2011

Я проверил старые версии soket.io до 0.7.5 включительно и ни одна из них не имеет отличного поведения. Может быть так и задумано и стоит сохранять параметры у родительского подключения передавая их при создании дочерних?

@mrjoes
Copy link
Owner

mrjoes commented Nov 3, 2011

Протокол утверждает иное, https://github.com/LearnBoost/socket.io-spec:

Example, if the client is trying to connect to the endpoint /test, a message like this will be delivered:

'1::' [path] [query]
Example:

1::/test?my=param
Так что это явная бага, как минимум по следующим причинам:

  1. Имеет значение в каком порядке соединяемся. Т.е. если первый io.connect без query string, а второй будет чего-то передавать, то в результате ничего не передастся даже в родительское соединение.
  2. Теряем query string для всех последующих соединений
  3. Абсолютно нелогичное поведение которое не соответствует их же протоколу.

@klen
Copy link
Contributor Author

klen commented Nov 3, 2011

Да действительно, пока не починят отфоркаю tornadio2. Мне нужен этот функционал, а soket-io-client отпатчить сложнее :) Надеюсь быстро починят.

@mrjoes
Copy link
Owner

mrjoes commented Nov 3, 2011

А зачем форкать? Можно обойти так:

class ChatConnection(SocketConnection):
def on_open(self, info):
self.send('Chat open connection')
self.send(self.session.conn.info.arguments)

class RouterConnection(SocketConnection):
def on_open(self, info):
self.send('Router open connection')
self.info = info

   __endpoints__ = {'/chat': ChatConnection,
                   '/ping': PingConnection}

Сергей.

@mrjoes
Copy link
Owner

mrjoes commented Nov 3, 2011

Ух оно режет русский, если ответ письмом.

@klen
Copy link
Contributor Author

klen commented Nov 3, 2011

Да логично, не заметил, что создается линк на session. А я уже написал сохранение request.query в session.init и добавление его к url в connect_endpoint.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants