diff --git a/libpathod/pathoc.py b/libpathod/pathoc.py index b7802daae..c1bca07f4 100644 --- a/libpathod/pathoc.py +++ b/libpathod/pathoc.py @@ -228,12 +228,12 @@ class Pathoc(tcp.TCPClient): l = self.rfile.readline() if not l: raise PathocError("Proxy CONNECT failed") - parsed = http.http1.parse_response_line(l) + parsed = self.protocol.parse_response_line(l) if not parsed[1] == 200: raise PathocError( "Proxy CONNECT failed: %s - %s" % (parsed[1], parsed[2]) ) - http.http1.read_headers(self.rfile) + self.protocol.read_headers() def socks_connect(self, connect_to): try: diff --git a/libpathod/pathod.py b/libpathod/pathod.py index cfedc9344..f8607cca5 100644 --- a/libpathod/pathod.py +++ b/libpathod/pathod.py @@ -123,11 +123,12 @@ class PathodHandler(tcp.BaseHandler): """ with logger.ctx() as lg: if self.use_http2: - stream_id, headers, body = self.protocol.read_request() - method = headers[':method'] - path = headers[':path'] - headers = odict.ODict(headers) - httpversion = "" + req = self.protocol.read_request() + method = req.method + path = req.path + headers = odict.ODictCaseless(req.headers) + httpversion = req.httpversion + stream_id = req.stream_id else: req = self.protocol.read_request(lg) if 'next_handle' in req: diff --git a/libpathod/protocols/http.py b/libpathod/protocols/http.py index 363af0feb..43ef07994 100644 --- a/libpathod/protocols/http.py +++ b/libpathod/protocols/http.py @@ -6,6 +6,9 @@ class HTTPProtocol: def __init__(self, pathod_handler): self.pathod_handler = pathod_handler + self.wire_protocol = http1.HTTP1Protocol( + self.pathod_handler + ) def make_error_response(self, reason, body): return language.http.make_error_response(reason, body) @@ -38,7 +41,7 @@ class HTTPProtocol: """ Handle a CONNECT request. """ - http1.read_headers(self.pathod_handler.rfile) + self.wire_protocol.read_headers() self.pathod_handler.wfile.write( 'HTTP/1.1 200 Connection established\r\n' + ('Proxy-agent: %s\r\n' % version.NAMEVERSION) + @@ -66,32 +69,31 @@ class HTTPProtocol: return self.pathod_handler.handle_http_request, None def read_request(self, lg): - line = http1.get_request_line(self.pathod_handler.rfile) + line = self.wire_protocol.get_request_line() if not line: # Normal termination return dict() m = utils.MemBool() - if m(http1.parse_init_connect(line)): + if m(self.wire_protocol.parse_init_connect(line)): return dict(next_handle=self.handle_http_connect(m.v, lg)) - elif m(http1.parse_init_proxy(line)): + elif m(self.wire_protocol.parse_init_proxy(line)): method, _, _, _, path, httpversion = m.v - elif m(http1.parse_init_http(line)): + elif m(self.wire_protocol.parse_init_http(line)): method, path, httpversion = m.v else: s = "Invalid first line: %s" % repr(line) lg(s) return dict(errors=dict(type="error", msg=s)) - headers = http1.read_headers(self.pathod_handler.rfile) + headers = self.wire_protocol.read_headers() if headers is None: s = "Invalid headers" lg(s) return dict(errors=dict(type="error", msg=s)) try: - body = http1.read_http_body( - self.pathod_handler.rfile, + body = self.wire_protocol.read_http_body( headers, None, method, diff --git a/libpathod/protocols/http2.py b/libpathod/protocols/http2.py index d2c269ed0..82ec54829 100644 --- a/libpathod/protocols/http2.py +++ b/libpathod/protocols/http2.py @@ -12,7 +12,7 @@ class HTTP2Protocol: def make_error_response(self, reason, body): return language.http2.make_error_response(reason, body) - def read_request(self): + def read_request(self, lg=None): self.wire_protocol.perform_server_connection_preface() return self.wire_protocol.read_request() diff --git a/test/test_pathoc.py b/test/test_pathoc.py index 894c14c52..e9d1e6abf 100644 --- a/test/test_pathoc.py +++ b/test/test_pathoc.py @@ -5,7 +5,7 @@ import OpenSSL from mock import Mock from netlib import tcp, http, socks -from netlib.http import http2 +from netlib.http import http1, http2 from libpathod import pathoc, test, version, pathod, language import tutils @@ -272,8 +272,7 @@ class TestDaemonHTTP2(_TestDaemon): c = pathoc.Pathoc( ("127.0.0.1", self.d.port), ) - # TODO: change if other protocols get implemented - assert c.protocol is None + assert isinstance(c.protocol, http1.HTTP1Protocol) def test_http2_alpn(self): c = pathoc.Pathoc(