我有一个使用Python Twisted的现有web应用程序。客户端是嵌入式设备,而不是人类。因此,我偶尔会遇到这些设备中经常过时和简单化的http客户端的怪癖。这个应用程序依赖于会话cookie,到目前为止我还没有遇到任何问题。
最近我添加了一种新的设备,我遇到了会话匹配不起作用的问题。
我使用的是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 Session不匹配的Cookie标头:
Cookie: TWISTED_SESSION=fe5abac62eb577176e94d2a98d46298d6c093d425e51583554a4ad98e3cff8fb/它只是将路径"/“放在TWISTED_SESSION属性的末尾。
我在如何进一步诊断这个问题上有点卡住了,我试图重写Cookie头并去掉结尾的/,但这没有帮助。
我也不确定客户的行为是否正确。这看起来很不寻常,但我不知道它所做的是否在技术上是错误的。
发布于 2019-06-21 16:58:49
我已经想出了解决这个问题的办法。我想把它贴在这里,以防对其他人有用。
简而言之,实际的答案是HTTP客户端中断了,并且错误地发送了Cookie头。
我很高兴有人能证明不是这样,但根据我自己对RFC6265的阅读& Mozilla开发人员文档,不允许将路径属性附加到另一个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 = parseCookieshttps://stackoverflow.com/questions/56668187
复制相似问题