Documentation
Overview
md.http.server.wsgi component provides contract to convert WSGI and PSR HTTP message models between themselves. Designed to use md.http.server application via WSGI interface.
Notice
This component provides only contract without its implementation, if it is required, take a look for md.http.server.wsgi.werkzeug.
Architecture overview
Lifecycle overview
Installation
Usage example
# ./bin/wsgi-app.py
import psr.http.server
import psr.http.message
import md.http.message.wsgi
import md.wsgi
__all__ = (
'app' # expose your WSGI application, so WSGI server could invoke it
)
class WSGIAdapter(
md.http.message.wsgi.RequestAdapterInterface,
md.http.message.wsgi.ResponseAdapterInterface
):
def create_request(self, environment: md.wsgi.RequestEnvironmentType) -> psr.http.message.ServerRequestInterface:
... # todo implementation
def create_response(self, response: psr.http.message.ResponseInterface) -> md.wsgi.ResponseCallableType:
... # todo implementation
def app(
request_environment: md.wsgi.RequestEnvironmentType,
start_response: md.wsgi.StartResponseCallableType
) -> md.wsgi.ResponseType:
# arrange
application = ... # application that operates PSR request/response
assert isinstance(application, psr.http.server.RequestHandlerInterface)
wsgi_adapter = WSGIAdapter()
assert isinstance(wsgi_adapter, md.http.message.wsgi.RequestAdapterInterface)
# act
psr_request = wsgi_adapter.create_request(environment=request_environment)
assert isinstance(psr_request, psr.http.message.ServerRequestInterface)
response = application.handle(request=psr_request)
assert isinstance(psr_request, psr.http.message.ResponseInterface)
assert isinstance(wsgi_adapter, md.http.message.wsgi.ResponseAdapterInterface)
wsgi_response = wsgi_adapter.create_response(response=response)
assert isinstance(wsgi_response, md.wsgi.ResponseCallableType)
# Invoke WSGI response
return wsgi_response(request_environment, start_response)