blob: 2c0786f8ec5ee16fbee9723930e647c802b07923 [file] [log] [blame]
# Copyright (C) 2010 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import httplib2
import oauth2 as oauth
import simplejson
def oauth_wrap(consumer, token, http):
"""
Args:
http - An instance of httplib2.Http
or something that acts like it.
Returns:
A modified instance of http that was passed in.
Example:
h = httplib2.Http()
h = oauth_wrap(h)
Grumble. You can't create a new OAuth
subclass of httplib2.Authenication because
it never gets passed the absolute URI, which is
needed for signing. So instead we have to overload
'request' with a closure that adds in the
Authorization header and then calls the original version
of 'request().
"""
request_orig = http.request
signer = oauth.SignatureMethod_HMAC_SHA1()
def new_request(uri, method='GET', body=None, headers=None,
redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None):
"""Modify the request headers to add the appropriate
Authorization header."""
req = oauth.Request.from_consumer_and_token(
consumer, token, http_method=method, http_url=uri)
req.sign_request(signer, consumer, token)
if headers == None:
headers = {}
headers.update(req.to_header())
headers['user-agent'] = 'jcgregorio-test-client'
return request_orig(uri, method, body, headers, redirections,
connection_type)
http.request = new_request
return http
def get_authorised_http(oauth_params):
consumer = oauth.Consumer(oauth_params['consumer_key'],
oauth_params['consumer_secret'])
token = oauth.Token(oauth_params['oauth_token'],
oauth_params['oauth_token_secret'])
# Create a simple monkeypatch for httplib2.Http.request
# just adds in the oauth authorization header and then calls
# the original request().
http = httplib2.Http()
return oauth_wrap(consumer, token, http)
def get_wrapped_http(filename='oauth_token.dat'):
f = open(filename, 'r')
oauth_params = simplejson.loads(f.read())
return get_authorised_http(oauth_params)