2012-12-02 32 views
0

我在编写自己的反向代理时处理this python bug。服务器发送我代理这个Set-Cookie响应头:将引号插入字符串的最佳pythonic方法

workgroup_session_id=ilDJtR0rE1AG28C9ZxKLHj8TBtcT89sw; Path=/; Expires=Sun, 02-Dec-2012 5:57:25 GMT; HttpOnly 

我加载这个字符串转换成SimpleCookie实例从Cookie模块。不幸的是,由于我上面引用的错误,当我稍后将expires拉出小字典时,它会返回Sun,。我发现我可以通过在Set-Cookie标头的Expires组件上添加引号(或者在包含值中的空格的任何键/值对周围添加引号)来克服此错误。

所以这个:

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

对不起,但我**有**问 - 为什么你写你自己的? –

+0

这是一个公平的问题...我想要在Windows PC上生成可视化服务的独特django项目。相信与否,它确实很棒。那么,除了这个小bug(只影响IE)。 – dgel

+0

谢谢 - 没有假设你是为了好玩而做的 - 但是,我很难看出你不能使用现有代理的原因 - 代理的想法是所有这些**都不**必须**处理**无论如何 - 只是得到/发送...(对不起 - 也许我只是没有完全得到问题...) –

回答

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' 
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"')) 
+0

虽然没有那种方法......非常有创意的黑客。我喜欢。不漂亮,但又快又脏。 – dgel

相关问题