使用Python解析HTTP请求Authorization标头

Kri*_*ker 12 python google-app-engine parsing http http-headers

我需要像这样的标题:

 Authorization: Digest qop="chap",
     realm="testrealm@host.com",
     username="Foobear",
     response="6629fae49393a05397450978507c4ef1",
     cnonce="5ccc069c403ebaf9f0171e9517f40e41"
Run Code Online (Sandbox Code Playgroud)

并使用Python将其解析为:

{'protocol':'Digest',
  'qop':'chap',
  'realm':'testrealm@host.com',
  'username':'Foobear',
  'response':'6629fae49393a05397450978507c4ef1',
  'cnonce':'5ccc069c403ebaf9f0171e9517f40e41'}
Run Code Online (Sandbox Code Playgroud)

有没有一个图书馆可以做到这一点,或者我可以寻找灵感的东西?

我在谷歌应用引擎上这样做,我不确定Pyparsing库是否可用,但如果它是最好的解决方案,我可以将它包含在我的应用程序中.

目前我正在创建自己的MyHeaderParser对象,并在头字符串上使用reduce().它工作,但非常脆弱.

以下是nadia的精彩解决方案:

import re

reg = re.compile('(\w+)[=] ?"?(\w+)"?')

s = """Digest
realm="stackoverflow.com", username="kixx"
"""

print str(dict(reg.findall(s)))
Run Code Online (Sandbox Code Playgroud)

Nad*_*mli 12

一点正则表达式:

import re
reg=re.compile('(\w+)[:=] ?"?(\w+)"?')

>>>dict(reg.findall(headers))

{'username': 'Foobear', 'realm': 'testrealm', 'qop': 'chap', 'cnonce': '5ccc069c403ebaf9f0171e9517f40e41', 'response': '6629fae49393a05397450978507c4ef1', 'Authorization': 'Digest'}
Run Code Online (Sandbox Code Playgroud)

  • 更宽容的版本:`re.compile(r'(\ w +)[:=] [\ s"]?([^",] +)"?')` (2认同)

Pio*_*pla 9

您也可以像CheryPy一样使用urllib2 .

这是片段:

input= """
 Authorization: Digest qop="chap",
     realm="testrealm@host.com",
     username="Foobear",
     response="6629fae49393a05397450978507c4ef1",
     cnonce="5ccc069c403ebaf9f0171e9517f40e41"
"""
import urllib2
field, sep, value = input.partition("Authorization: Digest ")
if value:
    items = urllib2.parse_http_list(value)
    opts = urllib2.parse_keqv_list(items)
    opts['protocol'] = 'Digest'
    print opts
Run Code Online (Sandbox Code Playgroud)

它输出:

{'username': 'Foobear', 'protocol': 'Digest', 'qop': 'chap', 'cnonce': '5ccc069c403ebaf9f0171e9517f40e41', 'realm': 'testrealm@host.com', 'response': '6629fae49393a05397450978507c4ef1'}
Run Code Online (Sandbox Code Playgroud)