-
Notifications
You must be signed in to change notification settings - Fork 2
/
app.py
58 lines (39 loc) · 1.47 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# coding=utf-8
from __future__ import division, print_function
import logging
import os
import signal
import sys
from openaerialmap.web import app
logging.basicConfig(level=logging.INFO)
LOG = logging.getLogger(__name__)
def handler(signum, frame):
LOG.warning("Request timed out; crashing in place of cleanup.")
sys.exit(1)
# Register the signal function handler
signal.signal(signal.SIGALRM, handler)
class TimeoutMiddleware:
def __init__(self, app, timeout):
self.timeout = timeout
self.wrapped_app = app
def __call__(self, environ, start_response):
# set an interval timer in float seconds
signal.setitimer(signal.ITIMER_REAL, self.timeout / 1000)
try:
return self.wrapped_app(environ, start_response)
finally:
# clear the interval timer
signal.setitimer(signal.ITIMER_REAL, 0)
class HostMiddleware:
def __init__(self, app):
self.wrapped_app = app
def __call__(self, environ, start_response):
# treat X-Forwarded-Host as Host
environ["HTTP_HOST"] = environ.get(
"HTTP_X_FORWARDED_HOST", environ.get("HTTP_HOST")
)
return self.wrapped_app(environ, start_response)
# TODO make this configurable (or base it on an X-header containing the amount of time remaining)
app.wsgi_app = HostMiddleware(TimeoutMiddleware(app.wsgi_app, 14000))
if __name__ == "__main__":
app.run(host="0.0.0.0", port=int(os.getenv("PORT", 8000)))