| # 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) |