aboutsummaryrefslogtreecommitdiffstats
path: root/netlib
diff options
context:
space:
mode:
Diffstat (limited to 'netlib')
-rw-r--r--netlib/certutils.py75
-rw-r--r--netlib/h2/frame.py127
-rw-r--r--netlib/h2/h2.py8
-rw-r--r--netlib/http.py3
-rw-r--r--netlib/http_uastrings.py91
-rw-r--r--netlib/tcp.py42
-rw-r--r--netlib/test.py4
-rw-r--r--netlib/wsgi.py3
8 files changed, 236 insertions, 117 deletions
diff --git a/netlib/certutils.py b/netlib/certutils.py
index abf1a28b..ade61bb5 100644
--- a/netlib/certutils.py
+++ b/netlib/certutils.py
@@ -96,7 +96,8 @@ def dummy_cert(privkey, cacert, commonname, sans):
cert.set_serial_number(int(time.time() * 10000))
if ss:
cert.set_version(2)
- cert.add_extensions([OpenSSL.crypto.X509Extension("subjectAltName", False, ss)])
+ cert.add_extensions(
+ [OpenSSL.crypto.X509Extension("subjectAltName", False, ss)])
cert.set_pubkey(cacert.get_pubkey())
cert.sign(privkey, "sha256")
return SSLCert(cert)
@@ -156,7 +157,12 @@ class CertStore(object):
Implements an in-memory certificate store.
"""
- def __init__(self, default_privatekey, default_ca, default_chain_file, dhparams):
+ def __init__(
+ self,
+ default_privatekey,
+ default_ca,
+ default_chain_file,
+ dhparams):
self.default_privatekey = default_privatekey
self.default_ca = default_ca
self.default_chain_file = default_chain_file
@@ -176,8 +182,10 @@ class CertStore(object):
if bio != OpenSSL.SSL._ffi.NULL:
bio = OpenSSL.SSL._ffi.gc(bio, OpenSSL.SSL._lib.BIO_free)
dh = OpenSSL.SSL._lib.PEM_read_bio_DHparams(
- bio, OpenSSL.SSL._ffi.NULL, OpenSSL.SSL._ffi.NULL, OpenSSL.SSL._ffi.NULL
- )
+ bio,
+ OpenSSL.SSL._ffi.NULL,
+ OpenSSL.SSL._ffi.NULL,
+ OpenSSL.SSL._ffi.NULL)
dh = OpenSSL.SSL._ffi.gc(dh, OpenSSL.SSL._lib.DH_free)
return dh
@@ -189,8 +197,12 @@ class CertStore(object):
else:
with open(ca_path, "rb") as f:
raw = f.read()
- ca = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, raw)
- key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, raw)
+ ca = OpenSSL.crypto.load_certificate(
+ OpenSSL.crypto.FILETYPE_PEM,
+ raw)
+ key = OpenSSL.crypto.load_privatekey(
+ OpenSSL.crypto.FILETYPE_PEM,
+ raw)
dh_path = os.path.join(path, basename + "-dhparam.pem")
dh = cls.load_dhparam(dh_path)
return cls(key, ca, ca_path, dh)
@@ -206,16 +218,28 @@ class CertStore(object):
key, ca = create_ca(o=o, cn=cn, exp=expiry)
# Dump the CA plus private key
with open(os.path.join(path, basename + "-ca.pem"), "wb") as f:
- f.write(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, key))
- f.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, ca))
+ f.write(
+ OpenSSL.crypto.dump_privatekey(
+ OpenSSL.crypto.FILETYPE_PEM,
+ key))
+ f.write(
+ OpenSSL.crypto.dump_certificate(
+ OpenSSL.crypto.FILETYPE_PEM,
+ ca))
# Dump the certificate in PEM format
with open(os.path.join(path, basename + "-ca-cert.pem"), "wb") as f:
- f.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, ca))
+ f.write(
+ OpenSSL.crypto.dump_certificate(
+ OpenSSL.crypto.FILETYPE_PEM,
+ ca))
# Create a .cer file with the same contents for Android
with open(os.path.join(path, basename + "-ca-cert.cer"), "wb") as f:
- f.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, ca))
+ f.write(
+ OpenSSL.crypto.dump_certificate(
+ OpenSSL.crypto.FILETYPE_PEM,
+ ca))
# Dump the certificate in PKCS12 format for Windows devices
with open(os.path.join(path, basename + "-ca-cert.p12"), "wb") as f:
@@ -232,9 +256,14 @@ class CertStore(object):
def add_cert_file(self, spec, path):
with open(path, "rb") as f:
raw = f.read()
- cert = SSLCert(OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, raw))
+ cert = SSLCert(
+ OpenSSL.crypto.load_certificate(
+ OpenSSL.crypto.FILETYPE_PEM,
+ raw))
try:
- privatekey = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, raw)
+ privatekey = OpenSSL.crypto.load_privatekey(
+ OpenSSL.crypto.FILETYPE_PEM,
+ raw)
except Exception:
privatekey = self.default_privatekey
self.add_cert(
@@ -284,15 +313,22 @@ class CertStore(object):
potential_keys.extend(self.asterisk_forms(s))
potential_keys.append((commonname, tuple(sans)))
- name = next(itertools.ifilter(lambda key: key in self.certs, potential_keys), None)
+ name = next(
+ itertools.ifilter(
+ lambda key: key in self.certs,
+ potential_keys),
+ None)
if name:
entry = self.certs[name]
else:
entry = CertStoreEntry(
- cert=dummy_cert(self.default_privatekey, self.default_ca, commonname, sans),
+ cert=dummy_cert(
+ self.default_privatekey,
+ self.default_ca,
+ commonname,
+ sans),
privatekey=self.default_privatekey,
- chain_file=self.default_chain_file
- )
+ chain_file=self.default_chain_file)
self.certs[(commonname, tuple(sans))] = entry
return entry.cert, entry.privatekey, entry.chain_file
@@ -317,7 +353,8 @@ class _GeneralName(univ.Choice):
class _GeneralNames(univ.SequenceOf):
componentType = _GeneralName()
- sizeSpec = univ.SequenceOf.sizeSpec + constraint.ValueSizeConstraint(1, 1024)
+ sizeSpec = univ.SequenceOf.sizeSpec + \
+ constraint.ValueSizeConstraint(1, 1024)
class SSLCert(object):
@@ -345,7 +382,9 @@ class SSLCert(object):
return klass.from_pem(pem)
def to_pem(self):
- return OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, self.x509)
+ return OpenSSL.crypto.dump_certificate(
+ OpenSSL.crypto.FILETYPE_PEM,
+ self.x509)
def digest(self, name):
return self.x509.digest(name)
diff --git a/netlib/h2/frame.py b/netlib/h2/frame.py
index d4294052..36456c46 100644
--- a/netlib/h2/frame.py
+++ b/netlib/h2/frame.py
@@ -94,7 +94,13 @@ class DataFrame(Frame):
TYPE = 0x0
VALID_FLAGS = [Frame.FLAG_END_STREAM, Frame.FLAG_PADDED]
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, payload=b'', pad_length=0):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ payload=b'',
+ pad_length=0):
super(DataFrame, self).__init__(length, flags, stream_id)
self.payload = payload
self.pad_length = pad_length
@@ -132,9 +138,22 @@ class DataFrame(Frame):
class HeadersFrame(Frame):
TYPE = 0x1
- VALID_FLAGS = [Frame.FLAG_END_STREAM, Frame.FLAG_END_HEADERS, Frame.FLAG_PADDED, Frame.FLAG_PRIORITY]
-
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, headers=None, pad_length=0, exclusive=False, stream_dependency=0x0, weight=0):
+ VALID_FLAGS = [
+ Frame.FLAG_END_STREAM,
+ Frame.FLAG_END_HEADERS,
+ Frame.FLAG_PADDED,
+ Frame.FLAG_PRIORITY]
+
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ headers=None,
+ pad_length=0,
+ exclusive=False,
+ stream_dependency=0x0,
+ weight=0):
super(HeadersFrame, self).__init__(length, flags, stream_id)
if headers is None:
@@ -157,7 +176,9 @@ class HeadersFrame(Frame):
header_block_fragment = payload[0:]
if f.flags & self.FLAG_PRIORITY:
- f.stream_dependency, f.weight = struct.unpack('!LB', header_block_fragment[:5])
+ f.stream_dependency, f.weight = struct.unpack(
+ '!LB', header_block_fragment[
+ :5])
f.exclusive = bool(f.stream_dependency >> 31)
f.stream_dependency &= 0x7FFFFFFF
header_block_fragment = header_block_fragment[5:]
@@ -176,7 +197,9 @@ class HeadersFrame(Frame):
b += struct.pack('!B', self.pad_length)
if self.flags & self.FLAG_PRIORITY:
- b += struct.pack('!LB', (int(self.exclusive) << 31) | self.stream_dependency, self.weight)
+ b += struct.pack('!LB',
+ (int(self.exclusive) << 31) | self.stream_dependency,
+ self.weight)
b += Encoder().encode(self.headers)
@@ -209,7 +232,14 @@ class PriorityFrame(Frame):
TYPE = 0x2
VALID_FLAGS = []
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, exclusive=False, stream_dependency=0x0, weight=0):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ exclusive=False,
+ stream_dependency=0x0,
+ weight=0):
super(PriorityFrame, self).__init__(length, flags, stream_id)
self.exclusive = exclusive
self.stream_dependency = stream_dependency
@@ -227,12 +257,17 @@ class PriorityFrame(Frame):
def payload_bytes(self):
if self.stream_id == 0x0:
- raise ValueError('PRIORITY frames MUST be associated with a stream.')
+ raise ValueError(
+ 'PRIORITY frames MUST be associated with a stream.')
if self.stream_dependency == 0x0:
raise ValueError('stream dependency is invalid.')
- return struct.pack('!LB', (int(self.exclusive) << 31) | self.stream_dependency, self.weight)
+ return struct.pack(
+ '!LB',
+ (int(
+ self.exclusive) << 31) | self.stream_dependency,
+ self.weight)
def payload_human_readable(self):
s = []
@@ -246,7 +281,12 @@ class RstStreamFrame(Frame):
TYPE = 0x3
VALID_FLAGS = []
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, error_code=0x0):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ error_code=0x0):
super(RstStreamFrame, self).__init__(length, flags, stream_id)
self.error_code = error_code
@@ -258,7 +298,8 @@ class RstStreamFrame(Frame):
def payload_bytes(self):
if self.stream_id == 0x0:
- raise ValueError('RST_STREAM frames MUST be associated with a stream.')
+ raise ValueError(
+ 'RST_STREAM frames MUST be associated with a stream.')
return struct.pack('!L', self.error_code)
@@ -279,7 +320,12 @@ class SettingsFrame(Frame):
SETTINGS_MAX_HEADER_LIST_SIZE=0x6,
)
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, settings=None):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ settings=None):
super(SettingsFrame, self).__init__(length, flags, stream_id)
if settings is None:
@@ -299,7 +345,8 @@ class SettingsFrame(Frame):
def payload_bytes(self):
if self.stream_id != 0x0:
- raise ValueError('SETTINGS frames MUST NOT be associated with a stream.')
+ raise ValueError(
+ 'SETTINGS frames MUST NOT be associated with a stream.')
b = b''
for identifier, value in self.settings.items():
@@ -323,7 +370,14 @@ class PushPromiseFrame(Frame):
TYPE = 0x5
VALID_FLAGS = [Frame.FLAG_END_HEADERS, Frame.FLAG_PADDED]
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, promised_stream=0x0, header_block_fragment=b'', pad_length=0):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ promised_stream=0x0,
+ header_block_fragment=b'',
+ pad_length=0):
super(PushPromiseFrame, self).__init__(length, flags, stream_id)
self.pad_length = pad_length
self.promised_stream = promised_stream
@@ -346,7 +400,8 @@ class PushPromiseFrame(Frame):
def payload_bytes(self):
if self.stream_id == 0x0:
- raise ValueError('PUSH_PROMISE frames MUST be associated with a stream.')
+ raise ValueError(
+ 'PUSH_PROMISE frames MUST be associated with a stream.')
if self.promised_stream == 0x0:
raise ValueError('Promised stream id not valid.')
@@ -378,7 +433,12 @@ class PingFrame(Frame):
TYPE = 0x6
VALID_FLAGS = [Frame.FLAG_ACK]
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, payload=b''):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ payload=b''):
super(PingFrame, self).__init__(length, flags, stream_id)
self.payload = payload
@@ -390,7 +450,8 @@ class PingFrame(Frame):
def payload_bytes(self):
if self.stream_id != 0x0:
- raise ValueError('PING frames MUST NOT be associated with a stream.')
+ raise ValueError(
+ 'PING frames MUST NOT be associated with a stream.')
b = self.payload[0:8]
b += b'\0' * (8 - len(b))
@@ -404,7 +465,14 @@ class GoAwayFrame(Frame):
TYPE = 0x7
VALID_FLAGS = []
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, last_stream=0x0, error_code=0x0, data=b''):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ last_stream=0x0,
+ error_code=0x0,
+ data=b''):
super(GoAwayFrame, self).__init__(length, flags, stream_id)
self.last_stream = last_stream
self.error_code = error_code
@@ -422,7 +490,8 @@ class GoAwayFrame(Frame):
def payload_bytes(self):
if self.stream_id != 0x0:
- raise ValueError('GOAWAY frames MUST NOT be associated with a stream.')
+ raise ValueError(
+ 'GOAWAY frames MUST NOT be associated with a stream.')
b = struct.pack('!LL', self.last_stream & 0x7FFFFFFF, self.error_code)
b += bytes(self.data)
@@ -440,7 +509,12 @@ class WindowUpdateFrame(Frame):
TYPE = 0x8
VALID_FLAGS = []
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, window_size_increment=0x0):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ window_size_increment=0x0):
super(WindowUpdateFrame, self).__init__(length, flags, stream_id)
self.window_size_increment = window_size_increment
@@ -455,7 +529,8 @@ class WindowUpdateFrame(Frame):
def payload_bytes(self):
if self.window_size_increment <= 0 or self.window_size_increment >= 2 ** 31:
- raise ValueError('Window Szie Increment MUST be greater than 0 and less than 2^31.')
+ raise ValueError(
+ 'Window Szie Increment MUST be greater than 0 and less than 2^31.')
return struct.pack('!L', self.window_size_increment & 0x7FFFFFFF)
@@ -467,7 +542,12 @@ class ContinuationFrame(Frame):
TYPE = 0x9
VALID_FLAGS = [Frame.FLAG_END_HEADERS]
- def __init__(self, length=0, flags=Frame.FLAG_NO_FLAGS, stream_id=0x0, header_block_fragment=b''):
+ def __init__(
+ self,
+ length=0,
+ flags=Frame.FLAG_NO_FLAGS,
+ stream_id=0x0,
+ header_block_fragment=b''):
super(ContinuationFrame, self).__init__(length, flags, stream_id)
self.header_block_fragment = header_block_fragment
@@ -479,7 +559,8 @@ class ContinuationFrame(Frame):
def payload_bytes(self):
if self.stream_id == 0x0:
- raise ValueError('CONTINUATION frames MUST be associated with a stream.')
+ raise ValueError(
+ 'CONTINUATION frames MUST be associated with a stream.')
return self.header_block_fragment
diff --git a/netlib/h2/h2.py b/netlib/h2/h2.py
index bfe5832b..707b1465 100644
--- a/netlib/h2/h2.py
+++ b/netlib/h2/h2.py
@@ -44,7 +44,9 @@ class H2Client(tcp.TCPClient):
alp = self.get_alpn_proto_negotiated()
if alp != b'h2':
- raise NotImplementedError("H2Client can not handle unknown protocol: %s" % alp)
+ raise NotImplementedError(
+ "H2Client can not handle unknown protocol: %s" %
+ alp)
print "-> Successfully negotiated 'h2' application layer protocol."
if send_preface:
@@ -79,7 +81,9 @@ class H2Client(tcp.TCPClient):
self.settings[setting] = value
print "-> Setting changed: %s to %d (was %s)" %
- (SettingsFrame.SETTINGS.get_name(setting), value, str(old_value))
+ (SettingsFrame.SETTINGS.get_name(setting),
+ value,
+ str(old_value))
self.send_frame(SettingsFrame(flags=Frame.FLAG_ACK))
print "-> New settings acknowledged."
diff --git a/netlib/http.py b/netlib/http.py
index 47658097..a2af9e49 100644
--- a/netlib/http.py
+++ b/netlib/http.py
@@ -124,7 +124,8 @@ def read_chunked(fp, limit, is_request):
May raise HttpError.
"""
# FIXME: Should check if chunked is the final encoding in the headers
- # http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-16#section-3.3 3.3 2.
+ # http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-16#section-3.3
+ # 3.3 2.
total = 0
code = 400 if is_request else 502
while True:
diff --git a/netlib/http_uastrings.py b/netlib/http_uastrings.py
index d0d145da..d9869531 100644
--- a/netlib/http_uastrings.py
+++ b/netlib/http_uastrings.py
@@ -8,66 +8,37 @@ from __future__ import (absolute_import, print_function, division)
# A collection of (name, shortcut, string) tuples.
UASTRINGS = [
- (
- "android",
- "a",
- "Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Nexus 7 Build/JRO03D) AFL/01.04.02"
- ),
-
- (
- "blackberry",
- "l",
- "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+"
- ),
-
- (
- "bingbot",
- "b",
- "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
- ),
-
- (
- "chrome",
- "c",
- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
- ),
-
- (
- "firefox",
- "f",
- "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1"
- ),
-
- (
- "googlebot",
- "g",
- "Googlebot/2.1 (+http://www.googlebot.com/bot.html)"
- ),
-
- (
- "ie9",
- "i",
- "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))"
- ),
-
- (
- "ipad",
- "p",
- "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3"
- ),
-
- (
- "iphone",
- "h",
- "Mozilla/5.0 (iPhone; CPU iPhone OS 4_2_1 like Mac OS X) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5",
- ),
-
- (
- "safari",
- "s",
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10"
- )
-]
+ ("android",
+ "a",
+ "Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Nexus 7 Build/JRO03D) AFL/01.04.02"),
+ ("blackberry",
+ "l",
+ "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+"),
+ ("bingbot",
+ "b",
+ "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"),
+ ("chrome",
+ "c",
+ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"),
+ ("firefox",
+ "f",
+ "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1"),
+ ("googlebot",
+ "g",
+ "Googlebot/2.1 (+http://www.googlebot.com/bot.html)"),
+ ("ie9",
+ "i",
+ "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))"),
+ ("ipad",
+ "p",
+ "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3"),
+ ("iphone",
+ "h",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 4_2_1 like Mac OS X) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5",
+ ),
+ ("safari",
+ "s",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10")]
def get_by_shortcut(s):
diff --git a/netlib/tcp.py b/netlib/tcp.py
index fc2c144e..a705c95b 100644
--- a/netlib/tcp.py
+++ b/netlib/tcp.py
@@ -48,7 +48,8 @@ class SSLKeyLogger(object):
self.f = None
self.lock = threading.Lock()
- __name__ = "SSLKeyLogger" # required for functools.wraps, which pyOpenSSL uses.
+ # required for functools.wraps, which pyOpenSSL uses.
+ __name__ = "SSLKeyLogger"
def __call__(self, connection, where, ret):
if where == SSL.SSL_CB_HANDSHAKE_DONE and ret == 1:
@@ -61,7 +62,10 @@ class SSLKeyLogger(object):
self.f.write("\r\n")
client_random = connection.client_random().encode("hex")
masterkey = connection.master_key().encode("hex")
- self.f.write("CLIENT_RANDOM {} {}\r\n".format(client_random, masterkey))
+ self.f.write(
+ "CLIENT_RANDOM {} {}\r\n".format(
+ client_random,
+ masterkey))
self.f.flush()
def close(self):
@@ -75,7 +79,8 @@ class SSLKeyLogger(object):
return SSLKeyLogger(filename)
return False
-log_ssl_key = SSLKeyLogger.create_logfun(os.getenv("MITMPROXY_SSLKEYLOGFILE") or os.getenv("SSLKEYLOGFILE"))
+log_ssl_key = SSLKeyLogger.create_logfun(
+ os.getenv("MITMPROXY_SSLKEYLOGFILE") or os.getenv("SSLKEYLOGFILE"))
class _FileLike(object):
@@ -378,7 +383,8 @@ class _Connection(object):
# Workaround for
# https://github.com/pyca/pyopenssl/issues/190
# https://github.com/mitmproxy/mitmproxy/issues/472
- context.set_mode(SSL._lib.SSL_MODE_AUTO_RETRY) # Options already set before are not cleared.
+ # Options already set before are not cleared.
+ context.set_mode(SSL._lib.SSL_MODE_AUTO_RETRY)
# Cipher List
if cipher_list:
@@ -420,14 +426,17 @@ class TCPClient(_Connection):
def __init__(self, address, source_address=None):
self.address = Address.wrap(address)
- self.source_address = Address.wrap(source_address) if source_address else None
+ self.source_address = Address.wrap(
+ source_address) if source_address else None
self.connection, self.rfile, self.wfile = None, None, None
self.cert = None
self.ssl_established = False
self.sni = None
def create_ssl_context(self, cert=None, alpn_protos=None, **sslctx_kwargs):
- context = self._create_ssl_context(alpn_protos=alpn_protos, **sslctx_kwargs)
+ context = self._create_ssl_context(
+ alpn_protos=alpn_protos,
+ **sslctx_kwargs)
# Client Certs
if cert:
try:
@@ -443,7 +452,9 @@ class TCPClient(_Connection):
options: A bit field consisting of OpenSSL.SSL.OP_* values
"""
- context = self.create_ssl_context(alpn_protos=alpn_protos, **sslctx_kwargs)
+ context = self.create_ssl_context(
+ alpn_protos=alpn_protos,
+ **sslctx_kwargs)
self.connection = SSL.Connection(context, self.connection)
if sni:
self.sni = sni
@@ -469,7 +480,9 @@ class TCPClient(_Connection):
self.rfile = Reader(connection.makefile('rb', self.rbufsize))
self.wfile = Writer(connection.makefile('wb', self.wbufsize))
except (socket.error, IOError) as err:
- raise NetLibError('Error connecting to "%s": %s' % (self.address.host, err))
+ raise NetLibError(
+ 'Error connecting to "%s": %s' %
+ (self.address.host, err))
self.connection = connection
def settimeout(self, n):
@@ -535,7 +548,9 @@ class BaseHandler(_Connection):
until then we're conservative.
"""
- context = self._create_ssl_context(alpn_select=alpn_select, **sslctx_kwargs)
+ context = self._create_ssl_context(
+ alpn_select=alpn_select,
+ **sslctx_kwargs)
context.use_privatekey(key)
context.use_certificate(cert.x509)
@@ -566,7 +581,11 @@ class BaseHandler(_Connection):
For a list of parameters, see BaseHandler._create_ssl_context(...)
"""
- context = self.create_ssl_context(cert, key, alpn_select=alpn_select, **sslctx_kwargs)
+ context = self.create_ssl_context(
+ cert,
+ key,
+ alpn_select=alpn_select,
+ **sslctx_kwargs)
self.connection = SSL.Connection(context, self.connection)
self.connection.set_accept_state()
try:
@@ -611,7 +630,8 @@ class TCPServer(object):
try:
while not self.__shutdown_request:
try:
- r, w, e = select.select([self.socket], [], [], poll_interval)
+ r, w, e = select.select(
+ [self.socket], [], [], poll_interval)
except select.error as ex: # pragma: no cover
if ex[0] == EINTR:
continue
diff --git a/netlib/test.py b/netlib/test.py
index 63b493a9..14f50157 100644
--- a/netlib/test.py
+++ b/netlib/test.py
@@ -67,7 +67,9 @@ class TServer(tcp.TCPServer):
file(self.ssl["cert"], "rb").read()
)
raw = file(self.ssl["key"], "rb").read()
- key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, raw)
+ key = OpenSSL.crypto.load_privatekey(
+ OpenSSL.crypto.FILETYPE_PEM,
+ raw)
if self.ssl["v3_only"]:
method = tcp.SSLv3_METHOD
options = OpenSSL.SSL.OP_NO_SSLv2 | OpenSSL.SSL.OP_NO_TLSv1
diff --git a/netlib/wsgi.py b/netlib/wsgi.py
index f393039a..827cf6f0 100644
--- a/netlib/wsgi.py
+++ b/netlib/wsgi.py
@@ -77,7 +77,8 @@ class WSGIAdaptor(object):
}
environ.update(extra)
if flow.client_conn.address:
- environ["REMOTE_ADDR"], environ["REMOTE_PORT"] = flow.client_conn.address()
+ environ["REMOTE_ADDR"], environ[
+ "REMOTE_PORT"] = flow.client_conn.address()
for key, value in flow.request.headers.items():
key = 'HTTP_' + key.upper().replace('-', '_')