0

独自のリバースプロキシを作成しているときに、このPythonのバグに対処しています。サーバーはプロキシに次のSet-Cookie応答ヘッダーを送信しています。

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

SimpleCookieこの文字列をモジュールからインスタンスにロードしていCookieます。残念ながら、上記で参照したバグのため、後でexpiresmorsel辞書から引き出すと、が返されます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

文字列をトークンに分割し、それらをループしてスペースを探してから文字列を再構築できることは知っていますが、最高のパフォーマンスのソリューションが何であるかを知りたいです。前述したように、これは1秒間に数百のリクエストを処理できる可能性のあるリバースプロキシであるため、この置換を可能な限り高速化する必要があります。

正規表現の置換(もちろんプリコンパイル済み)は効率的でしょうか?正規表現はかなり重いと聞きましたが……。

4

2 に答える 2

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 に答える
1

この正規表現はどうですか?

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

=これにより、aの後に続くもの(または文字列の終わり)の前後に引用符が挿入されます;が、間に少なくとも1つのスペースがある場合に限ります。

>>> 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 に答える