aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libpathod/pathoc.py4
-rw-r--r--libpathod/pathod.py11
-rw-r--r--libpathod/protocols/http.py18
-rw-r--r--libpathod/protocols/http2.py2
-rw-r--r--test/test_pathoc.py5
5 files changed, 21 insertions, 19 deletions
diff --git a/libpathod/pathoc.py b/libpathod/pathoc.py
index b7802daa..c1bca07f 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 cfedc934..f8607cca 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 363af0fe..43ef0799 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 d2c269ed..82ec5482 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 894c14c5..e9d1e6ab 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(