Skip to content

Commit 7638adb

Browse files
committed
wip single chunk merging
1 parent 25b14e5 commit 7638adb

File tree

5 files changed

+15
-5
lines changed

5 files changed

+15
-5
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
SOURCE_DIR = bjoern
22
BUILD_DIR = build
3-
PYTHON ?= python2
3+
PYTHON ?= python3
44

55
PYTHON_INCLUDE = $(shell ${PYTHON}-config --includes)
66
PYTHON_LDFLAGS = $(shell ${PYTHON}-config --ldflags)

bjoern/request.c

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ void Request_reset(Request* request)
3333
{
3434
memset(&request->state, 0, sizeof(Request) - (size_t)&((Request*)NULL)->state);
3535
request->state.response_length_unknown = true;
36+
request->content_length = -1;
3637
request->parser.last_call_was_header_value = true;
3738
request->parser.invalid_header = false;
3839
request->parser.field = NULL;

bjoern/request.h

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ typedef struct {
3838
PyObject* client_addr;
3939

4040
request_state state;
41+
ssize_t content_length;
4142

4243
PyObject* status;
4344
PyObject* headers;

bjoern/server.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ void server_run(ServerInfo* server_info)
9595

9696
#ifdef WANT_SIGNAL_HANDLING
9797
ev_timer_init(&timeout_watcher, ev_timer_ontick, 0., SIGNAL_CHECK_INTERVAL);
98-
ev_timer_start(mainloop, &timeout_watcher);
9998
ev_set_priority(&timeout_watcher, EV_MINPRI);
99+
ev_timer_start(mainloop, &timeout_watcher);
100100
#endif
101101

102102
/* This is the program main loop */

bjoern/wsgi.c

+11-3
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ wsgi_call_application(Request* request)
8888
Py_DECREF(retval);
8989
first_chunk = NULL;
9090
}
91+
if (request->state.response_length_unknown) {
92+
request->state.response_length_unknown = false;
93+
request->content_length = _PEP3333_Bytes_GET_SIZE(retval);
94+
}
9195
} else if(!request->state.response_length_unknown && FileWrapper_CheckExact(retval) && FileWrapper_GetFd(retval) != -1) {
9296
DBG_REQ(request, "WSGI iterable is wsgi.file_wrapper instance and Content-Length is known");
9397
request->iterable = retval;
@@ -123,9 +127,9 @@ wsgi_call_application(Request* request)
123127
!strncmp(_PEP3333_Bytes_AS_DATA(request->status), "304", 3)) {
124128
request->state.response_length_unknown = false;
125129
}
126-
130+
127131
/* keep-alive cruft */
128-
if(http_should_keep_alive(&request->parser.parser)) {
132+
if(http_should_keep_alive(&request->parser.parser)) {
129133
if(request->state.response_length_unknown) {
130134
if(request->parser.parser.http_major > 0 && request->parser.parser.http_minor > 0) {
131135
/* On HTTP 1.1, we can use Transfer-Encoding: chunked. */
@@ -239,7 +243,7 @@ clean_headers(PyObject* headers, bool* found_content_length)
239243
static void
240244
wsgi_getheaders(Request* request, PyObject** buf, Py_ssize_t *length)
241245
{
242-
Py_ssize_t length_upperbound = strlen("HTTP/1.1 ") + _PEP3333_Bytes_GET_SIZE(request->status) + strlen("\r\nConnection: Keep-Alive") + strlen("\r\nTransfer-Encoding: chunked") + strlen("\r\n\r\n");
246+
Py_ssize_t length_upperbound = strlen("HTTP/1.1 ") + _PEP3333_Bytes_GET_SIZE(request->status) + strlen("\r\nConnection: Keep-Alive") + strlen("\r\nTransfer-Encoding: chunked") + strlen("\r\nContent-Length: 999999999999999") + strlen("\r\n\r\n");
243247
for(Py_ssize_t i=0; i<PyList_GET_SIZE(request->headers); ++i) {
244248
PyObject* tuple = PyList_GET_ITEM(request->headers, i);
245249
PyObject* field = PyTuple_GET_ITEM(tuple, 0);
@@ -282,6 +286,10 @@ wsgi_getheaders(Request* request, PyObject** buf, Py_ssize_t *length)
282286
buf_write2("\r\nConnection: Keep-Alive");
283287
if(request->state.chunked_response) {
284288
buf_write2("\r\nTransfer-Encoding: chunked");
289+
}else if(request->content_length>=0) {
290+
char buf[100];
291+
sprintf(buf, "\r\nContent-Length: %ld", request->content_length);
292+
buf_write2(buf);
285293
}
286294
} else {
287295
buf_write2("\r\nConnection: close");

0 commit comments

Comments
 (0)