By the way, for some reason, if you use offload threads, the above configurations (1 and 2) do not work (the client gets a 202). I have not yet been able to figure out what is causing this.
It is possible to either disable them entirely or disable them only for this feature by changing the http router from "http" to "proxyhttp" which ignores offload threads even if they are available. Mathieu Le mer. 29 mai 2019 à 13:46, mathieu lacage <mathieu.lac...@alcmeon.com> a écrit : > Hi, > > In case anyone stumbles upon this question, I eventually found a working > solution, documented below. FYI, I am going to use 2. upon production > deployments. > > 1. "standard" HTTP headers: this is the solution I tried to get to work > earlier without understanding that: > - the rewrite plugin rewrites the variables, not the input HTTP request > - the http router plugin supports a third undocumented argument that is > the PATH argument that will be injected in the forwarded query > - uwsgi does not support the syntax "route = http:${VAR}" where > VAR=val1,val2,val3. Instead, it requires "route = > http:${VAR1},${VAR2},${VAR3}" > > The application side: > 222 handler.response.headers['X-Sendurl'] = 'true' > 223 handler.response.headers['X-Sendurl-IP'] = '%s:%d' % > (socket.gethostbyname(url.hostname), url.port if url.port is not None else > 80) > 224 handler.response.headers['X-Sendurl-Host'] = url.hostname > 225 handler.response.headers['X-Sendurl-Path-Query'] = "%s?%s" % > (url.path, url.query) > > The configuration file: > 29 collect-header = X-Sendurl X_SENDURL > 30 response-route-if-not = empty:${X_SENDURL} goto:xsendurl > 32 response-route-run = last: > > 45 response-route-label = xsendurl > 46 collect-header = X-Sendurl-IP X_SENDURL_IP > 47 collect-header = X-Sendurl-Host X_SENDURL_HOST > 48 collect-header = X-Sendurl-Path-Query X_SENDURL_PATH_QUERY > 49 response-route-run = > http:${X_SENDURL_IP},${X_SENDURL_HOST},${X_SENDURL_PATH_QUERY} > 51 response-route-run = last: > > 2. "variables". It is possible to shorten slightly the above to this: > > The application side: > 216 import uwsgi > 217 uwsgi.add_var("SEND_URL", "y") > 218 uwsgi.add_var("SEND_URL_IP", '%s:%d' % > (socket.gethostbyname(url.hostname), url.port if url.port is not None else > 80)) > 219 uwsgi.add_var("SEND_URL_HOST", url.hostname) > 220 uwsgi.add_var("SEND_URL_PATH_QUERY", "%s?%s" % (url.path, > url.query)) > > The configuration side: > > 31 response-route-if = equal:${SEND_URL};y goto:xsendurl > 32 response-route-run = last: > 44 > 45 response-route-label = xsendurl > 50 response-route-run = > http:${SEND_URL_IP},${SEND_URL_HOST},${SEND_URL_PATH_QUERY} > 51 response-route-run = last: > > 3. Sadly, the even shorter version below does not work because of issue > #1041 (https://github.com/unbit/uwsgi/issues/1041) which appears to be > fixed by the unmerged patch: > https://github.com/unbit/uwsgi/pull/1473/commits/b71dc90b82c1e8e640d0c449d535171b19a08d9d > > The application side: > 216 import uwsgi > 221 uwsgi.route("http", "%s:%d,%s,%s?%s" % > (socket.gethostbyname(url.hostname), url.port if url.port is not None else > 80, url.hostname, url.path, url.query)) > > The configuration side: none > > I hope this help, > Mathieu > > > Le mar. 28 mai 2019 à 15:29, mathieu lacage <mathieu.lac...@alcmeon.com> > a écrit : > >> hi, >> >> I am trying to implement X-sendurl in my application using uwsgi. I >> modified my app to generate a couple of http headers: >> >> 215 handler.response.headers['X-Sendurlhost'] = '%s:%d,%s' % >> (socket.gethostbyname(url.hostname), url.port if url.port is not None else >> 80, url.hostname) >> 216 handler.response.headers['X-Sendurlpathqs'] = "%s?%s" % >> (url.path, url.query) >> 217 handler.response.set_status(200) >> >> and I configured my uwsgi server as follows: >> >> 29 collect-header = X-Sendurlpathqs X_SENDURLPATHQS >> 30 collect-header = X-Sendurlhost X_SENDURLHOST >> 31 response-route-if-not = empty:${X_SENDURLPATHQS} goto:xsendurl >> 32 response-route-run = last: >> >> [snip] >> >> 45 response-route-label = xsendurl >> 46 response-route-run = rewrite:${X_SENDURLPATHQS} >> 48 response-route-run = http:${X_SENDURLHOST} >> 49 response-route-run = last: >> >> The above configuration appears to hit and execute correctly line 48 above >> >> with the following values: >> >> X_SENDURLHOST=137.74.127.78:80,storage.gra3.cloud.ovh.net >> >> X_SENDURLPATHQS=/v1/AUTH_7542981824cf4bcb883cf4c4321195ae/prod/companies/8/users-profile-attachments/4165024?temp_url_sig=49d3ec9ee9d5fd5aa447fc70162e6fb72c564e99&temp_url_expires=1559049647 >> >> I read very carefully the documentation at >> https://uwsgi-docs.readthedocs.io/en/latest/InternalRouting.html and I >> would expect the above to forward an HTTP request to IP 137.74.127.78 on >> port 80 with HTTP header HOST=storage.gra3.cloud.ovh.net and >> PATH=/v1/AUTH_7542981824cf4... >> >> However, tcpdump shows instead the following request: >> >> GET >> /admin/8/users-profile-attachments/?user_id=5172075&site_id=154&site_type=2 >> HTTP/1.0 >> Host: localhost:9090 >> ... >> >> HTTP/1.1 401 Unauthorized >> Content-Length: 131 >> Content-Type: text/html; charset=UTF-8 >> Www-Authenticate: Swift realm="8" >> WWW-Authenticate: Keystone uri='https://auth.cloud.ovh.net/' >> ... >> >> So, uwsgi is connecting to the right IP and port, but it's not sending >> what I would expect for the HOST HTTP header and HTTP PATH. >> >> Is there something I should adjust in my uwsgi configuration to make it >> forward the Host+PATH headers I want ? >> >> Mathieu >> -- >> Mathieu Lacage <mathieu.lac...@alcmeon.com> >> > > > -- > Mathieu Lacage <mathieu.lac...@alcmeon.com> > -- Mathieu Lacage <mathieu.lac...@alcmeon.com>
_______________________________________________ uWSGI mailing list uWSGI@lists.unbit.it http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi