From 4f1f869748207d12c2deda80e12aeb206ce37fcb Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 14 Aug 2019 09:56:06 +0100 Subject: [PATCH] [Test] Add large https body test --- test/functional/cases/220_http.robot | 9 ++ test/functional/lua/http.lua | 48 ++++++++-- test/functional/util/dummy_https.py | 125 +++++++++++++++++++++++++++ 3 files changed, 177 insertions(+), 5 deletions(-) create mode 100755 test/functional/util/dummy_https.py diff --git a/test/functional/cases/220_http.robot b/test/functional/cases/220_http.robot index b4292897e..acdb75431 100644 --- a/test/functional/cases/220_http.robot +++ b/test/functional/cases/220_http.robot @@ -35,6 +35,9 @@ HTTP empty response Check url /empty get HTTP_ERROR HTTP_ERROR HTTP_CORO_DNS_ERROR HTTP_CORO_ERROR method_get IO read error: unexpected EOF Check url /empty post HTTP_DNS_ERROR HTTP_ERROR HTTP_CORO_DNS_ERROR HTTP_CORO_ERROR method_post IO read error: unexpected EOF +SSL Large HTTP request + ${result} = Scan Message With Rspamc ${MESSAGE} + Check Rspamc ${result} HTTP_SSL_LARGE *** Keywords *** Lua Setup @@ -44,17 +47,23 @@ Lua Setup Http Setup Run Dummy Http + Run Dummy Https Lua Setup ${TESTDIR}/lua/http.lua Http Teardown ${http_pid} = Get File /tmp/dummy_http.pid Shutdown Process With Children ${http_pid} + ${https_pid} = Get File /tmp/dummy_https.pid + Shutdown Process With Children ${https_pid} Normal Teardown Run Dummy Http ${result} = Start Process ${TESTDIR}/util/dummy_http.py Wait Until Created /tmp/dummy_http.pid +Run Dummy Https + ${result} = Start Process ${TESTDIR}/util/dummy_https.py ${TESTDIR}/util/server.pem + Wait Until Created /tmp/dummy_https.pid Check url [Arguments] ${url} ${method} @{expect_results} diff --git a/test/functional/lua/http.lua b/test/functional/lua/http.lua index 1981c8734..d0ed4e7b7 100644 --- a/test/functional/lua/http.lua +++ b/test/functional/lua/http.lua @@ -106,13 +106,51 @@ local function periodic(cfg, ev_base) end rspamd_config:register_symbol({ -name = 'SIMPLE_TEST', -score = 1.0, -callback = http_symbol, -no_squeeze = true, -flags = 'coro' + name = 'SIMPLE_TEST', + score = 1.0, + callback = http_symbol, + no_squeeze = true, + flags = 'coro' }) +local function http_large_symbol(task) + if task:get_queue_id() == 'SSL Large HTTP request' then + local data = {} + for i = 1,2 do + local st = {} + for j=1,300000 do + st[j] = 't' + end + data[i] = table.concat(st) + end + data[#data + 1] = '\n' + + local function http_callback(err, code, body) + if err then + rspamd_logger.errx('http_callback error: ' .. err) + task:insert_result('HTTP_ERROR', 1.0, err) + else + task:insert_result('HTTP_SSL_LARGE', 1.0) + end + end + rspamd_http.request({ + url = 'https://127.0.0.1:18081/', + task = task, + method = 'post', + callback = http_callback, + timeout = 10, + body = data, + no_ssl_verify = true, + }) + end +end +rspamd_config:register_symbol({ + name = 'LARGE_TEST', + score = 1.0, + callback = http_large_symbol, + no_squeeze = true, + flags = 'coro' +}) rspamd_config:register_finish_script(finish) diff --git a/test/functional/util/dummy_https.py b/test/functional/util/dummy_https.py new file mode 100755 index 000000000..43c5d9122 --- /dev/null +++ b/test/functional/util/dummy_https.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python + +import BaseHTTPServer +import SocketServer +import SimpleHTTPServer +import dummy_killer +import ssl + +import time +import os +import sys +import socket + +PORT = 18081 +HOST_NAME = '127.0.0.1' + +PID = "/tmp/dummy_https.pid" + + +class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): + + def setup(self): + BaseHTTPServer.BaseHTTPRequestHandler.setup(self) + self.protocol_version = "HTTP/1.1" # allow connection: keep-alive + + def do_HEAD(self): + self.send_response(200) + self.send_header("Content-type", "text/html") + self.end_headers() + self.log_message("to be closed: " + self.close_connection) + + def do_GET(self): + response = "hello world" + + """Respond to a GET request.""" + if self.path == "/empty": + self.finish() + return + + if self.path == "/timeout": + time.sleep(2) + + if self.path == "/error_403": + self.send_response(403) + else: + self.send_response(200) + + if self.path == "/content-length": + self.send_header("Content-Length", str(len(response))) + + self.send_header("Content-type", "text/plain") + self.end_headers() + self.wfile.write(response) + self.log_message("to be closed: %d, headers: %s, conn:'%s'" % (self.close_connection, str(self.headers), self.headers.get('Connection', "").lower())) + + conntype = self.headers.get('Connection', "").lower() + if conntype != 'keep-alive': + self.close_connection = True + + self.log_message("ka:'%s', pv:%s[%s]" % (str(conntype == 'keep-alive'), str(self.protocol_version >= "HTTP/1.1"), self.protocol_version)) + + + def do_POST(self): + """Respond to a POST request.""" + + content_length = int(self.headers['Content-Length']) + response = 'hello post' + + if content_length > 0: + body = self.rfile.read(content_length) + response = "hello post: " + str(len(body)) + + if self.path == "/empty": + self.finish() + return + + if self.path == "/timeout": + time.sleep(2) + + if self.path == "/error_403": + self.send_response(403) + else: + self.send_response(200) + + if self.path == "/content-length": + self.send_header("Content-Length", str(len(response))) + + self.send_header("Content-type", "text/plain") + self.end_headers() + self.wfile.write(response) + + +class ThreadingSimpleServer(SocketServer.ThreadingMixIn, + BaseHTTPServer.HTTPServer): + def __init__(self, certfile, + keyfile,): + self.allow_reuse_address = True + self.timeout = 10 + BaseHTTPServer.HTTPServer.__init__(self, (HOST_NAME, PORT), MyHandler) + self.socket = ssl.wrap_socket (self.socket, + keyfile=keyfile, + certfile=certfile, server_side=True) + + def run(self): + dummy_killer.write_pid(PID) + try: + while 1: + sys.stdout.flush() + server.handle_request() + except KeyboardInterrupt: + print "Interrupt" + except socket.error: + print "Socket closed" + + def stop(self): + self.keep_running = False + self.server_close() + + +if __name__ == '__main__': + server = ThreadingSimpleServer(sys.argv[1], sys.argv[1]) + + dummy_killer.setup_killer(server, server.stop) + + server.run() -- 2.39.5