Skip to content

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

Architecture overview

Lifecycle overview

Lifecycle overview

Installation

pip install md.http.server.wsgi --index-url https://source.md.land/python/

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)