request.get_data() is always empty because of flask/werkzeug bug with chunked transfer encoding #5
Description
The python3-flask template (and likely the python2) is bitten by this Flask issue: pallets/flask#2229
Flask / Werkzeug have a bug handling chunked transfer encoding--and perhaps any other time that Content-Length is not set--when combined with WSGI.
When the request is forwarded through the of-watchdog
process, http.NewRequest
is given a reference to the body io.ReadCloser
. Since that is a stream, the outbound request will always use chunked transfer encoding and no Content-Length.
This could be avoided by changing of-watchdog
to read the whole body into a buffer and then send it unchunked; but it would make more sense, I think, either to upgrade to a fixed version of Flask/Werkzeug (assuming there is one) or revert back to Flask's development server (app.run(...)
) rather than using gevent's WSGIServer, as the built-in server does not seem to be affected.
The following examples are using the same of-watchdog
and function code. The only difference is that the first one is using Flask with WSGIServer
and the second is using the Flask built-in server.
WSGI server
$ curl -i -XPOST -d "rawdsddddddddddddddddddddddd" 'http://127.0.0.1:9999/'
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Wed, 25 Jul 2018 23:33:36 GMT
Flask's server
$ curl -i -XPOST -d "rawdsddddddddddddddddddddddd" 'http://127.0.0.1:9999/'
HTTP/1.1 200 OK
Content-Length: 28
Content-Type: text/html; charset=utf-8
Date: Wed, 25 Jul 2018 23:31:29 GMT
Server: Werkzeug/0.14.1 Python/3.6.5
rawdsddddddddddddddddddddddd