feat(router): support middleware, helper for binding middleware to handler
This commit is contained in:
parent
3ffc4bbf8a
commit
b433c357bf
|
@ -1,19 +1,34 @@
|
|||
def response(content, status='200 OK'):
|
||||
from prometheus_express.server import http_default_status
|
||||
|
||||
|
||||
def response(content, status=http_default_status):
|
||||
return {
|
||||
'status': status,
|
||||
'content': content,
|
||||
}
|
||||
|
||||
|
||||
def errorHandler(headers, body):
|
||||
def error_handler(headers, body):
|
||||
return response('Not Found', '404 Not Found')
|
||||
|
||||
|
||||
def bind_middleware(handler, middleware=[]):
|
||||
def invoke(headers, body):
|
||||
for m in middleware:
|
||||
r = m(headers, body)
|
||||
if r != None:
|
||||
return r
|
||||
|
||||
return handler(headers, body)
|
||||
|
||||
return invoke
|
||||
|
||||
|
||||
def validate_route(handler):
|
||||
return (len(handler) == 3 and
|
||||
type(handler[0]) == str and
|
||||
type(handler[1]) == str and
|
||||
callable(handler[2]))
|
||||
type(handler[0]) == str and
|
||||
type(handler[1]) == str and
|
||||
callable(handler[2]))
|
||||
|
||||
|
||||
class Router():
|
||||
|
@ -50,4 +65,4 @@ class Router():
|
|||
if r[0] == method and r[1] == path:
|
||||
return r[2]
|
||||
|
||||
return errorHandler
|
||||
return error_handler
|
||||
|
|
|
@ -10,7 +10,8 @@ def start_http_server(port, address='0.0.0.0', depth=2, timeout=5.0):
|
|||
bind_address = (address, port)
|
||||
|
||||
http_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
http_socket.bind(bind_address) # lgtm [py/bind-socket-all-network-interfaces]
|
||||
# lgtm [py/bind-socket-all-network-interfaces]
|
||||
http_socket.bind(bind_address)
|
||||
http_socket.listen(depth)
|
||||
|
||||
try:
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
from unittest.mock import MagicMock
|
||||
import unittest
|
||||
import prometheus_express.router as pr
|
||||
|
||||
|
||||
class ErrorTest(unittest.TestCase):
|
||||
def test(self):
|
||||
r = pr.errorHandler('', '')
|
||||
r = pr.error_handler('', '')
|
||||
self.assertEqual(r['status'], '404 Not Found')
|
||||
|
||||
|
||||
|
@ -14,7 +15,7 @@ class RouterTest(unittest.TestCase):
|
|||
r.register('GET', '/foo', lambda headers, body: pr.response(''))
|
||||
|
||||
h = r.select('GET', '/bar')
|
||||
self.assertEqual(h, pr.errorHandler)
|
||||
self.assertEqual(h, pr.error_handler)
|
||||
|
||||
def test_match(self):
|
||||
def c(headers, body): return ''
|
||||
|
@ -65,4 +66,22 @@ class RouterTest(unittest.TestCase):
|
|||
r = pr.Router()
|
||||
|
||||
with self.assertRaises(ValueError):
|
||||
r.register('GET', '/', '')
|
||||
r.register('GET', '/', '')
|
||||
|
||||
|
||||
class MiddlewareTest(unittest.TestCase):
|
||||
def test_bind(self):
|
||||
middleware = [
|
||||
MagicMock(return_value=None),
|
||||
MagicMock(return_value=None),
|
||||
]
|
||||
handler = MagicMock(return_value=pr.response('foo'))
|
||||
|
||||
bound = pr.bind_middleware(handler, middleware)
|
||||
headers = {}
|
||||
response = bound(headers, '')
|
||||
|
||||
middleware[0].assert_called_once()
|
||||
middleware[1].assert_called_once()
|
||||
handler.assert_called_once()
|
||||
self.assertEqual(response['content'], 'foo')
|
||||
|
|
|
@ -62,4 +62,4 @@ class ServerAcceptTest(unittest.TestCase):
|
|||
r.register('GET', '/', lambda headers, req: body)
|
||||
|
||||
with self.assertRaises(ValueError):
|
||||
s.accept(r)
|
||||
s.accept(r)
|
||||
|
|
Loading…
Reference in New Issue