mirror of
https://github.com/jamesroberts/fastwsgi.git
synced 2025-12-21 06:09:31 -06:00
Fixes hanging on no content
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
13
tests/apps_under_test/general_test_app.py
Normal file
13
tests/apps_under_test/general_test_app.py
Normal file
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
8
tests/test_general_app.py
Normal file
8
tests/test_general_app.py
Normal file
@@ -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 ''
|
||||
Reference in New Issue
Block a user