1 parent d77d04e commit f804638Copy full SHA for f804638
2 files changed
pproxy/__doc__.py
@@ -1,5 +1,5 @@
1
__title__ = "pproxy"
2
-__version__ = "2.2.5"
+__version__ = "2.2.6"
3
__license__ = "MIT"
4
__description__ = "Proxy server that can tunnel among remote servers by regex rules."
5
__keywords__ = "proxy socks http shadowsocks shadowsocksr ssr redirect pf tunnel cipher ssl udp"
pproxy/proto.py
@@ -289,21 +289,21 @@ async def http_channel(self, reader, writer, stat_bytes, stat_conn):
289
class HTTPOnly(HTTP):
290
async def connect(self, reader_remote, writer_remote, rauth, host_name, port, myhost, **kw):
291
buffer = bytearray()
292
- header = None
+ HOST_NAME = re.compile('\r\nHost: ([^\r\n]+)\r\n', re.I)
293
def write(data, o=writer_remote.write):
294
- nonlocal header
295
if not data: return
296
- if header:
297
- return o(data)
298
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:
+ pos = buffer.find(b'\r\n\r\n')
+ if pos != -1:
+ text = buffer[:pos].decode()
+ header = HTTP_LINE.match(text.split('\r\n', 1)[0])
+ host = HOST_NAME.search(text)
+ if not header or not host:
303
writer_remote.close()
304
raise Exception('Unknown HTTP header for protocol HTTPOnly')
305
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:]
+ 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:]
+ buffer.clear()
307
return o(data)
308
writer_remote.write = write
309
0 commit comments