Yes I was referring to validation on the WSGI side, file size was just an example. I know it's silly though since most validation should start also on the client side.
El domingo, 4 de marzo de 2018, 19:52:11 (UTC-3), Graham Dumpleton escribió: > > > On 5 Mar 2018, at 2:17 am, Cristiano Coelho <[email protected] > <javascript:>> wrote: > > Hi Graham, thanks for the response, that indeed looks like a tricky thing > to implement. > > There's another scenario that might also benefit from something like this, > for example, when uploading large files (I know this is usually not the > best thing to do, and rather it should be uploaded directly to the storage > such as S3) and you do some server side checks with python that ends up > with an error (such as checking the request content length to avoid large > uploads) even if you return a response right away with the error without > even touching the file, the user will still need to wait until the whole > file is uploaded (and probably saved locally as a temp file with django) > before getting the error back. > > > If you rely on LimitRequestBody directive in Apache to limit request > content size, it should be rejected before attempting to send the request > through to a daemon process. You should only have issue with waiting for > 413 response if was implemented in the WSGI application. > > Graham > > El domingo, 4 de marzo de 2018, 0:49:31 (UTC-3), Graham Dumpleton escribió: >> >> I got quite a lot done on mod_wsgi during my holidays, but that didn't >> include a simple answer to this. The idea I initially had couldn't work. >> The only way I have been able to work out that might work is when have >> request content and it is over a certain size, is to spawn a second thread >> for the request handler in Apache that handles pushing the request content >> through to the mod_wsgi daemon process, while the original thread deals >> with the response. This is obviously going to be tricky to implement and I >> ran out of time while I was on holidays. Am back busy at my day job now and >> so haven't had a chance to pursue it further. I haven't even released a new >> version with all of what I did manage to get done when on holidays, which I >> should really do. >> >> Graham >> >> On 3 Mar 2018, at 2:57 am, Cristiano Coelho <[email protected]> wrote: >> >> Hi Graham, got any updates related to this? Have been trying to reach out >> AWS to update their mod_wsgi versions but seems like an useless effort. >> >> >> >> El domingo, 10 de diciembre de 2017, 20:23:01 (UTC-3), Graham Dumpleton >> escribió: >>> >>> Anyway, am looking into something about how daemon mode works to see if >>> I can short circuit things to possibly partly avoid the problem. >>> >>> Will update later. >>> >>> Graham >>> >>> On 11 Dec 2017, at 10:21 am, Cristiano Coelho <[email protected]> >>> wrote: >>> >>> Sorry, I think it was a typo when I tried the commands, my tests were >>> with just HTTP after all, and I see the same issue, if I use HTTPS the >>> slowloris script just stops instantly. >>> >>> The logs from the main post were with HTTPS indeed but that's because >>> the server uses HTTPS. The local test was done only with HTTP. >>> >>> >>> El domingo, 10 de diciembre de 2017, 19:48:59 (UTC-3), Graham Dumpleton >>> escribió: >>>> >>>> I will try and provide a better explanation of why solving it is hard >>>> later, but if I change: >>>> >>>> slowhttptest -c 6 -B -i 10 -r 200 -s 8192 -t POST -u " >>>> https://localhost:8080/test" -x 10 -p 3 >>>> >>>> to: >>>> >>>> slowhttptest -c 6 -B -i 10 -r 200 -s 8192 -t POST -u " >>>> http://localhost:8080/test" -x 10 -p 3 >>>> >>>> Ie., non HTTPS, since mod_wsgi-express is only accepting HTTP, then I >>>> don't see any immediate response being logged in the access log. >>>> >>>> mod_wsgi-express start-server app.py --port 8080 --body-timeout 62 >>>> --log-to-terminal --access-log >>>> >>>> Other than that, the behaviour I see is as I would expect. >>>> >>>> Graham >>>> >>>> On 11 Dec 2017, at 5:06 am, Cristiano Coelho <[email protected]> >>>> wrote: >>>> >>>> Update: Here's a small wsgi test script, tested with a fresh apache >>>> mod_wsgi installation (through pip). >>>> >>>> The same issue can be easily replicated, and it seems that the only way >>>> to improve it is with the request timeout values (header and body), which >>>> sadly needs to be high when using AWS due to how the load balancer works >>>> (keeping open connections to the apache server to improve loading time). >>>> >>>> The same issue happens with another server like gunicorn, which they >>>> clearly state on their docs it's an issue that WILL happen unless the >>>> reverse proxy (nginx) is properly set up. Now for Apache + mod_wsgi, I >>>> would expect that apache is the reverse proxy (even if there's a load >>>> balancer before it) and it should help with the issue just like nginx and >>>> gunicorn, or even IIS + asp.net >>>> >>>> >>>> from flask import Flask, request, jsonify >>>> >>>> # pip install Flask >>>> >>>> # Testing flask >>>> # export FLASK_APP=app.py >>>> # flask run >>>> >>>> >>>> # Testing mod_wsgi >>>> # pip install mod_wsgi (and apache2 + apache2-dev before this if it's >>>> not installed) >>>> # Create user wsgi or change user >>>> # sudo -u wsgi mod_wsgi-express start-server app.py --port 8080 >>>> --body-timeout 62 >>>> # Set --body-timeout to simulate AWS setup >>>> >>>> # Interesting settings >>>> # --connect-timeout defaults to 15s >>>> # --queue-timeout defaults to 30s >>>> # --body-timeout defaults to 15s >>>> >>>> >>>> # Test slowloris: >>>> # apt-get install slowhttptest >>>> # 6 or a value > configured worked threads*processes >>>> # slowhttptest -c 6 -B -i 10 -r 200 -s 8192 -t POST -u " >>>> https://localhost:8080/test" -x 10 -p 3 >>>> # Note that GET also works in which case the request should be pretty >>>> much ignored since it's an unsupported method >>>> >>>> >>>> app = Flask(__name__) >>>> application = app # For mod_wsgi >>>> >>>> >>>> @app.route('/test', methods=['POST']) >>>> def test(): >>>> >>>> data = request.get_json(silent=True) or request.form >>>> >>>> if not data: >>>> r = jsonify({ >>>> 'out': '', >>>> 'err': 'No data provided' >>>> }) >>>> >>>> r.status_code = 400 >>>> >>>> else: >>>> r = jsonify({ >>>> 'out': data, >>>> 'err': None >>>> }) >>>> >>>> r.status_code = 200 >>>> >>>> return r >>>> >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "modwsgi" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at https://groups.google.com/group/modwsgi. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>>> >>>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "modwsgi" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at https://groups.google.com/group/modwsgi. >>> For more options, visit https://groups.google.com/d/optout. >>> >>> >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "modwsgi" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at https://groups.google.com/group/modwsgi. >> For more options, visit https://groups.google.com/d/optout. >> >> >> > -- > You received this message because you are subscribed to the Google Groups > "modwsgi" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] <javascript:>. > To post to this group, send email to [email protected] <javascript:> > . > Visit this group at https://groups.google.com/group/modwsgi. > For more options, visit https://groups.google.com/d/optout. > > > -- You received this message because you are subscribed to the Google Groups "modwsgi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/modwsgi. For more options, visit https://groups.google.com/d/optout.
