30
30
import binascii
31
31
import httplib2
32
32
33
+ from ._compat import PY3
34
+ from ._compat import parse_qs
33
35
from ._compat import quote
34
36
from ._compat import STRING_TYPES
35
37
from ._compat import TEXT
38
40
from ._compat import urlencode
39
41
from ._compat import urlparse
40
42
from ._compat import urlunparse
41
- from ._compat import parse_qs
42
43
from ._version import __version__
43
44
44
45
OAUTH_VERSION = '1.0' # Hi Blaine!
@@ -154,7 +155,9 @@ def to_utf8_optional_iterator(x):
154
155
155
156
def escape (s ):
156
157
"""Escape a URL including any /."""
157
- return quote (s .encode ('utf-8' ), safe = '~' )
158
+ if not isinstance (s , bytes ):
159
+ s = s .encode ('utf-8' )
160
+ return quote (s , safe = '~' )
158
161
159
162
def generate_timestamp ():
160
163
"""Get seconds since epoch (UTC)."""
@@ -339,7 +342,7 @@ class Request(dict):
339
342
version = OAUTH_VERSION
340
343
341
344
def __init__ (self , method = HTTP_METHOD , url = None , parameters = None ,
342
- body = '' , is_form_encoded = False ):
345
+ body = b '' , is_form_encoded = False ):
343
346
if url is not None :
344
347
self .url = to_unicode (url )
345
348
self .method = method
@@ -555,7 +558,7 @@ def from_request(cls, http_method, http_url, headers=None, parameters=None,
555
558
@classmethod
556
559
def from_consumer_and_token (cls , consumer , token = None ,
557
560
http_method = HTTP_METHOD , http_url = None , parameters = None ,
558
- body = '' , is_form_encoded = False ):
561
+ body = b '' , is_form_encoded = False ):
559
562
if not parameters :
560
563
parameters = {}
561
564
@@ -611,7 +614,9 @@ def _split_header(header):
611
614
@staticmethod
612
615
def _split_url_string (param_str ):
613
616
"""Turn URL string into parameters."""
614
- parameters = parse_qs (param_str .encode ('utf-8' ),
617
+ #XXX parse_qs is leaving the encoded bytes after un-escaping
618
+ #parameters = parse_qs(param_str.encode('utf-8'),
619
+ parameters = parse_qs (param_str ,
615
620
keep_blank_values = True )
616
621
for k , v in parameters .items ():
617
622
parameters [k ] = unquote_to_bytes (v [0 ])
@@ -643,7 +648,7 @@ def set_signature_method(self, method):
643
648
644
649
self .method = method
645
650
646
- def request (self , uri , method = "GET" , body = '' , headers = None ,
651
+ def request (self , uri , method = "GET" , body = b '' , headers = None ,
647
652
redirections = httplib2 .DEFAULT_MAX_REDIRECTS , connection_type = None ):
648
653
DEFAULT_POST_CONTENT_TYPE = 'application/x-www-form-urlencoded'
649
654
@@ -828,7 +833,7 @@ def signing_base(self, request, consumer, token):
828
833
if token :
829
834
key += escape (token .secret )
830
835
raw = '&' .join (sig )
831
- return key , raw
836
+ return key . encode ( 'ascii' ) , raw . encode ( 'ascii' )
832
837
833
838
def sign (self , request , consumer , token ):
834
839
"""Builds the base signature string."""
@@ -854,4 +859,4 @@ def signing_base(self, request, consumer, token):
854
859
855
860
def sign (self , request , consumer , token ):
856
861
key , raw = self .signing_base (request , consumer , token )
857
- return raw
862
+ return raw . encode ( 'utf8' )
0 commit comments