From 70cea8e11f6c857b657cb8cc143c6f3062d5c312 Mon Sep 17 00:00:00 2001 From: "B. Blechschmidt" Date: Mon, 10 Apr 2023 10:57:41 +0200 Subject: [PATCH] Add manual tests for half open connections --- README.md | 1 - .../half-open-close-client/client.py | 12 ++++++++++++ .../half-open-close-client/server.py | 16 ++++++++++++++++ .../half-open-close-server/client.py | 12 ++++++++++++ .../half-open-close-server/server.py | 15 +++++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/manual-tests/half-open-close-client/client.py create mode 100644 tests/manual-tests/half-open-close-client/server.py create mode 100644 tests/manual-tests/half-open-close-server/client.py create mode 100644 tests/manual-tests/half-open-close-server/server.py diff --git a/README.md b/README.md index 6fed771..89c256f 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,6 @@ or through `ip -6 route del default`, which causes the `libc` resolver (and othe requests for IPv6 addresses. ## TODO -- Improve handling of half-open connections - Increase error robustness (reduce `unwrap` and `expect` usage) - UDP support for SOCKS - Native support for proxying DNS over TCP or TLS diff --git a/tests/manual-tests/half-open-close-client/client.py b/tests/manual-tests/half-open-close-client/client.py new file mode 100644 index 0000000..c6fbd10 --- /dev/null +++ b/tests/manual-tests/half-open-close-client/client.py @@ -0,0 +1,12 @@ +import socket +import time + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect(('116.203.215.166', 1337)) + s.sendall('I am closing the write end, but I can still receive data'.encode()) + s.shutdown(socket.SHUT_WR) + while True: + data = s.recv(1024) + if not data: + break + print(data.decode()) diff --git a/tests/manual-tests/half-open-close-client/server.py b/tests/manual-tests/half-open-close-client/server.py new file mode 100644 index 0000000..5f7d949 --- /dev/null +++ b/tests/manual-tests/half-open-close-client/server.py @@ -0,0 +1,16 @@ +import socket +import time + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(('0.0.0.0', 1337)) + s.listen() + conn, addr = s.accept() + with conn: + while True: + data = conn.recv(1024) + if not data: + break + print(data.decode()) + time.sleep(3) + conn.sendall('This will still be received by the client that has closed its write end'.encode()) diff --git a/tests/manual-tests/half-open-close-server/client.py b/tests/manual-tests/half-open-close-server/client.py new file mode 100644 index 0000000..1e05fee --- /dev/null +++ b/tests/manual-tests/half-open-close-server/client.py @@ -0,0 +1,12 @@ +import socket +import time + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect(('116.203.215.166', 1337)) + while True: + data = s.recv(1024) + if not data: + break + print(data.decode()) + time.sleep(3) + s.sendall('Message after server write end close'.encode()) diff --git a/tests/manual-tests/half-open-close-server/server.py b/tests/manual-tests/half-open-close-server/server.py new file mode 100644 index 0000000..a1acb4a --- /dev/null +++ b/tests/manual-tests/half-open-close-server/server.py @@ -0,0 +1,15 @@ +import socket + +with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(('0.0.0.0', 1337)) + s.listen() + conn, addr = s.accept() + with conn: + conn.sendall('I am closing the write end, but I can still receive data'.encode()) + conn.shutdown(socket.SHUT_WR) + while True: + data = conn.recv(1024) + if not data: + break + print(data.decode())