From 21c7218ee34bdaa43583a0daf0bfaf11498ce61b Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 6 Jun 2016 16:52:51 +1200 Subject: Close when Pathoc.connect raises an exception --- pathod/pathoc.py | 76 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 35 deletions(-) (limited to 'pathod') diff --git a/pathod/pathoc.py b/pathod/pathoc.py index 5cfb4591..4c708fc9 100644 --- a/pathod/pathoc.py +++ b/pathod/pathoc.py @@ -247,7 +247,10 @@ class Pathoc(tcp.TCPClient): def socks_connect(self, connect_to): try: - client_greet = socks.ClientGreeting(socks.VERSION.SOCKS5, [socks.METHOD.NO_AUTHENTICATION_REQUIRED]) + client_greet = socks.ClientGreeting( + socks.VERSION.SOCKS5, + [socks.METHOD.NO_AUTHENTICATION_REQUIRED] + ) client_greet.to_file(self.wfile) self.wfile.flush() @@ -286,44 +289,47 @@ class Pathoc(tcp.TCPClient): if self.use_http2 and not self.ssl: raise NotImplementedError("HTTP2 without SSL is not supported.") - ret = tcp.TCPClient.connect(self) + try: + ret = tcp.TCPClient.connect(self) + if connect_to: + self.http_connect(connect_to) - if connect_to: - self.http_connect(connect_to) + self.sslinfo = None + if self.ssl: + try: + alpn_protos = [b'http/1.1'] + if self.use_http2: + alpn_protos.append(b'h2') + + self.convert_to_ssl( + sni=self.sni, + cert=self.clientcert, + method=self.ssl_version, + options=self.ssl_options, + cipher_list=self.ciphers, + alpn_protos=alpn_protos + ) + except TlsException as v: + raise PathocError(str(v)) - self.sslinfo = None - if self.ssl: - try: - alpn_protos = [b'http/1.1'] - if self.use_http2: - alpn_protos.append(b'h2') - - self.convert_to_ssl( - sni=self.sni, - cert=self.clientcert, - method=self.ssl_version, - options=self.ssl_options, - cipher_list=self.ciphers, - alpn_protos=alpn_protos + self.sslinfo = SSLInfo( + self.connection.get_peer_cert_chain(), + self.get_current_cipher(), + self.get_alpn_proto_negotiated() ) - except TlsException as v: - raise PathocError(str(v)) - - self.sslinfo = SSLInfo( - self.connection.get_peer_cert_chain(), - self.get_current_cipher(), - self.get_alpn_proto_negotiated() - ) - if showssl: - print(str(self.sslinfo), file=fp) - - if self.use_http2: - self.protocol.check_alpn() - if not self.http2_skip_connection_preface: - self.protocol.perform_client_connection_preface() + if showssl: + print(str(self.sslinfo), file=fp) - if self.timeout: - self.settimeout(self.timeout) + if self.use_http2: + self.protocol.check_alpn() + if not self.http2_skip_connection_preface: + self.protocol.perform_client_connection_preface() + + if self.timeout: + self.settimeout(self.timeout) + except Exception: + self.close() + raise return ret def stop(self): -- cgit v1.2.3 From 210c376901b4a84785a1f28be01a9a635f6c7239 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 6 Jun 2016 18:17:22 +1200 Subject: Fix sequencing in Pathoc websocket termination test --- pathod/pathoc.py | 1 + 1 file changed, 1 insertion(+) (limited to 'pathod') diff --git a/pathod/pathoc.py b/pathod/pathoc.py index 4c708fc9..3eb91637 100644 --- a/pathod/pathoc.py +++ b/pathod/pathoc.py @@ -361,6 +361,7 @@ class Pathoc(tcp.TCPClient): return if frm is None: self.ws_framereader.join() + self.ws_framereader = None return yield frm -- cgit v1.2.3 From 1214085f67457865aff4307b847ee4264fec2bd1 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Mon, 6 Jun 2016 11:37:49 -0700 Subject: fix pathod test on Windows --- pathod/language/generators.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'pathod') diff --git a/pathod/language/generators.py b/pathod/language/generators.py index 9fff3082..68705941 100644 --- a/pathod/language/generators.py +++ b/pathod/language/generators.py @@ -3,6 +3,7 @@ import random import mmap import six +import sys DATATYPES = dict( ascii_letters=string.ascii_letters.encode(), @@ -68,7 +69,7 @@ class RandomGenerator(object): def __getitem__(self, x): chars = DATATYPES[self.dtype] if isinstance(x, slice): - return b"".join(rand_byte(chars) for _ in range(*x.indices(self.length))) + return b"".join(rand_byte(chars) for _ in range(*x.indices(min(self.length, sys.maxsize)))) return rand_byte(chars) def __repr__(self): -- cgit v1.2.3 From 07a0d6dcc20dcf201d242ba2d8e4f14e5254b49f Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sat, 4 Jun 2016 20:50:42 +0530 Subject: Py3: Return bytes from _Component class --- pathod/language/base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'pathod') diff --git a/pathod/language/base.py b/pathod/language/base.py index 1369a3c7..228bfe3b 100644 --- a/pathod/language/base.py +++ b/pathod/language/base.py @@ -261,7 +261,7 @@ class _Component(Token): """ A value component of the primary specification of an message. - Components produce byte values desribe the bytes of the message. + Components produce byte values describing the bytes of the message. """ def values(self, settings): # pragma: no cover @@ -272,9 +272,9 @@ class _Component(Token): def string(self, settings=None): """ - A string representation of the object. + A bytestring representation of the object. """ - return "".join(i[:] for i in self.values(settings or {})) + return b"".join(i[:] for i in self.values(settings or {})) class KeyValue(_Component): -- cgit v1.2.3 From bafce6cfe9cf602ac0c8497d18d967974df83bcb Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sat, 4 Jun 2016 20:57:29 +0530 Subject: Py3: Use byte string literals --- pathod/language/http.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'pathod') diff --git a/pathod/language/http.py b/pathod/language/http.py index b2308d5e..c8fe6a50 100644 --- a/pathod/language/http.py +++ b/pathod/language/http.py @@ -109,7 +109,7 @@ def get_header(val, headers): class _HTTPMessage(message.Message): - version = "HTTP/1.1" + version = b"HTTP/1.1" @property def actions(self): @@ -133,10 +133,10 @@ class _HTTPMessage(message.Message): def values(self, settings): vals = self.preamble(settings) - vals.append("\r\n") + vals.append(b"\r\n") for h in self.headers: vals.extend(h.values(settings)) - vals.append("\r\n") + vals.append(b"\r\n") if self.body: vals.extend(self.body.values(settings)) return vals @@ -171,7 +171,7 @@ class Response(_HTTPMessage): return self.tok(Reason) def preamble(self, settings): - l = [self.version, " "] + l = [self.version, b" "] l.extend(self.status_code.values(settings)) status_code = int(self.status_code.value) l.append(" ") -- cgit v1.2.3 From 4813f9c69eb09a5288f539992a01e2f0a9a03dc2 Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sun, 5 Jun 2016 22:52:18 +0530 Subject: Py3: More byte literals --- pathod/language/http.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'pathod') diff --git a/pathod/language/http.py b/pathod/language/http.py index c8fe6a50..052d6d6e 100644 --- a/pathod/language/http.py +++ b/pathod/language/http.py @@ -57,7 +57,7 @@ class _HeaderMixin(object): unique_name = None def format_header(self, key, value): - return [key, ": ", value, "\r\n"] + return [key, b": ", value, b"\r\n"] def values(self, settings): return self.format_header( @@ -174,14 +174,14 @@ class Response(_HTTPMessage): l = [self.version, b" "] l.extend(self.status_code.values(settings)) status_code = int(self.status_code.value) - l.append(" ") + l.append(b" ") if self.reason: l.extend(self.reason.values(settings)) else: l.append( status_codes.RESPONSES.get( status_code, - "Unknown code" + b"Unknown code" ) ) return l @@ -191,7 +191,7 @@ class Response(_HTTPMessage): if self.ws: if not settings.websocket_key: raise exceptions.RenderError( - "No websocket key - have we seen a client handshake?" + b"No websocket key - have we seen a client handshake?" ) if not self.status_code: tokens.insert( @@ -294,11 +294,11 @@ class Request(_HTTPMessage): def preamble(self, settings): v = self.method.values(settings) - v.append(" ") + v.append(b" ") v.extend(self.path.values(settings)) if self.nested_response: v.append(self.nested_response.parsed.spec()) - v.append(" ") + v.append(b" ") v.append(self.version) return v -- cgit v1.2.3 From c4ac19be9fd6ab1186783d23774cc0c500677137 Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sun, 5 Jun 2016 22:54:14 +0530 Subject: Py3: Use bytes_to_escaped_str for escaping message --- pathod/language/message.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'pathod') diff --git a/pathod/language/message.py b/pathod/language/message.py index 33124856..fea4f4de 100644 --- a/pathod/language/message.py +++ b/pathod/language/message.py @@ -1,5 +1,6 @@ import abc from . import actions, exceptions +from netlib import strutils LOG_TRUNCATE = 1024 @@ -49,7 +50,7 @@ class Message(object): def preview_safe(self): """ - Return a copy of this message that issafe for previews. + Return a copy of this message that is safe for previews. """ tokens = [i for i in self.tokens if not isinstance(i, actions.PauseAt)] return self.__class__(tokens) @@ -80,10 +81,10 @@ class Message(object): # We truncate at 1k. if hasattr(v, "values"): v = [x[:LOG_TRUNCATE] for x in v.values(settings)] - v = "".join(v).encode("string_escape") + v = strutils.bytes_to_escaped_str(b"".join(v)) elif hasattr(v, "__len__"): v = v[:LOG_TRUNCATE] - v = v.encode("string_escape") + v = strutils.bytes_to_escaped_str(v) ret[i] = v ret["spec"] = self.spec() return ret -- cgit v1.2.3 From da38ce2e6efc685f760655c75b716a2723303c91 Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sun, 5 Jun 2016 23:03:31 +0530 Subject: Py3: decode() input before creating new Header token --- pathod/language/http.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'pathod') diff --git a/pathod/language/http.py b/pathod/language/http.py index 052d6d6e..51b4d8c0 100644 --- a/pathod/language/http.py +++ b/pathod/language/http.py @@ -205,8 +205,8 @@ class Response(_HTTPMessage): if not get_header(i[0], self.headers): tokens.append( Header( - base.TokValueLiteral(i[0]), - base.TokValueLiteral(i[1])) + base.TokValueLiteral(i[0].decode()), + base.TokValueLiteral(i[1].decode())) ) if not self.raw: if not get_header("Content-Length", self.headers): @@ -314,8 +314,8 @@ class Request(_HTTPMessage): if not get_header(i[0], self.headers): tokens.append( Header( - base.TokValueLiteral(i[0]), - base.TokValueLiteral(i[1]) + base.TokValueLiteral(i[0].decode()), + base.TokValueLiteral(i[1].decode()) ) ) if not self.raw: -- cgit v1.2.3 From 78b2fa3a130837b53e1e839cca0d6e6f69b0500f Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sun, 5 Jun 2016 23:10:55 +0530 Subject: Py3: UASTRINGS should be indexed by and return bytes --- pathod/language/http.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pathod') diff --git a/pathod/language/http.py b/pathod/language/http.py index 51b4d8c0..b088d2cc 100644 --- a/pathod/language/http.py +++ b/pathod/language/http.py @@ -88,7 +88,7 @@ class ShortcutUserAgent(_HeaderMixin, base.OptionsOrValue): def values(self, settings): value = self.value.val if self.option_used: - value = user_agents.get_by_shortcut(value.lower())[2] + value = user_agents.get_by_shortcut(value.lower().decode())[2].encode() return self.format_header( self.key.get_generator(settings), -- cgit v1.2.3 From daba944151097da7fd1d3f9f2af1bd931e013003 Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sun, 5 Jun 2016 23:21:11 +0530 Subject: Py3: Store base.Integer value as bytes --- pathod/language/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'pathod') diff --git a/pathod/language/base.py b/pathod/language/base.py index 228bfe3b..c75005be 100644 --- a/pathod/language/base.py +++ b/pathod/language/base.py @@ -391,7 +391,7 @@ class Integer(_Component): "Integer value must be between %s and %s." % self.bounds, 0, 0 ) - self.value = str(value) + self.value = str(value).encode() @classmethod def expr(cls): @@ -404,7 +404,7 @@ class Integer(_Component): return self.value def spec(self): - return "%s%s" % (self.preamble, self.value) + return "%s%s" % (self.preamble, self.value.decode()) def freeze(self, settings_): return self -- cgit v1.2.3 From 5a2932adc11b9049e5609ae564cdee2482ef800c Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Sun, 5 Jun 2016 23:21:50 +0530 Subject: Py3: Fix corresponding base.Integer test in test_language_base --- pathod/language/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pathod') diff --git a/pathod/language/base.py b/pathod/language/base.py index c75005be..bc389792 100644 --- a/pathod/language/base.py +++ b/pathod/language/base.py @@ -401,7 +401,7 @@ class Integer(_Component): return e.setParseAction(lambda x: cls(*x)) def values(self, settings): - return self.value + return [self.value] def spec(self): return "%s%s" % (self.preamble, self.value.decode()) -- cgit v1.2.3 From b03a98f9fcdddead9a30c8818c230c2771d1e073 Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Mon, 6 Jun 2016 00:26:00 +0530 Subject: Py3: Exception doesn't have to be bytes --- pathod/language/http.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pathod') diff --git a/pathod/language/http.py b/pathod/language/http.py index b088d2cc..b2af0864 100644 --- a/pathod/language/http.py +++ b/pathod/language/http.py @@ -191,7 +191,7 @@ class Response(_HTTPMessage): if self.ws: if not settings.websocket_key: raise exceptions.RenderError( - b"No websocket key - have we seen a client handshake?" + "No websocket key - have we seen a client handshake?" ) if not self.status_code: tokens.insert( -- cgit v1.2.3 From afa2ad81df2478b6c6b2819ee2c0460128aeff4a Mon Sep 17 00:00:00 2001 From: Shadab Zafar Date: Mon, 6 Jun 2016 16:06:56 +0530 Subject: Py3: encode() status code responses --- pathod/language/http.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pathod') diff --git a/pathod/language/http.py b/pathod/language/http.py index b2af0864..4cc7db5f 100644 --- a/pathod/language/http.py +++ b/pathod/language/http.py @@ -182,7 +182,7 @@ class Response(_HTTPMessage): status_codes.RESPONSES.get( status_code, b"Unknown code" - ) + ).encode() ) return l -- cgit v1.2.3 From 6447c8ae2256b0e074a04307a748d61f990e98d4 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Mon, 6 Jun 2016 13:31:44 -0700 Subject: fix .freeze(), improve tests --- pathod/language/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pathod') diff --git a/pathod/language/base.py b/pathod/language/base.py index bc389792..6cafdebd 100644 --- a/pathod/language/base.py +++ b/pathod/language/base.py @@ -578,4 +578,4 @@ class NestedMessage(Token): def freeze(self, settings): f = self.parsed.freeze(settings).spec() - return self.__class__(TokValueLiteral(strutils.bytes_to_escaped_str(f))) + return self.__class__(TokValueLiteral(strutils.bytes_to_escaped_str(f.encode()))) -- cgit v1.2.3 From 2ee5e8ef0e632545038a72f0cedc0320c59b00ff Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Mon, 6 Jun 2016 13:39:38 -0700 Subject: fix NestedMessage encoding --- pathod/language/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pathod') diff --git a/pathod/language/base.py b/pathod/language/base.py index 6cafdebd..25f3fd1a 100644 --- a/pathod/language/base.py +++ b/pathod/language/base.py @@ -555,7 +555,7 @@ class NestedMessage(Token): try: self.parsed = self.nest_type( self.nest_type.expr().parseString( - value.val, + value.val.decode(), parseAll=True ) ) -- cgit v1.2.3