Skip to content

Commit

Permalink
changes to make app.current_request thread safe when running chalice …
Browse files Browse the repository at this point in the history
…locally

- fixes race conditions that can occur when chalice is being run locally
  and it handling multiple concurrent requests
  • Loading branch information
Joel Tetrault committed Mar 6, 2020
1 parent b79470d commit 331616b
Showing 1 changed file with 29 additions and 1 deletion.
30 changes: 29 additions & 1 deletion chalice/local.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@ def time(self):

def create_local_server(app_obj, config, host, port):
# type: (Chalice, Config, str, int) -> LocalDevServer
return LocalDevServer(app_obj, config, host, port)
local_app_opj = app_obj # type: LocalChalice
local_app_opj.__class__ = LocalChalice
local_app_opj.initialize_current_request_lookup()
return LocalDevServer(local_app_opj, config, host, port)


class LocalARNBuilder(object):
Expand Down Expand Up @@ -661,3 +664,28 @@ def shutdown(self):
# type: () -> None
if self._server is not None:
self._server.shutdown()


class LocalChalice(Chalice):
def __init__(self, *args, **kwargs):
# type: (Any, Any) -> None
self._current_request_lookup = {} # type: Dict[int, dict]
super(LocalChalice, self).__init__(*args, **kwargs)

def initialize_current_request_lookup(self):
# type: () -> None
self._current_request_lookup = {}

@property
def current_request(self): # noqa
# type: () -> Optional[Request]
thread_id = threading.current_thread().ident
assert thread_id is not None
return self._current_request_lookup.get(thread_id, None)

@current_request.setter
def current_request(self, value): # noqa
# type: (Request) -> None
thread_id = threading.current_thread().ident
assert thread_id is not None
self._current_request_lookup[thread_id] = value

0 comments on commit 331616b

Please sign in to comment.