diff --git a/fastwsgi/request.c b/fastwsgi/request.c index d8541dd..36f5772 100644 --- a/fastwsgi/request.c +++ b/fastwsgi/request.c @@ -163,6 +163,8 @@ int on_message_complete(llhttp_t* parser) { }; void build_response(PyObject* wsgi_response, StartResponse* response, llhttp_t* parser) { + // This function needs a clean up + logger("building response"); Request* request = (Request*)parser->data; @@ -176,10 +178,16 @@ void build_response(PyObject* wsgi_response, StartResponse* response, llhttp_t* else iter = PyObject_GetIter(wsgi_response); - if (result == NULL) - result = PyIter_Next(iter); - int response_has_no_content = 0; + + if (result == NULL) { + PyObject* next = PyIter_Next(iter); + if (next == NULL) + response_has_no_content = 1; + else + result = next; + } + PyObject* status = PyUnicode_AsUTF8String(response->status); char* status_code = PyBytes_AS_STRING(status); if (strncmp(status_code, "204", 3) == 0 || strncmp(status_code, "304", 3) == 0) { @@ -227,8 +235,8 @@ void build_response(PyObject* wsgi_response, StartResponse* response, llhttp_t* if (response_has_no_content) { char* old_buf = buf; - buf = malloc(strlen(old_buf) + 5); - sprintf(buf, "%s\r\n\r\n", old_buf); + buf = malloc(strlen(old_buf) + 26); + sprintf(buf, "%s\r\nContent-Length: 0\r\n\r\n", old_buf); free(old_buf); } else { diff --git a/tests/apps_under_test/__init__.py b/tests/apps_under_test/__init__.py index 1fbad3e..08b379d 100644 --- a/tests/apps_under_test/__init__.py +++ b/tests/apps_under_test/__init__.py @@ -3,3 +3,4 @@ from .wsgi_app import wsgi_app from .flask_app import app as flask_app from .wsgi_validator_app import validator_app from .start_response_test_app import start_response_app +from .general_test_app import general_test_app diff --git a/tests/apps_under_test/general_test_app.py b/tests/apps_under_test/general_test_app.py new file mode 100644 index 0000000..60c66e1 --- /dev/null +++ b/tests/apps_under_test/general_test_app.py @@ -0,0 +1,13 @@ +def _no_response(environ, start_response): + start_response("200 OK", []) + return [] + + +routes = { + "/no_response": _no_response, +} + + +def general_test_app(environ, start_response): + app = routes.get(environ["PATH_INFO"]) + return app(environ, start_response) diff --git a/tests/conftest.py b/tests/conftest.py index 4c394b1..9bf90b6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,7 +13,8 @@ from tests.apps_under_test import ( wsgi_app, flask_app, validator_app, - start_response_app + start_response_app, + general_test_app ) HOST = "127.0.0.1" @@ -40,6 +41,7 @@ class Servers(Enum): FLASK_TEST_SERVER = 3 VALIDATOR_TEST_SERVER = 4 START_RESPONSE_SERVER = 5 + GENERAL_TEST_APP = 6 servers = { @@ -48,6 +50,7 @@ servers = { Servers.FLASK_TEST_SERVER: flask_app, Servers.VALIDATOR_TEST_SERVER: validator_app, Servers.START_RESPONSE_SERVER: start_response_app, + Servers.GENERAL_TEST_APP: general_test_app, } @@ -107,3 +110,8 @@ def validator_test_server(): @pytest.fixture def start_response_server(): return servers.get(Servers.START_RESPONSE_SERVER) + + +@pytest.fixture +def general_test_server(): + return servers.get(Servers.GENERAL_TEST_APP) diff --git a/tests/test_general_app.py b/tests/test_general_app.py new file mode 100644 index 0000000..495ad1e --- /dev/null +++ b/tests/test_general_app.py @@ -0,0 +1,8 @@ +import requests + + +def test_no_response(general_test_server): + url = f"{general_test_server.endpoint}/no_response" + result = requests.get(url) + assert result.status_code == 200 + assert result.text is ''