Files
citrixpot/test_ingress_proxy.py
T

50 lines
1.7 KiB
Python
Raw Normal View History

"""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')