我在编写自己的反向代理时正在处理this python bug。服务器正在向我的代理发送此Set-Cookie
响应标头:
workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly
我将此字符串加载到SimpleCookie
模块的Cookie
实例中。不幸的是,由于我上面提到的错误,当我稍后将expires
拉出morsel字典时,它返回Sun,
。我发现我可以通过在Expires
标题的Set-Cookie
组件周围添加引号来克服此错误(或在值中包含空格的任何键/值对周围添加引号)。
所以这个:
workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly
会变成:
workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires="Sun, 02-Dec-2012 5:57:25 GMT"; HttpOnly
而且:
test=a b c; Path=/; Expires=a b c; HttpOnly
会变成:
test="a b c"; Path=/; Expires="a b c"; HttpOnly
我知道我可以将字符串分解为标记并循环查找空格,然后重新构建字符串,但我很好奇最好的正在执行的解决方案是什么。正如我所提到的,这是一个反向代理,可能每秒处理几百个请求,所以我希望这个替换尽可能快。
正则表达式替换(当然是预编译)是否有效?我听说正则表达式很重......
答案 0 :(得分:1)
您是否需要在Expires之后的日期或标题中任何位置出现的任意日期附近放置引号?如果是前者,试试这个:
header = "workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly"
print(header.replace('Expires=', 'Expires="').replace('GMT', 'GMT"'))
答案 1 :(得分:1)
这个正则表达式怎么样:
import re
header = re.sub("(?<==)[^;]* [^;]*", r'"\g<0>"', header)
这会在=
之后的任何内容周围插入引号,直到下一个;
(或字符串结尾),但前提是它们之间至少有一个空格。
>>> header = 'test=a b c; Path=/; Expires=a b c; HttpOnly'
>>> re.sub("(?<==)[^;]* [^;]*", r'"\g<0>"', header)
'test="a b c"; Path=/; Expires="a b c"; HttpOnly'
>>> header = "workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly"
>>> re.sub("(?<==)[^;]* [^;]*", r'"\g<0>"', header)
'workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires="Sun, 02-Dec-2012 5:57:25 GMT"; HttpOnly'