Fixes hanging on no content

This commit is contained in:
James Roberts
2022-02-07 21:12:29 +02:00
parent a28aba2411
commit 47563d0ad2
5 changed files with 44 additions and 6 deletions

View File

@@ -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 {

View File

@@ -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

View 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)

View File

@@ -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)

View 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 ''