Skip to content

Commit

Permalink
Merge pull request #12 from KixPanganiban/feature/request-event-middl…
Browse files Browse the repository at this point in the history
…eware

Added RequestEventMiddleware and the ability to access the request_event
  • Loading branch information
tjoelsson committed Jul 28, 2016
2 parents 46e9bae + 4065c88 commit 1a26bf1
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
9 changes: 9 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@ Zask Changelog

Here you can see the full list of changes between each Zask release.

Version 1.9.3
-------------

released on July 28th 2016

* Added RequestEventMiddleware
* request_event now accessible inside service endpoint via get_request_event()


Version 1.9.2
-------------

Expand Down
2 changes: 1 addition & 1 deletion zask/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-

__version__ = '1.9.2'
__version__ = '1.9.3'

import gevent
from gevent.local import local
Expand Down
43 changes: 42 additions & 1 deletion zask/ext/zerorpc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,12 @@
CONFIG_CUSTOME_HEADER_MIDDLEWARE = 'header'
ACCESS_LOG_MIDDLEWARE = 'access_log'
REQUEST_CHAIN_MIDDLEWARE = 'uuid'
REQUEST_EVENT_MIDDLEWARE = 'event'
DEFAULT_MIDDLEWARES = [
CONFIG_CUSTOME_HEADER_MIDDLEWARE,
REQUEST_CHAIN_MIDDLEWARE,
ACCESS_LOG_MIDDLEWARE
ACCESS_LOG_MIDDLEWARE,
REQUEST_EVENT_MIDDLEWARE
]


Expand Down Expand Up @@ -235,6 +237,15 @@ def client_before_request(self, event):
'uuid': self.get_uuid(),
})

class RequestEventMiddleware(object):
"""Exposes the request_event to the object being passed to Server()
via self.get_request_event() from a service endpoint.
"""

def server_before_exec(self, request_event):
"""Injects the request_event into greenlet's local storage context.
"""
setattr(_request_ctx.stash, 'request_event', request_event)

class AccessLogMiddleware(object):

Expand Down Expand Up @@ -386,6 +397,10 @@ def _init_zerorpc_context(self):

if ACCESS_LOG_MIDDLEWARE in self._middlewares:
context.register_middleware(AccessLogMiddleware(self.app))

if REQUEST_EVENT_MIDDLEWARE in self._middlewares:
context.register_middleware(RequestEventMiddleware())

_Server.__context__ = _Client.__context__ = context

def register_middleware(self, middleware):
Expand Down Expand Up @@ -436,6 +451,10 @@ def __init__(self, methods=None, context=None, **kargs):
heartbeat=heartbeat,
**kargs)

# Inject get_request_event *after* Server constructor so that
# it's not exposed to the RPC from the outside.
methods.get_request_event = self._get_request_event

for instance in context_._middlewares:
if isinstance(instance, ConfigEndpointMiddleware):
if methods.__version__ is None:
Expand All @@ -449,6 +468,16 @@ def __init__(self, methods=None, context=None, **kargs):
if isinstance(instance, AccessLogMiddleware):
instance.set_class_name(methods.__class__.__name__)

def _get_request_event(self):
"""Returns the request_event from the local greenlet storage.
Requires RequestEventMiddleware to be enabled to work.
"""
enabled_middlewares = [mw.__class__.__name__ for mw in
self.__context__._middlewares]
if 'RequestEventMiddleware' not in enabled_middlewares:
raise MissingMiddlewareException('RequestEventMiddleware')
return getattr(_request_ctx.stash, 'request_event')


class _Client(zerorpc.Client):

Expand Down Expand Up @@ -585,3 +614,15 @@ class NoNameException(Exception):

def __str__(self):
return "__service_name__ is needed for ZeroRPC server"


class MissingMiddlewareException(Exception):
"""Raised when Zask tries to invoke a functionality provided
by a specific middleware, but that middleware is not loaded.
"""

def __init__(self, middleware):
self.middleware = middleware

def __str__(self):
return 'Missing required middleware {}.'.format(self.middleware)

0 comments on commit 1a26bf1

Please sign in to comment.