Проанализируйте заголовок Авторизации Запроса HTTP с Python

Они - оба то же самое, много элементов платформы представляет свойство имени самих, но для тех, которые не делают можно использовать x:name - я обычно просто придерживаюсь x:name, потому что это работает на все.

Средства управления могут представить, называют себя как Свойство Зависимости, если они хотят к (потому что они должны использовать то Свойство Зависимости внутренне), или они могут выбрать не к.

[еще 115] детали в msdn здесь и здесь :

Некоторые приложения уровня платформы WPF могли бы быть в состоянии избежать любого использования атрибута x:Name, потому что свойство зависимости от Имени, столь же указанное в пространстве имен WPF для нескольких из важных базовых классов, таких как FrameworkElement/FrameworkContentElement, удовлетворяет эту ту же цель. Существует все еще некоторый общий XAML и сценарии платформы, где доступ кода к элементу без свойства Name необходим, прежде всего в определенной анимации и классах поддержки раскадровки. Например, Вы должны определить x:Name на временных шкалах и преобразовываете созданный в XAML, если Вы намереваетесь сослаться на них от кода.

, Если Имя доступно как свойство на классе, Имя и x:Name могут использоваться попеременно в качестве атрибутов, но ошибка закончится, если оба будут определены на том же элементе.

12
задан Kris Walker 28 August 2009 в 21:58
поделиться

8 ответов

Небольшое регулярное выражение:

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

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

{'username': 'Foobear', 'realm': 'testrealm', 'qop': 'chap', 'cnonce': '5ccc069c403ebaf9f0171e9517f40e41', 'response': '6629fae49393a05397450978507c4ef1', 'Authorization': 'Digest'}
12
ответ дан 2 December 2019 в 05:04
поделиться

Вы также можете использовать urllib2, как CheryPy .

вот фрагмент:

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

он выводит:

{'username': 'Foobear', 'protocol': 'Digest', 'qop': 'chap', 'cnonce': '5ccc069c403ebaf9f0171e9517f40e41', 'realm': 'testrealm@host.com', 'response': '6629fae49393a05397450978507c4ef1'}
9
ответ дан 2 December 2019 в 05:04
поделиться

Я бы порекомендовал найти правильную библиотеку для анализа заголовков http, к сожалению, я не могу повторно вызвать их. : (

Некоторое время просмотрите фрагмент ниже (в основном он должен работать):

input= """
 Authorization: Digest qop="chap",
     realm="testrealm@host.com",
     username="Foob,ear",
     response="6629fae49393a05397450978507c4ef1",
     cnonce="5ccc069c403ebaf9f0171e9517f40e41"
"""

field, sep, value = input.partition(":")
if field.endswith('Authorization'):
   protocol, sep, opts_str = value.strip().partition(" ")

   opts = {}
   for opt in opts_str.split(",\n"):
        key, value = opt.strip().split('=')
        key = key.strip(" ")
        value = value.strip(' "')
        opts[key] = value

   opts['protocol'] = protocol

   print opts
1
ответ дан 2 December 2019 в 05:04
поделиться

Если эти компоненты всегда будут там, то регулярное выражение поможет:

test = '''Authorization: Digest qop="chap", realm="testrealm@host.com", username="Foobear", response="6629fae49393a05397450978507c4ef1", cnonce="5ccc069c403ebaf9f0171e9517f40e41"'''

import re

re_auth = re.compile(r"""
    Authorization:\s*(?P<protocol>[^ ]+)\s+
    qop="(?P<qop>[^"]+)",\s+
    realm="(?P<realm>[^"]+)",\s+
    username="(?P<username>[^"]+)",\s+
    response="(?P<response>[^"]+)",\s+
    cnonce="(?P<cnonce>[^"]+)"
    """, re.VERBOSE)

m = re_auth.match(test)
print m.groupdict()

производит:

{ 'username': 'Foobear', 
  'protocol': 'Digest', 
  'qop': 'chap', 
  'cnonce': '5ccc069c403ebaf9f0171e9517f40e41', 
  'realm': 'testrealm@host.com', 
  'response': '6629fae49393a05397450978507c4ef1'
}
1
ответ дан 2 December 2019 в 05:04
поделиться

Ваша первоначальная концепция использования PyParsing была бы лучшим подходом. То, о чем вы неявно просили, - это то, что требует грамматики ... то есть регулярное выражение или простая процедура синтаксического анализа всегда будут хрупкими, и похоже, что вы пытаетесь этого избежать.

Похоже, что получить pyparsing в движке приложений Google очень просто: Как мне настроить PyParsing в движке Google App?

Так что я бы пошел с этим, а затем реализовал полную поддержку HTTP-заголовка аутентификации / авторизации из rfc2617.

1
ответ дан 2 December 2019 в 05:04
поделиться

Если ваш ответ состоит из одной строки, которая никогда не меняется и содержит столько строк, сколько есть выражений для сопоставления , вы можете разделить его на массив с символом новой строки, называемый authentication_array , и использовать регулярные выражения:

pattern_array = ['qop', 'realm', 'username', 'response', 'cnonce']
i = 0
parsed_dict = {}

for line in authentication_array:
    pattern = "(" + pattern_array[i] + ")" + "=(\".*\")" # build a matching pattern
    match = re.search(re.compile(pattern), line)         # make the match
    if match:
        parsed_dict[match.group(1)] = match.group(2)
    i += 1
0
ответ дан 2 December 2019 в 05:04
поделиться

Вот моя попытка парсинга:

text = """Authorization: Digest qop="chap",
    realm="testrealm@host.com",     
    username="Foobear",     
    response="6629fae49393a05397450978507c4ef1",     
    cnonce="5ccc069c403ebaf9f0171e9517f40e41" """

from pyparsing import *

AUTH = Keyword("Authorization")
ident = Word(alphas,alphanums)
EQ = Suppress("=")
quotedString.setParseAction(removeQuotes)

valueDict = Dict(delimitedList(Group(ident + EQ + quotedString)))
authentry = AUTH + ":" + ident("protocol") + valueDict

print authentry.parseString(text).dump()

, которая выводит:

['Authorization', ':', 'Digest', ['qop', 'chap'], ['realm', 'testrealm@host.com'],
 ['username', 'Foobear'], ['response', '6629fae49393a05397450978507c4ef1'], 
 ['cnonce', '5ccc069c403ebaf9f0171e9517f40e41']]
- cnonce: 5ccc069c403ebaf9f0171e9517f40e41
- protocol: Digest
- qop: chap
- realm: testrealm@host.com
- response: 6629fae49393a05397450978507c4ef1
- username: Foobear

Я не знаком с RFC, но надеюсь, что это поможет вам.

3
ответ дан 2 December 2019 в 05:04
поделиться

Поле заголовка авторизации http-дайджеста выглядит довольно странно. Его формат аналогичен формату полей заголовков Cache-Control и Content-Type rfc 2616 , но достаточно отличается, чтобы быть несовместимыми. Если вы все еще ищете библиотеку, которая немного умнее и читабельнее, чем регулярное выражение, вы можете попробовать удалить часть Authorization: Digest с помощью str.split () и проанализировать остальное с помощью parse_dict_header () из http-модуля Werkzeug . (Werkzeug можно установить в App Engine.)

1
ответ дан 2 December 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: