diff options
| author | Steve Pulec <spulec@gmail.com> | 2013-02-13 23:10:07 -0500 |
|---|---|---|
| committer | Steve Pulec <spulec@gmail.com> | 2013-02-13 23:10:07 -0500 |
| commit | 5dd66a05362f6fdf2a2fdef2c49d63bc1ffa75ba (patch) | |
| tree | 47044cdc686f3eed7383b1bbbd12a3101cca1ba3 /httpretty | |
| parent | 751557dd46a38b1e59e0ccd22e156a37ff6b9038 (diff) | |
| download | httpretty-5dd66a05362f6fdf2a2fdef2c49d63bc1ffa75ba.tar.gz | |
py3k support
Diffstat (limited to 'httpretty')
| -rw-r--r-- | httpretty/__init__.py | 77 |
1 files changed, 53 insertions, 24 deletions
diff --git a/httpretty/__init__.py b/httpretty/__init__.py index 5ed9fdf..d7d08e6 100644 --- a/httpretty/__init__.py +++ b/httpretty/__init__.py @@ -31,14 +31,40 @@ import functools import itertools import warnings import logging +import sys import traceback +PY3 = sys.version_info[0] == 3 +if PY3: + text_type = str + binary_type = bytes + import io + StringIO = io.StringIO + + class Compat_Repr(object): + def __repr__(self): + return self.__unicode__() +else: + text_type = unicode + binary_type = str + import StringIO + StringIO = StringIO.StringIO + + class Compat_Repr(object): + def __repr__(self): + return self.__unicode__().encode('utf-8') + from datetime import datetime from datetime import timedelta -from StringIO import StringIO -from urlparse import urlsplit +try: + from urllib.parse import urlsplit +except ImportError: + from urlparse import urlsplit -from BaseHTTPServer import BaseHTTPRequestHandler +try: + from http.server import BaseHTTPRequestHandler +except ImportError: + from BaseHTTPServer import BaseHTTPRequestHandler old_socket = socket.socket old_create_connection = socket.create_connection @@ -59,7 +85,8 @@ except ImportError: try: import ssl old_ssl_wrap_socket = ssl.wrap_socket - old_sslwrap_simple = ssl.sslwrap_simple + if not PY3: + old_sslwrap_simple = ssl.sslwrap_simple old_sslsocket = ssl.SSLSocket except ImportError: ssl = None @@ -70,10 +97,10 @@ class HTTPrettyError(Exception): def utf8(s): - if isinstance(s, unicode): + if isinstance(s, text_type): s = s.encode('utf-8') - return str(s) + return binary_type(s) def parse_requestline(s): @@ -97,7 +124,7 @@ def parse_requestline(s): raise ValueError('Not a Request-Line') -class HTTPrettyRequest(BaseHTTPRequestHandler, object): +class HTTPrettyRequest(BaseHTTPRequestHandler, Compat_Repr, object): def __init__(self, headers, body=''): self.body = utf8(body) self.raw_headers = utf8(headers) @@ -107,7 +134,7 @@ class HTTPrettyRequest(BaseHTTPRequestHandler, object): self.parse_request() self.method = self.command - def __repr__(self): + def __unicode__(self): return 'HTTPrettyRequest(headers={0}, body="{1}")'.format( self.headers, self.body, @@ -229,6 +256,7 @@ class fakesock(object): hostnames = [i.hostname for i in HTTPretty._entries.keys()] self.fd.seek(0) try: + print("data", data) requestline, _ = data.split('\r\n', 1) method, path, version = parse_requestline(requestline) is_parsing_headers = True @@ -244,7 +272,7 @@ class fakesock(object): try: return HTTPretty.historify_request(headers, body, False) - except Exception, e: + except Exception as e: logging.error(traceback.format_exc(e)) return self._true_sendall(data, *args, **kw) @@ -390,7 +418,7 @@ STATUSES = { } -class Entry(object): +class Entry(Compat_Repr, object): def __init__(self, method, uri, body, adding_headers=None, forcing_headers=None, @@ -443,7 +471,7 @@ class Entry(object): ) ) - def __repr__(self): + def __unicode__(self): return r'<Entry %s %s getting %d>' % ( self.method, self.uri, self.status) @@ -511,7 +539,7 @@ class Entry(object): fk.seek(0) -class URIInfo(object): +class URIInfo(Compat_Repr, object): def __init__(self, username='', password='', @@ -564,16 +592,13 @@ class URIInfo(object): 'path', ) fmt = ", ".join(['%s="%s"' % (k, getattr(self, k, '')) for k in attrs]) - return ur'<httpretty.URIInfo(%s)>' % fmt - - def __repr__(self): - return unicode(self) + return r'<httpretty.URIInfo(%s)>' % fmt def __hash__(self): - return hash(unicode(self)) + return hash(text_type(self)) def __eq__(self, other): - return unicode(self) == unicode(other) + return text_type(self) == text_type(other) @classmethod def from_uri(cls, uri, entry): @@ -589,7 +614,7 @@ class URIInfo(object): entry) -class HTTPretty(object): +class HTTPretty(Compat_Repr, object): u"""The URI registration class""" _entries = {} latest_requests = [] @@ -646,7 +671,7 @@ class HTTPretty(object): cls._entries[info] = entries_for_this_uri - def __repr__(self): + def __unicode__(self): return u'<HTTPretty with %d URI entries>' % len(self._entries) @classmethod @@ -688,12 +713,14 @@ class HTTPretty(object): if ssl: ssl.wrap_socket = old_ssl_wrap_socket - ssl.sslwrap_simple = old_sslwrap_simple ssl.SSLSocket = old_sslsocket ssl.__dict__['wrap_socket'] = old_ssl_wrap_socket - ssl.__dict__['sslwrap_simple'] = old_sslwrap_simple ssl.__dict__['SSLSocket'] = old_sslsocket + if not PY3: + ssl.sslwrap_simple = old_sslwrap_simple + ssl.__dict__['sslwrap_simple'] = old_sslwrap_simple + @classmethod def enable(cls): socket.socket = fakesock.socket @@ -722,13 +749,15 @@ class HTTPretty(object): if ssl: ssl.wrap_socket = fake_wrap_socket - ssl.sslwrap_simple = fake_wrap_socket ssl.SSLSocket = FakeSSLSocket ssl.__dict__['wrap_socket'] = fake_wrap_socket - ssl.__dict__['sslwrap_simple'] = fake_wrap_socket ssl.__dict__['SSLSocket'] = FakeSSLSocket + if not PY3: + ssl.sslwrap_simple = fake_wrap_socket + ssl.__dict__['sslwrap_simple'] = fake_wrap_socket + def httprettified(test): "A decorator tests that use HTTPretty" |
