2012-12-02 38 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

相關問題