[ https://issues.apache.org/jira/browse/AIRFLOW-2190?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16784251#comment-16784251 ]
ASF subversion and git services commented on AIRFLOW-2190: ---------------------------------------------------------- Commit 0a29b3910d2f82646cf3bf003bff9d79de75fcbf in airflow's branch refs/heads/v1-10-stable from Andrew Stahlman [ https://gitbox.apache.org/repos/asf?p=airflow.git;h=0a29b39 ] [AIRFLOW-2190] Fix TypeError when returning 404 (#4596) When processing HTTP response headers, gunicorn checks that the name of each header is a string. Here's the relevant gunicorn code: >From gunicorn/http/wsgi.py, line 257 def process_headers(self, headers): for name, value in headers: if not isinstance(name, string_types): raise TypeError('%r is not a string' % name) In Python3, `string_types` is set to the built-in `str`. For Python 2, it's set to `basestring`. Again, the relevant gunicorn code: >From gunicorn/six.py, line 38: if PY3: string_types = str, ... else: string_types = basestring, On Python2 the `b''` syntax returns a `str`, but in Python3 it returns `bytes`. `bytes` != `str`, so we get the following error when returning a 404 on Python3: File "/usr/local/lib/python3.6/site-packages/airflow/www/app.py", line 166, in root_app resp(b'404 Not Found', [(b'Content-Type', b'text/plain')]) File "/usr/local/lib/python3.6/site-packages/gunicorn/http/wsgi.py", line 261, in start_response self.process_headers(headers) File "/usr/local/lib/python3.6/site-packages/gunicorn/http/wsgi.py", line 268, in process_headers raise TypeError('%r is not a string' % name) TypeError: b'Content-Type' is not a string Dropping the `b` prefix in favor of the single-quote string syntax should work for both Python2 and 3, as demonstrated below: Python 3.7.2 (default, Jan 13 2019, 12:50:15) [Clang 10.0.0 (clang-1000.11.45.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> isinstance('foo', str) True Python 2.7.15 (default, Jan 12 2019, 21:43:48) [GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> isinstance('foo', basestring) True > base_url with a subpath generates TypeError > ------------------------------------------- > > Key: AIRFLOW-2190 > URL: https://issues.apache.org/jira/browse/AIRFLOW-2190 > Project: Apache Airflow > Issue Type: Bug > Components: webserver > Affects Versions: 1.9.0, 1.10.1 > Reporter: John Arnold > Assignee: Andrew Stahlman > Priority: Major > Fix For: 1.10.3 > > > I'm running into what looks like a bug in airflow webserver. Running against > master: > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: > [2018-03-07 18:20:13 +0000] [102] [ERROR] Error handling request / > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: Traceback > (most recent call last): > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: File > "/usr/local/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 135, > in handle > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: > self.handle_request(listener, req, client, addr) > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: File > "/usr/local/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 176, > in handle_request > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: respiter = > self.wsgi(environ, resp.start_response) > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: File > "/usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py", line 826, in call > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: return > app(environ, start_response) > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: File > "/usr/local/lib/python3.6/site-packages/airflow/www/app.py", line 166, in > root_app > Mar 7 18:20:13 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: resp(b'404 > Not Found', [(b'Content-Type', b'text/plain')]) > Mar 7 18:20:14 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: File > "/usr/local/lib/python3.6/site-packages/gunicorn/http/wsgi.py", line 261, in > start_response > Mar 7 18:20:14 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: > self.process_headers(headers) > Mar 7 18:20:14 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: File > "/usr/local/lib/python3.6/site-packages/gunicorn/http/wsgi.py", line 268, in > process_headers > Mar 7 18:20:14 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: raise > TypeError('%r is not a string' % name) > Mar 7 18:20:14 netdocker1-eastus2 daemon INFO ca5ce9db3af6[92630]: TypeError: > b'Content-Type' is not a string > > I just started using the base_url to put the webserver behind nginx proxy > under a sub-path, elg [http://domain.com/airflow] > I've tried following the docs for nginx proxy, i.e. > [webserver] > base_url = [http://localhost/airflow|http://airflow-web/airflow] > > I've also tried setting the base_url to the fully-qualified endpoint: > base_url = [https://example.com/airflow|https://domain.com/airflow] > > Neither work, both give the TypeError exception. > > If I remove the sub-path: > base_url = [https://example.com|https://domain.com/] > then the app starts and runs ok and i can access it on the host but not > through the proxy. > > -- This message was sent by Atlassian JIRA (v7.6.3#76005)