[pkg-uWSGI-devel] Bug#989836: Bug#989851: pre-approval unblock: uwsgi/2.0.19.1-7.1

Thomas Goirand zigo at debian.org
Thu Jun 17 10:02:03 BST 2021


On 6/16/21 8:04 PM, Jonas Smedegaard wrote:
> [ replying via bugreport ]
> 
> Quoting Thomas Goirand (2021-06-16 19:20:44)
>> Can I NMU uwsgi as per the discussion with the release team? Should it 
>> be 2.0.19.1-7.1 or 2.0.19.1-8? Should I also open a merge request on 
>> Salsa?
> 
> Yes, please use standard procedure for NMUs - i.e. release as -7.1 and 
> share the changes with nmudiff (not using salsa).
> 
> 
> Thanks,
> 
>  - Jonas

Hi Jonas,

Thanks for your trust.
Please find the debdiff between 2.0.19.1-7 and 2.0.19.1-7.1 that I have
just uploaded.

I will remove the moreinfo tag of #989851 once the buildd are done with
rebuilding -7.1. I'm changing the title to have #989851 reflect the NMU
version rather than -8.

Cheers,

Thomas Goirand (zigo)
-------------- next part --------------
diff -Nru uwsgi-2.0.19.1/debian/changelog uwsgi-2.0.19.1/debian/changelog
--- uwsgi-2.0.19.1/debian/changelog	2021-05-28 07:56:03.000000000 +0200
+++ uwsgi-2.0.19.1/debian/changelog	2021-06-11 11:08:33.000000000 +0200
@@ -1,3 +1,12 @@
+uwsgi (2.0.19.1-7.1) unstable; urgency=medium
+
+  [ Thomas Goirand ]
+  * Non-maintainer upload.
+  * Add upstream patch to support Transfer-Encoding: chuncked, necessary for
+    OpenStack Glance and Swift over uwsgi.
+
+ -- Thomas Goirand <zigo at debian.org>  Fri, 11 Jun 2021 11:08:33 +0200
+
 uwsgi (2.0.19.1-7) unstable; urgency=medium
 
   * add patch cherry-picked upstream
diff -Nru uwsgi-2.0.19.1/debian/patches/Add_support_for_chunked_encoding.patch uwsgi-2.0.19.1/debian/patches/Add_support_for_chunked_encoding.patch
--- uwsgi-2.0.19.1/debian/patches/Add_support_for_chunked_encoding.patch	1970-01-01 01:00:00.000000000 +0100
+++ uwsgi-2.0.19.1/debian/patches/Add_support_for_chunked_encoding.patch	2021-06-11 11:08:33.000000000 +0200
@@ -0,0 +1,241 @@
+Subject: preliminary implementation of #1428
+ This implements support for transfer-encoding: chuncked
+Author: Unbit <info at unbit.it>
+Date: Thu, 9 Nov 2017 16:40:44 +0100
+Last-Update: 2021-06-11
+
+Index: uwsgi/core/chunked.c
+===================================================================
+--- uwsgi.orig/core/chunked.c
++++ uwsgi/core/chunked.c
+@@ -83,6 +83,83 @@ static ssize_t uwsgi_chunked_readline(st
+ 
+ */
+ 
++struct uwsgi_buffer *uwsgi_chunked_read_smart(struct wsgi_request *wsgi_req, size_t len, int timeout) {
++	// check for buffer
++	if (!wsgi_req->body_chunked_buf)
++		wsgi_req->body_chunked_buf = uwsgi_buffer_new(uwsgi.page_size);
++	// first case: asking for all
++	if (!len) {
++		for(;;) {
++			size_t chunked_len = 0;
++			char *buf = uwsgi_chunked_read(wsgi_req, &chunked_len, timeout, 0);
++			if (chunked_len == 0) {
++				struct uwsgi_buffer *ret = uwsgi_buffer_new(wsgi_req->body_chunked_buf->pos);
++				if (uwsgi_buffer_append(ret, wsgi_req->body_chunked_buf->buf, wsgi_req->body_chunked_buf->pos)) {
++					uwsgi_buffer_destroy(ret);
++					return NULL;
++				}
++				uwsgi_buffer_decapitate(wsgi_req->body_chunked_buf, wsgi_req->body_chunked_buf->pos);
++				return ret;
++			}
++			if (uwsgi_buffer_append(wsgi_req->body_chunked_buf, buf, chunked_len)) {
++				return NULL;
++			}
++		}
++	}
++
++	// asking for littler part
++	if (len <= wsgi_req->body_chunked_buf->pos) {
++		struct uwsgi_buffer *ret = uwsgi_buffer_new(len);
++		if (uwsgi_buffer_append(ret, wsgi_req->body_chunked_buf->buf, len)) {
++			uwsgi_buffer_destroy(ret);
++			return NULL;
++		}
++		uwsgi_buffer_decapitate(wsgi_req->body_chunked_buf, len);
++		return ret;
++	}
++
++	// more data required
++	size_t remains = len;
++	struct uwsgi_buffer *ret = uwsgi_buffer_new(remains);
++	if (wsgi_req->body_chunked_buf->pos > 0) {
++		if (uwsgi_buffer_append(ret, wsgi_req->body_chunked_buf->buf, wsgi_req->body_chunked_buf->pos)) {
++			uwsgi_buffer_destroy(ret);
++			return NULL;
++		}
++		remains -= wsgi_req->body_chunked_buf->pos;
++		uwsgi_buffer_decapitate(wsgi_req->body_chunked_buf, wsgi_req->body_chunked_buf->pos);
++	}
++
++	while(remains) {
++		size_t chunked_len = 0;
++                char *buf = uwsgi_chunked_read(wsgi_req, &chunked_len, timeout, 0);
++                if (chunked_len == 0) {
++			break;
++		}
++		if (uwsgi_buffer_append(wsgi_req->body_chunked_buf, buf, chunked_len)) {
++			uwsgi_buffer_destroy(ret);
++			return NULL;
++		}
++
++		if (chunked_len > remains) {
++			if (uwsgi_buffer_append(ret, wsgi_req->body_chunked_buf->buf, wsgi_req->body_chunked_buf->pos - (chunked_len - remains))) {
++                                uwsgi_buffer_destroy(ret);
++                                return NULL;
++                        }
++                        uwsgi_buffer_decapitate(wsgi_req->body_chunked_buf, wsgi_req->body_chunked_buf->pos - (chunked_len - remains));
++                        return ret;
++		}
++		remains -= chunked_len;
++	}
++
++	if (uwsgi_buffer_append(ret, wsgi_req->body_chunked_buf->buf, wsgi_req->body_chunked_buf->pos)) {
++		uwsgi_buffer_destroy(ret);
++		return NULL;
++	}
++	uwsgi_buffer_decapitate(wsgi_req->body_chunked_buf, wsgi_req->body_chunked_buf->pos);
++	return ret;
++}
++
+ char *uwsgi_chunked_read(struct wsgi_request *wsgi_req, size_t *len, int timeout, int nb) {
+ 
+ 	if (!wsgi_req->chunked_input_buf) {
+Index: uwsgi/core/protocol.c
+===================================================================
+--- uwsgi.orig/core/protocol.c
++++ uwsgi/core/protocol.c
+@@ -560,6 +560,12 @@ static int uwsgi_proto_check_22(struct w
+                 wsgi_req->scheme_len = len;
+         }
+ 
++	if (!uwsgi_proto_key("HTTP_TRANSFER_ENCODING", 22)) {
++		if (!uwsgi_strnicmp(buf, len, "chunked", 7)) {
++                	wsgi_req->body_is_chunked = 1;
++		}
++	}
++
+ 	return 0;
+ }
+ 
+Index: uwsgi/core/utils.c
+===================================================================
+--- uwsgi.orig/core/utils.c
++++ uwsgi/core/utils.c
+@@ -1182,6 +1182,10 @@ void uwsgi_close_request(struct wsgi_req
+ 		uwsgi_buffer_destroy(wsgi_req->chunked_input_buf);
+ 	}
+ 
++	if (wsgi_req->body_chunked_buf) {
++		uwsgi_buffer_destroy(wsgi_req->body_chunked_buf);
++	}
++
+ 	// free websocket engine
+ 	if (wsgi_req->websocket_buf) {
+ 		uwsgi_buffer_destroy(wsgi_req->websocket_buf);
+Index: uwsgi/plugins/python/python_plugin.c
+===================================================================
+--- uwsgi.orig/plugins/python/python_plugin.c
++++ uwsgi/plugins/python/python_plugin.c
+@@ -174,6 +174,8 @@ struct uwsgi_option uwsgi_python_options
+ 
+ 	{"python-worker-override", required_argument, 0, "override worker with the specified python script", uwsgi_opt_set_str, &up.worker_override, 0},
+ 
++	{"wsgi-manage-chunked-input", no_argument, 0, "manage chunked input via the wsgi.input_terminated extension", uwsgi_opt_true, &up.wsgi_manage_chunked_input, 0},
++
+ 	{0, 0, 0, 0, 0, 0, 0},
+ };
+ 
+Index: uwsgi/plugins/python/uwsgi_python.h
+===================================================================
+--- uwsgi.orig/plugins/python/uwsgi_python.h
++++ uwsgi/plugins/python/uwsgi_python.h
+@@ -214,6 +214,8 @@ struct uwsgi_python {
+ 	int wsgi_disable_file_wrapper;
+ 
+ 	char *worker_override;
++
++	int wsgi_manage_chunked_input;
+ };
+ 
+ 
+Index: uwsgi/plugins/python/wsgi_handlers.c
+===================================================================
+--- uwsgi.orig/plugins/python/wsgi_handlers.c
++++ uwsgi/plugins/python/wsgi_handlers.c
+@@ -62,7 +62,20 @@ static PyObject *uwsgi_Input_read(uwsgi_
+ 	ssize_t rlen = 0;
+ 
+ 	UWSGI_RELEASE_GIL
+-	char *buf = uwsgi_request_body_read(wsgi_req, arg_len, &rlen);
++	char *buf = NULL;
++	if (wsgi_req->body_is_chunked && up.wsgi_manage_chunked_input) {
++		struct uwsgi_buffer *ubuf = uwsgi_chunked_read_smart(wsgi_req, arg_len, uwsgi.socket_timeout);
++		UWSGI_GET_GIL
++		if (!ubuf) {
++       			return PyErr_Format(PyExc_IOError, "error during chunked read(%ld) on wsgi.input", arg_len);
++		}
++		PyObject *ret = PyString_FromStringAndSize(ubuf->buf, ubuf->pos);
++		uwsgi_buffer_destroy(ubuf);
++		return ret;
++	}
++	else {
++		buf = uwsgi_request_body_read(wsgi_req, arg_len, &rlen);
++	}
+ 	UWSGI_GET_GIL
+ 	if (buf == uwsgi.empty) {
+ 		return PyString_FromString("");
+Index: uwsgi/plugins/python/wsgi_subhandler.c
+===================================================================
+--- uwsgi.orig/plugins/python/wsgi_subhandler.c
++++ uwsgi/plugins/python/wsgi_subhandler.c
+@@ -179,6 +179,15 @@ void *uwsgi_request_subhandler_wsgi(stru
+ 
+         PyDict_SetItemString(wsgi_req->async_environ, "wsgi.input", wsgi_req->async_input);
+ 
++	if (up.wsgi_manage_chunked_input) {
++		if (wsgi_req->body_is_chunked) {
++			PyDict_SetItemString(wsgi_req->async_environ, "wsgi.input_terminated", Py_True);
++		}
++		else {
++			PyDict_SetItemString(wsgi_req->async_environ, "wsgi.input_terminated", Py_False);
++		}
++	}
++
+ 	if (!up.wsgi_disable_file_wrapper)
+ 		PyDict_SetItemString(wsgi_req->async_environ, "wsgi.file_wrapper", wi->sendfile);
+ 
+Index: uwsgi/t/python/wsgi_chunked.py
+===================================================================
+--- /dev/null
++++ uwsgi/t/python/wsgi_chunked.py
+@@ -0,0 +1,16 @@
++def application(environ, start_response):
++    print(environ)
++    start_response('200 OK', [])
++    if not environ['wsgi.input_terminated']:
++        return []
++#    print(environ['wsgi.input'].read())
++    data = environ['wsgi.input'].read(2)
++    print(data)
++    data = environ['wsgi.input'].read(2)
++    print(data)
++    data = environ['wsgi.input'].read(2)
++    print(data)
++    data = environ['wsgi.input'].read(6)
++    print(data)
++    print(environ['wsgi.input'].read())
++    return [data]
+Index: uwsgi/uwsgi.h
+===================================================================
+--- uwsgi.orig/uwsgi.h
++++ uwsgi/uwsgi.h
+@@ -1617,6 +1617,9 @@ struct wsgi_request {
+ 	// used for protocol parsers requiring EOF signaling
+ 	int proto_parser_eof;
+ 
++	int body_is_chunked;
++	struct uwsgi_buffer *body_chunked_buf;
++
+ 	// 64bit range, deprecates size_t __range_from, __range_to
+ 	enum uwsgi_range range_parsed;
+ 	int64_t range_from;
+@@ -4506,6 +4509,7 @@ struct uwsgi_buffer *uwsgi_websocket_rec
+ struct uwsgi_buffer *uwsgi_websocket_recv_nb(struct wsgi_request *);
+ 
+ char *uwsgi_chunked_read(struct wsgi_request *, size_t *, int, int);
++struct uwsgi_buffer *uwsgi_chunked_read_smart(struct wsgi_request *, size_t, int);
+ 
+ uint16_t uwsgi_be16(char *);
+ uint32_t uwsgi_be32(char *);
diff -Nru uwsgi-2.0.19.1/debian/patches/series uwsgi-2.0.19.1/debian/patches/series
--- uwsgi-2.0.19.1/debian/patches/series	2021-05-28 07:43:30.000000000 +0200
+++ uwsgi-2.0.19.1/debian/patches/series	2021-06-11 11:08:33.000000000 +0200
@@ -20,3 +20,4 @@
 1016_readline.patch
 1017_python3-compat.patch
 2001_ensure_verbose_build.patch
+Add_support_for_chunked_encoding.patch


More information about the pkg-uWSGI-devel mailing list