@@ -88,6 +88,10 @@ wsgi_call_application(Request* request)
88
88
Py_DECREF (retval );
89
89
first_chunk = NULL ;
90
90
}
91
+ if (request -> state .response_length_unknown ) {
92
+ request -> state .response_length_unknown = false;
93
+ request -> content_length = _PEP3333_Bytes_GET_SIZE (retval );
94
+ }
91
95
} else if (!request -> state .response_length_unknown && FileWrapper_CheckExact (retval ) && FileWrapper_GetFd (retval ) != -1 ) {
92
96
DBG_REQ (request , "WSGI iterable is wsgi.file_wrapper instance and Content-Length is known" );
93
97
request -> iterable = retval ;
@@ -123,9 +127,9 @@ wsgi_call_application(Request* request)
123
127
!strncmp (_PEP3333_Bytes_AS_DATA (request -> status ), "304" , 3 )) {
124
128
request -> state .response_length_unknown = false;
125
129
}
126
-
130
+
127
131
/* keep-alive cruft */
128
- if (http_should_keep_alive (& request -> parser .parser )) {
132
+ if (http_should_keep_alive (& request -> parser .parser )) {
129
133
if (request -> state .response_length_unknown ) {
130
134
if (request -> parser .parser .http_major > 0 && request -> parser .parser .http_minor > 0 ) {
131
135
/* On HTTP 1.1, we can use Transfer-Encoding: chunked. */
@@ -239,7 +243,7 @@ clean_headers(PyObject* headers, bool* found_content_length)
239
243
static void
240
244
wsgi_getheaders (Request * request , PyObject * * buf , Py_ssize_t * length )
241
245
{
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" );
243
247
for (Py_ssize_t i = 0 ; i < PyList_GET_SIZE (request -> headers ); ++ i ) {
244
248
PyObject * tuple = PyList_GET_ITEM (request -> headers , i );
245
249
PyObject * field = PyTuple_GET_ITEM (tuple , 0 );
@@ -282,6 +286,10 @@ wsgi_getheaders(Request* request, PyObject** buf, Py_ssize_t *length)
282
286
buf_write2 ("\r\nConnection: Keep-Alive" );
283
287
if (request -> state .chunked_response ) {
284
288
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 );
285
293
}
286
294
} else {
287
295
buf_write2 ("\r\nConnection: close" );
0 commit comments