Created
May 18, 2014 21:50
-
-
Save maryokhin/0da5e697f0d09fa7eea4 to your computer and use it in GitHub Desktop.
Here it throws an error due to oauth_consumer_key being 'None'
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from __future__ import absolute_import, unicode_literals | |
""" | |
oauthlib.parameters | |
~~~~~~~~~~~~~~~~~~~ | |
This module contains methods related to `section 3.5`_ of the OAuth 1.0a spec. | |
.. _`section 3.5`: http://tools.ietf.org/html/rfc5849#section-3.5 | |
""" | |
try: | |
from urlparse import urlparse, urlunparse | |
except ImportError: | |
from urllib.parse import urlparse, urlunparse | |
from . import utils | |
from oauthlib.common import extract_params, urlencode | |
# TODO: do we need filter_params now that oauth_params are handled by Request? | |
# We can easily pass in just oauth protocol params. | |
@utils.filter_params | |
def prepare_headers(oauth_params, headers=None, realm=None): | |
"""**Prepare the Authorization header.** | |
Per `section 3.5.1`_ of the spec. | |
Protocol parameters can be transmitted using the HTTP "Authorization" | |
header field as defined by `RFC2617`_ with the auth-scheme name set to | |
"OAuth" (case insensitive). | |
For example:: | |
Authorization: OAuth realm="Example", | |
oauth_consumer_key="0685bd9184jfhq22", | |
oauth_token="ad180jjd733klru7", | |
oauth_signature_method="HMAC-SHA1", | |
oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D", | |
oauth_timestamp="137131200", | |
oauth_nonce="4572616e48616d6d65724c61686176", | |
oauth_version="1.0" | |
.. _`section 3.5.1`: http://tools.ietf.org/html/rfc5849#section-3.5.1 | |
.. _`RFC2617`: http://tools.ietf.org/html/rfc2617 | |
""" | |
headers = headers or {} | |
# Protocol parameters SHALL be included in the "Authorization" header | |
# field as follows: | |
authorization_header_parameters_parts = [] | |
for oauth_parameter_name, value in oauth_params: | |
# 1. Parameter names and values are encoded per Parameter Encoding | |
# (`Section 3.6`_) | |
# | |
# .. _`Section 3.6`: http://tools.ietf.org/html/rfc5849#section-3.6 | |
escaped_name = utils.escape(oauth_parameter_name) | |
escaped_value = utils.escape(value) | |
# 2. Each parameter's name is immediately followed by an "=" character | |
# (ASCII code 61), a """ character (ASCII code 34), the parameter | |
# value (MAY be empty), and another """ character (ASCII code 34). | |
part = '{0}="{1}"'.format(escaped_name, escaped_value) | |
authorization_header_parameters_parts.append(part) | |
# 3. Parameters are separated by a "," character (ASCII code 44) and | |
# OPTIONAL linear whitespace per `RFC2617`_. | |
# | |
# .. _`RFC2617`: http://tools.ietf.org/html/rfc2617 | |
authorization_header_parameters = ', '.join( | |
authorization_header_parameters_parts) | |
# 4. The OPTIONAL "realm" parameter MAY be added and interpreted per | |
# `RFC2617 section 1.2`_. | |
# | |
# .. _`RFC2617 section 1.2`: http://tools.ietf.org/html/rfc2617#section-1.2 | |
if realm: | |
# NOTE: realm should *not* be escaped | |
authorization_header_parameters = ('realm="%s", ' % realm + | |
authorization_header_parameters) | |
# the auth-scheme name set to "OAuth" (case insensitive). | |
authorization_header = 'OAuth %s' % authorization_header_parameters | |
# contribute the Authorization header to the given headers | |
full_headers = {} | |
full_headers.update(headers) | |
full_headers['Authorization'] = authorization_header | |
return full_headers | |
def _append_params(oauth_params, params): | |
"""Append OAuth params to an existing set of parameters. | |
Both params and oauth_params is must be lists of 2-tuples. | |
Per `section 3.5.2`_ and `3.5.3`_ of the spec. | |
.. _`section 3.5.2`: http://tools.ietf.org/html/rfc5849#section-3.5.2 | |
.. _`3.5.3`: http://tools.ietf.org/html/rfc5849#section-3.5.3 | |
""" | |
merged = list(params) | |
merged.extend(oauth_params) | |
# The request URI / entity-body MAY include other request-specific | |
# parameters, in which case, the protocol parameters SHOULD be appended | |
# following the request-specific parameters, properly separated by an "&" | |
# character (ASCII code 38) | |
merged.sort(key=lambda i: i[0].startswith('oauth_')) | |
return merged | |
def prepare_form_encoded_body(oauth_params, body): | |
"""Prepare the Form-Encoded Body. | |
Per `section 3.5.2`_ of the spec. | |
.. _`section 3.5.2`: http://tools.ietf.org/html/rfc5849#section-3.5.2 | |
""" | |
# append OAuth params to the existing body | |
return _append_params(oauth_params, body) | |
def prepare_request_uri_query(oauth_params, uri): | |
"""Prepare the Request URI Query. | |
Per `section 3.5.3`_ of the spec. | |
.. _`section 3.5.3`: http://tools.ietf.org/html/rfc5849#section-3.5.3 | |
""" | |
# append OAuth params to the existing set of query components | |
sch, net, path, par, query, fra = urlparse(uri) | |
query = urlencode(_append_params(oauth_params, extract_params(query) or [])) | |
return urlunparse((sch, net, path, par, query, fra)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment