Согласование / диагностика сеансов витой веб-сервера - PullRequest
0 голосов
/ 19 июня 2019

У меня есть существующее веб-приложение, использующее Python Twisted. Клиенты - это встроенные устройства, а не люди. Поэтому я иногда сталкиваюсь с причудами часто устаревших и упрощенных http-клиентов на этих устройствах. Приложение использует сессионные куки, до сих пор у меня не было проблем.

Недавно я добавил устройство нового типа, и у меня возникли проблемы с неработающим сопоставлением сеансов.

Я использую getSession () из класса Session twisted.web.server.

Это конкретное клиентское устройство, похоже, возвращает заголовок Cookie в формате, который getSession не может сопоставить с сеансом (и, таким образом, создает новый сеанс при каждом полученном запросе).

Я не уверен, что это проблема с Twisted или проблема с тем, как клиентское устройство форматирует заголовок cookie, в частности, как оно переформатирует атрибут Path.

Поведение работающего клиентского устройства таково.

Заголовок Set-Cookie, отправляемый Twisted:

Set-Cookie: TWISTED_SESSION=10d4ed8a01ad1459c53018953343f2d357e9ac5015a86ab714fd09eb12b06c4c; Path=/

И полученный заголовок Cookie отправляется клиентом по следующему запросу:

Cookie: $Version="0"; TWISTED_SESSION=10d4ed8a01ad1459c53018953343f2d357e9ac5015a86ab714fd09eb12b06c4c;$Path=/

Теперь нерабочий клиент, заголовок Set-Cookie с веб-сервера Twisted:

Set-Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb; Path=/

И полученный заголовок Cookie, которому не соответствует Twisted Session:

Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb/

Просто поместите путь "/" в конец атрибута TWISTED_SESSION.

Я немного застрял в том, как диагностировать это дальше, я попытался переписать заголовок Cookie и удалить / с конца, но это не помогло.

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

1 Ответ

0 голосов
/ 21 июня 2019

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

Короче говоря, фактический ответ заключается в том, что HTTP-клиент не работает и неправильно отправляет заголовок Cookie.

Я счастливдля того, чтобы кто-то мог доказать обратное, но из моего собственного прочтения RFC6265 и документации для разработчиков Mozilla нельзя допускать добавление атрибута Path в конец другой пары cookie (имя = значение).Учитывая, что имена пар являются произвольными, это не имеет никакого смысла.

Я добавил monkeypatch, чтобы обойти эту проблему.Это грязно, но это позволяет мне протестировать это устройство, которое еще пригодится:

from twisted.web.http import Request
def parseCookies(self):
    """                                                                                                                                     
    Parse cookie headers.                                                                                                                   

    This method is not intended for users.                                                                                                  
    """
    cookieheaders = self.requestHeaders.getRawHeaders(b"cookie")

    if cookieheaders is None:
    return

    for cookietxt in cookieheaders:
        if cookietxt:
            for cook in cookietxt.split(b';'):
        cook = cook.lstrip()
                try:
                    k, v = cook.split(b'=', 1)
                    self.received_cookies[k] = v.split(b'/')[0]
                except ValueError:
                    pass

Request.parseCookies = parseCookies
...