@@ -95,7 +95,7 @@ def get_authenticated_user(self, callback, http_client=None):
95
95
args ["openid.mode" ] = u"check_authentication"
96
96
url = self ._OPENID_ENDPOINT
97
97
if http_client is None :
98
- http_client = httpclient . AsyncHTTPClient ()
98
+ http_client = self . get_auth_http_client ()
99
99
http_client .fetch (url , self .async_callback (
100
100
self ._on_authentication_verified , callback ),
101
101
method = "POST" , body = urllib .urlencode (args ))
@@ -208,6 +208,14 @@ def get_ax_arg(uri):
208
208
user ["claimed_id" ] = claimed_id
209
209
callback (user )
210
210
211
+ def get_auth_http_client (self ):
212
+ """Returns the AsyncHTTPClient instance to be used for auth requests.
213
+
214
+ May be overridden by subclasses to use an http client other than
215
+ the default.
216
+ """
217
+ return httpclient .AsyncHTTPClient ()
218
+
211
219
212
220
class OAuthMixin (object ):
213
221
"""Abstract implementation of OAuth.
@@ -232,7 +240,7 @@ def authorize_redirect(self, callback_uri=None, extra_params=None,
232
240
if callback_uri and getattr (self , "_OAUTH_NO_CALLBACKS" , False ):
233
241
raise Exception ("This service does not support oauth_callback" )
234
242
if http_client is None :
235
- http_client = httpclient . AsyncHTTPClient ()
243
+ http_client = self . get_auth_http_client ()
236
244
if getattr (self , "_OAUTH_VERSION" , "1.0a" ) == "1.0a" :
237
245
http_client .fetch (
238
246
self ._oauth_request_token_url (callback_uri = callback_uri ,
@@ -277,7 +285,7 @@ def get_authenticated_user(self, callback, http_client=None):
277
285
if oauth_verifier :
278
286
token ["verifier" ] = oauth_verifier
279
287
if http_client is None :
280
- http_client = httpclient . AsyncHTTPClient ()
288
+ http_client = self . get_auth_http_client ()
281
289
http_client .fetch (self ._oauth_access_token_url (token ),
282
290
self .async_callback (self ._on_access_token , callback ))
283
291
@@ -394,6 +402,14 @@ def _oauth_request_parameters(self, url, access_token, parameters={},
394
402
base_args ["oauth_signature" ] = signature
395
403
return base_args
396
404
405
+ def get_auth_http_client (self ):
406
+ """Returns the AsyncHTTPClient instance to be used for auth requests.
407
+
408
+ May be overridden by subclasses to use an http client other than
409
+ the default.
410
+ """
411
+ return httpclient .AsyncHTTPClient ()
412
+
397
413
398
414
class OAuth2Mixin (object ):
399
415
"""Abstract implementation of OAuth v 2."""
@@ -471,14 +487,15 @@ def _on_auth(self, user):
471
487
_OAUTH_AUTHORIZE_URL = "http://api.twitter.com/oauth/authorize"
472
488
_OAUTH_AUTHENTICATE_URL = "http://api.twitter.com/oauth/authenticate"
473
489
_OAUTH_NO_CALLBACKS = False
490
+ _TWITTER_BASE_URL = "http://api.twitter.com/1"
474
491
475
492
def authenticate_redirect (self , callback_uri = None ):
476
493
"""Just like authorize_redirect(), but auto-redirects if authorized.
477
494
478
495
This is generally the right interface to use if you are using
479
496
Twitter for single-sign on.
480
497
"""
481
- http = httpclient . AsyncHTTPClient ()
498
+ http = self . get_auth_http_client ()
482
499
http .fetch (self ._oauth_request_token_url (callback_uri = callback_uri ), self .async_callback (
483
500
self ._on_request_token , self ._OAUTH_AUTHENTICATE_URL , None ))
484
501
@@ -525,7 +542,7 @@ def _on_post(self, new_entry):
525
542
# usual pattern: http://search.twitter.com/search.json
526
543
url = path
527
544
else :
528
- url = "http://api.twitter.com/1" + path + ".json"
545
+ url = self . _TWITTER_BASE_URL + path + ".json"
529
546
# Add the OAuth resource request signature if we have credentials
530
547
if access_token :
531
548
all_args = {}
@@ -538,7 +555,7 @@ def _on_post(self, new_entry):
538
555
if args :
539
556
url += "?" + urllib .urlencode (args )
540
557
callback = self .async_callback (self ._on_twitter_request , callback )
541
- http = httpclient . AsyncHTTPClient ()
558
+ http = self . get_auth_http_client ()
542
559
if post_args is not None :
543
560
http .fetch (url , method = "POST" , body = urllib .urlencode (post_args ),
544
561
callback = callback )
@@ -563,7 +580,7 @@ def _oauth_consumer_token(self):
563
580
def _oauth_get_user (self , access_token , callback ):
564
581
callback = self .async_callback (self ._parse_user_response , callback )
565
582
self .twitter_request (
566
- "/users/show/" + access_token ["screen_name" ] ,
583
+ "/users/show/" + escape . native_str ( access_token [b ( "screen_name" )]) ,
567
584
access_token = access_token , callback = callback )
568
585
569
586
def _parse_user_response (self , callback , user ):
@@ -660,7 +677,7 @@ def _on_post(self, new_entry):
660
677
if args :
661
678
url += "?" + urllib .urlencode (args )
662
679
callback = self .async_callback (self ._on_friendfeed_request , callback )
663
- http = httpclient . AsyncHTTPClient ()
680
+ http = self . get_auth_http_client ()
664
681
if post_args is not None :
665
682
http .fetch (url , method = "POST" , body = urllib .urlencode (post_args ),
666
683
callback = callback )
@@ -751,7 +768,7 @@ def get_authenticated_user(self, callback):
751
768
break
752
769
token = self .get_argument ("openid." + oauth_ns + ".request_token" , "" )
753
770
if token :
754
- http = httpclient . AsyncHTTPClient ()
771
+ http = self . get_auth_http_client ()
755
772
token = dict (key = token , secret = "" )
756
773
http .fetch (self ._oauth_access_token_url (token ),
757
774
self .async_callback (self ._on_access_token , callback ))
@@ -907,7 +924,7 @@ def _on_stream(self, stream):
907
924
args ["sig" ] = self ._signature (args )
908
925
url = "http://api.facebook.com/restserver.php?" + \
909
926
urllib .urlencode (args )
910
- http = httpclient . AsyncHTTPClient ()
927
+ http = self . get_auth_http_client ()
911
928
http .fetch (url , callback = self .async_callback (
912
929
self ._parse_response , callback ))
913
930
@@ -953,6 +970,14 @@ def _signature(self, args):
953
970
body = body .encode ("utf-8" )
954
971
return hashlib .md5 (body ).hexdigest ()
955
972
973
+ def get_auth_http_client (self ):
974
+ """Returns the AsyncHTTPClient instance to be used for auth requests.
975
+
976
+ May be overridden by subclasses to use an http client other than
977
+ the default.
978
+ """
979
+ return httpclient .AsyncHTTPClient ()
980
+
956
981
957
982
class FacebookGraphMixin (OAuth2Mixin ):
958
983
"""Facebook authentication using the new Graph API and OAuth2."""
@@ -987,7 +1012,7 @@ def _on_login(self, user):
987
1012
self.finish()
988
1013
989
1014
"""
990
- http = httpclient . AsyncHTTPClient ()
1015
+ http = self . get_auth_http_client ()
991
1016
args = {
992
1017
"redirect_uri" : redirect_uri ,
993
1018
"code" : code ,
@@ -1081,7 +1106,7 @@ def _on_post(self, new_entry):
1081
1106
if all_args :
1082
1107
url += "?" + urllib .urlencode (all_args )
1083
1108
callback = self .async_callback (self ._on_facebook_request , callback )
1084
- http = httpclient . AsyncHTTPClient ()
1109
+ http = self . get_auth_http_client ()
1085
1110
if post_args is not None :
1086
1111
http .fetch (url , method = "POST" , body = urllib .urlencode (post_args ),
1087
1112
callback = callback )
@@ -1096,6 +1121,14 @@ def _on_facebook_request(self, callback, response):
1096
1121
return
1097
1122
callback (escape .json_decode (response .body ))
1098
1123
1124
+ def get_auth_http_client (self ):
1125
+ """Returns the AsyncHTTPClient instance to be used for auth requests.
1126
+
1127
+ May be overridden by subclasses to use an http client other than
1128
+ the default.
1129
+ """
1130
+ return httpclient .AsyncHTTPClient ()
1131
+
1099
1132
1100
1133
def _oauth_signature (consumer_token , method , url , parameters = {}, token = None ):
1101
1134
"""Calculates the HMAC-SHA1 OAuth signature for the given request.
0 commit comments