~anna-g/micronaet/anna

« back to all changes in this revision

Viewing changes to mws_amazon/mws/requests/packages/oauthlib/oauth1/rfc5849/utils.py

  • Committer: Anna Micronaet
  • Date: 2013-07-18 09:08:36 UTC
  • Revision ID: anna@micronaet.it-20130718090836-ssmst48rrnvcd69w
Tolti tutti i moduli

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf-8 -*-
2
 
 
3
 
"""
4
 
oauthlib.utils
5
 
~~~~~~~~~~~~~~
6
 
 
7
 
This module contains utility methods used by various parts of the OAuth
8
 
spec.
9
 
"""
10
 
 
11
 
import string
12
 
import urllib2
13
 
 
14
 
from oauthlib.common import quote, unquote
15
 
 
16
 
UNICODE_ASCII_CHARACTER_SET = (string.ascii_letters.decode('ascii') +
17
 
    string.digits.decode('ascii'))
18
 
 
19
 
 
20
 
def filter_params(target):
21
 
    """Decorator which filters params to remove non-oauth_* parameters
22
 
 
23
 
    Assumes the decorated method takes a params dict or list of tuples as its
24
 
    first argument.
25
 
    """
26
 
    def wrapper(params, *args, **kwargs):
27
 
        params = filter_oauth_params(params)
28
 
        return target(params, *args, **kwargs)
29
 
 
30
 
    wrapper.__doc__ = target.__doc__
31
 
    return wrapper
32
 
 
33
 
 
34
 
def filter_oauth_params(params):
35
 
    """Removes all non oauth parameters from a dict or a list of params."""
36
 
    is_oauth = lambda kv: kv[0].startswith(u"oauth_")
37
 
    if isinstance(params, dict):
38
 
        return filter(is_oauth, params.items())
39
 
    else:
40
 
        return filter(is_oauth, params)
41
 
 
42
 
 
43
 
def escape(u):
44
 
    """Escape a unicode string in an OAuth-compatible fashion.
45
 
 
46
 
    Per `section 3.6`_ of the spec.
47
 
 
48
 
    .. _`section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6
49
 
 
50
 
    """
51
 
    if not isinstance(u, unicode):
52
 
        raise ValueError('Only unicode objects are escapable.')
53
 
    # Letters, digits, and the characters '_.-' are already treated as safe
54
 
    # by urllib.quote(). We need to add '~' to fully support rfc5849.
55
 
    return quote(u, safe='~')
56
 
 
57
 
 
58
 
def unescape(u):
59
 
    if not isinstance(u, unicode):
60
 
        raise ValueError('Only unicode objects are unescapable.')
61
 
    return unquote(u)
62
 
 
63
 
 
64
 
def urlencode(query):
65
 
    """Encode a sequence of two-element tuples or dictionary into a URL query string.
66
 
 
67
 
    Operates using an OAuth-safe escape() method, in contrast to urllib.urlencode.
68
 
    """
69
 
    # Convert dictionaries to list of tuples
70
 
    if isinstance(query, dict):
71
 
        query = query.items()
72
 
    return u"&".join([u'='.join([escape(k), escape(v)]) for k, v in query])
73
 
 
74
 
 
75
 
def parse_keqv_list(l):
76
 
    """A unicode-safe version of urllib2.parse_keqv_list"""
77
 
    encoded_list = [u.encode('utf-8') for u in l]
78
 
    encoded_parsed = urllib2.parse_keqv_list(encoded_list)
79
 
    return dict((k.decode('utf-8'),
80
 
        v.decode('utf-8')) for k, v in encoded_parsed.items())
81
 
 
82
 
 
83
 
def parse_http_list(u):
84
 
    """A unicode-safe version of urllib2.parse_http_list"""
85
 
    encoded_str = u.encode('utf-8')
86
 
    encoded_list = urllib2.parse_http_list(encoded_str)
87
 
    return [s.decode('utf-8') for s in encoded_list]
88
 
 
89
 
 
90
 
def parse_authorization_header(authorization_header):
91
 
    """Parse an OAuth authorization header into a list of 2-tuples"""
92
 
    auth_scheme = u'OAuth '
93
 
    if authorization_header.startswith(auth_scheme):
94
 
        authorization_header = authorization_header.replace(auth_scheme, u'', 1)
95
 
    items = parse_http_list(authorization_header)
96
 
    try:
97
 
        return parse_keqv_list(items).items()
98
 
    except ValueError:
99
 
        raise ValueError('Malformed authorization header')