1
0
Fork 0

feat(router): support middleware, helper for binding middleware to handler

This commit is contained in:
ssube 2020-02-09 08:49:37 -06:00
parent 3ffc4bbf8a
commit b433c357bf
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
4 changed files with 46 additions and 11 deletions

View File

@ -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

View File

@ -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:

View File

@ -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')

View File

@ -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)