51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
"""Loopback-only PROXY metadata and binary stream regression."""
|
|
import asyncio
|
|
from ingress_proxy import forward
|
|
|
|
|
|
async def test():
|
|
received = []
|
|
async def backend(reader, writer):
|
|
received.append(await reader.readline())
|
|
payload = await reader.readexactly(5)
|
|
writer.write(payload[::-1])
|
|
await writer.drain()
|
|
writer.close()
|
|
backend_server = await asyncio.start_server(backend, '127.0.0.1', 0)
|
|
async def ingress(reader, writer):
|
|
await forward(reader, writer, '127.0.0.1', backend_server.sockets[0].getsockname()[1])
|
|
proxy = await asyncio.start_server(ingress, '127.0.0.1', 0)
|
|
reader, writer = await asyncio.open_connection('127.0.0.1', proxy.sockets[0].getsockname()[1])
|
|
source_port = writer.get_extra_info('sockname')[1]
|
|
writer.write(b'\x00\xffabc')
|
|
await writer.drain()
|
|
writer.write_eof()
|
|
assert await reader.read() == b'cba\xff\x00'
|
|
assert received == [f'PROXY TCP4 127.0.0.1 127.0.0.1 {source_port} {proxy.sockets[0].getsockname()[1]}\r\n'.encode()]
|
|
writer.close()
|
|
proxy.close()
|
|
backend_server.close()
|
|
await proxy.wait_closed()
|
|
await backend_server.wait_closed()
|
|
|
|
|
|
asyncio.run(test())
|
|
print('ingress proxy regression passed')
|
|
|
|
import socket
|
|
from trusted_proxy import source
|
|
left, right = socket.socketpair()
|
|
try:
|
|
right.sendall(b'PROXY TCP4 192.0.2.10 192.0.2.20 12345 8443\r\nTLS')
|
|
peer, header = source(left, ('10.0.2.2', 123), '10.0.2.2')
|
|
assert peer == ('192.0.2.10', 12345) and left.recv(3) == b'TLS'
|
|
try:
|
|
source(left, ('192.0.2.99', 123), '10.0.2.2')
|
|
raise AssertionError('untrusted peer accepted')
|
|
except ValueError:
|
|
pass
|
|
finally:
|
|
left.close()
|
|
right.close()
|
|
print('trusted PROXY parser regression passed')
|