Skip to content

Commit cf75a3e

Browse files
Merge pull request hugapi#311 from timothycrosley/feature/fix-middleware-method-binding
Feature/fix middleware method binding
2 parents 13ad76e + a027d42 commit cf75a3e

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Changelog
1313
=========
1414
### 2.1.2
1515
- Fixed an issue with sharing exception handlers accross multiple modules (Thanks @soloman1124)
16+
- Fixed how single direction (response / request) middlewares are bounded to work when code is Cython compiled
1617

1718
### 2.1.1
1819
- Hot-fix release to ensure input formats don't die with unexpected parameters

hug/decorators.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,14 @@ def request_middleware(api=None):
9090
"""Registers a middleware function that will be called on every request"""
9191
def decorator(middleware_method):
9292
apply_to_api = hug.API(api) if api else hug.api.from_object(middleware_method)
93-
middleware_method.__self__ = middleware_method
94-
apply_to_api.http.add_middleware(namedtuple('MiddlewareRouter', ('process_request', ))(middleware_method))
93+
94+
class MiddlewareRouter(object):
95+
__slots__ = ()
96+
97+
def process_request(self, request, response):
98+
return middleware_method(request, response)
99+
100+
apply_to_api.http.add_middleware(MiddlewareRouter())
95101
return middleware_method
96102
return decorator
97103

@@ -100,8 +106,14 @@ def response_middleware(api=None):
100106
"""Registers a middleware function that will be called on every response"""
101107
def decorator(middleware_method):
102108
apply_to_api = hug.API(api) if api else hug.api.from_object(middleware_method)
103-
middleware_method.__self__ = middleware_method
104-
apply_to_api.http.add_middleware(namedtuple('MiddlewareRouter', ('process_response', ))(middleware_method))
109+
110+
class MiddlewareRouter(object):
111+
__slots__ = ()
112+
113+
def process_response(self, request, response, resource):
114+
return middleware_method(request, response, resource)
115+
116+
apply_to_api.http.add_middleware(MiddlewareRouter())
105117
return middleware_method
106118
return decorator
107119

0 commit comments

Comments
 (0)