Skip to content

Commit f804638

Browse files
committed
fix httponly keepalive bug
1 parent d77d04e commit f804638

2 files changed

Lines changed: 10 additions & 10 deletions

File tree

pproxy/__doc__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
__title__ = "pproxy"
2-
__version__ = "2.2.5"
2+
__version__ = "2.2.6"
33
__license__ = "MIT"
44
__description__ = "Proxy server that can tunnel among remote servers by regex rules."
55
__keywords__ = "proxy socks http shadowsocks shadowsocksr ssr redirect pf tunnel cipher ssl udp"

pproxy/proto.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -289,21 +289,21 @@ async def http_channel(self, reader, writer, stat_bytes, stat_conn):
289289
class HTTPOnly(HTTP):
290290
async def connect(self, reader_remote, writer_remote, rauth, host_name, port, myhost, **kw):
291291
buffer = bytearray()
292-
header = None
292+
HOST_NAME = re.compile('\r\nHost: ([^\r\n]+)\r\n', re.I)
293293
def write(data, o=writer_remote.write):
294-
nonlocal header
295294
if not data: return
296-
if header:
297-
return o(data)
298295
buffer.extend(data)
299-
pos = buffer.find(10)
300-
if pos != -1 or len(buffer) > 4096:
301-
header = HTTP_LINE.match(buffer[:pos].decode().rstrip())
302-
if not header:
296+
pos = buffer.find(b'\r\n\r\n')
297+
if pos != -1:
298+
text = buffer[:pos].decode()
299+
header = HTTP_LINE.match(text.split('\r\n', 1)[0])
300+
host = HOST_NAME.search(text)
301+
if not header or not host:
303302
writer_remote.close()
304303
raise Exception('Unknown HTTP header for protocol HTTPOnly')
305304
method, path, ver = header.groups()
306-
data = f'{method} http://{host_name}{":"+str(port) if port!=80 else ""}{path} {ver}'.encode() + (b'\r\nProxy-Authorization: Basic '+base64.b64encode(rauth) if rauth else b'') + b'\r\n' + buffer[pos+1:]
305+
data = f'{method} http://{host.group(1)}{path} {ver}\r\nHost: {host.group(1)}'.encode() + (b'\r\nProxy-Authorization: Basic '+base64.b64encode(rauth) if rauth else b'') + b'\r\n\r\n' + buffer[pos+4:]
306+
buffer.clear()
307307
return o(data)
308308
writer_remote.write = write
309309

0 commit comments

Comments
 (0)