0

我在编写自己的反向代理时正在处理这个 python 错误。服务器正在向我的代理发送此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

我知道我可以将字符串分解为标记并循环遍历它们以查找空格,然后重建字符串,但我很好奇性能最佳解决方案是什么。正如我所提到的,这是一个可能每秒处理几百个请求的反向代理,所以我希望这种替换尽可能快。

正则表达式替换(当然是预编译的)会有效吗?我听说正则表达式很重......

4

2 回答 2

1

这个正则表达式怎么样:

import re
header = re.sub("(?<==)[^;]* [^;]*", r'"\g<0>"', header)

这会在 a 之后的任何内容周围插入引号,=直到下一个;(或字符串结尾),但前提是其间至少有一个空格。

>>> 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'
于 2012-12-02T08:15:06.117 回答
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"'))
于 2012-12-02T02:50:28.863 回答