kit-sub: ответы по HTTP/1.1, как у nginx

В режиме --multi-port kit-sub отвечал строкой статуса HTTP/1.0 и «Server: nginx »
с пробелом. Теперь protocol_version = HTTP/1.1, заголовок Server без хвоста;
на ответы, после которых соединение закрывается (ошибки разбора, POST и т. п.),
добавлен Connection: close. Тест: tools/test/kitsub_http_test.py.
This commit is contained in:
maxdmitrov
2026-10-06 15:42:30 +03:00
parent 58fc3b4704
commit 42be16a5a2
3 changed files with 59 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
"""Ответы kit-sub как у nginx (режим --multi-port): python3 tools/test/kitsub_http_test.py"""
import json, os, socket, tempfile, threading, unittest, importlib.util
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
tmp = tempfile.mkdtemp()
cfgp = os.path.join(tmp, "config.json")
json.dump({"listen": "127.0.0.1", "port": 1, "path": "/sub/", "upstream": "http://127.0.0.1:1/"}, open(cfgp, "w"))
os.environ["KIT_SUB_CONFIG"] = cfgp
os.environ["KIT_SUB_RULES"] = os.path.join(tmp, "rules.yaml")
spec = importlib.util.spec_from_file_location("kit_sub", os.path.join(root, "scripts", "kit-sub.py"))
ks = importlib.util.module_from_spec(spec); spec.loader.exec_module(ks)
srv = ks.Server(("127.0.0.1", 0), ks.Handler)
threading.Thread(target=srv.serve_forever, daemon=True).start()
def raw(data):
s = socket.create_connection(srv.server_address[:2]); s.settimeout(3); s.sendall(data); out = b""
try:
while True:
b = s.recv(65536)
if not b:
break
out += b
except socket.timeout:
out += b"<open>"
s.close()
return out.decode(errors="replace")
class Http(unittest.TestCase):
def test_status_and_server(self):
r = raw(b"GET / HTTP/1.1\r\nHost: x\r\nConnection: close\r\n\r\n")
self.assertTrue(r.startswith("HTTP/1.1 404 Not Found\r\n"), r[:40])
self.assertIn("\r\nServer: nginx\r\n", r)
self.assertIn("\r\nContent-Length: ", r)
def test_keep_alive(self):
r = raw(b"GET / HTTP/1.1\r\nHost: x\r\n\r\nGET /a HTTP/1.1\r\nHost: x\r\nConnection: close\r\n\r\n")
self.assertEqual(r.count("HTTP/1.1 404 Not Found"), 2)
self.assertNotIn("<open>", r)
def test_post_closes(self):
r = raw(b"POST / HTTP/1.1\r\nHost: x\r\nContent-Length: 5\r\n\r\nhello")
self.assertTrue(r.startswith("HTTP/1.1 404"))
self.assertIn("Connection: close", r)
self.assertNotIn("<open>", r)
if __name__ == "__main__":
unittest.main()