Twisted web服务器会话匹配/诊断

2024-09-29 07:22:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用Python Twisted的现有web应用程序。客户端是嵌入式设备而不是人。所以我偶尔会在这些设备中遇到一些过时的、过于简单的http客户端的怪癖。应用程序依赖于会话cookies,到目前为止我还没有遇到任何问题

最近,我添加了一种新类型的设备,我遇到了会话匹配不起作用的问题

我正在使用twisted.web.server会话类中的getSession()

这个特定的客户机设备似乎以getSession无法与会话匹配的格式返回Cookie头(因此在收到的每个请求上都会创建一个新会话)

我不确定这是Twisted的问题还是客户端设备格式化cookie头的问题,特别是它如何重新格式化Path属性

工作客户端设备的行为是这样的

Twisted发送的Set Cookie标头:

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

以及客户端在下一个请求中发送的结果Cookie头:

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

现在是非工作客户机,Twisted web服务器的Set Cookie头:

Set-Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb; Path=/

以及Twisted会话不匹配的结果Cookie头:

Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb/

它只是将路径“/”放在TWISTED\u SESSION属性的末尾

我有点纠结于如何进一步诊断这个问题,我尝试重新编写Cookie头并从末尾删除/但这没有帮助

我也不确定客户的行为是否正确。这似乎不寻常,但我不知道它所做的是不是技术上的错误


Tags: pathweb应用程序http客户端客户机属性cookie
1条回答
网友
1楼 · 发布于 2024-09-29 07:22:54

我已经想出了解决办法。我想把它贴在这里,以防万一对其他人有用

简而言之,实际的答案是HTTP客户机坏了,发送Cookie头不正确

我很高兴有人能证明,但从我自己的阅读RFC6265&;Mozilla开发人员文档中没有允许将Path属性附加到另一个cookie(name=value)对的末尾。考虑到两人的名字是任意的,那就没有任何意义了

我添加了一个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

相关问题 更多 >