createMiddleware function
Creates a Middleware using the provided functions.
If provided, requestHandler
receives a Request. It can respond to
the request by returning a Response or Future<Response>.
requestHandler
can also return null
for some or all requests in which
case the request is sent to the inner Handler.
If provided, responseHandler
is called with the Response generated
by the inner Handler. Responses generated by requestHandler
are not
sent to responseHandler
.
responseHandler
should return either a Response or
Future<Response>. It may return the response parameter it receives or
create a new response object.
If provided, errorHandler
receives errors thrown by the inner handler. It
does not receive errors thrown by requestHandler
or responseHandler
, nor
does it receive HijackExceptions. It can either return a new response or
throw an error.
Implementation
Middleware createMiddleware({
FutureOr<Response?> Function(Request)? requestHandler,
FutureOr<Response> Function(Response)? responseHandler,
FutureOr<Response> Function(Object error, StackTrace)? errorHandler,
}) {
requestHandler ??= (request) => null;
responseHandler ??= (response) => response;
FutureOr<Response> Function(Object, StackTrace)? onError;
if (errorHandler != null) {
onError = (error, stackTrace) {
if (error is HijackException) throw error;
return errorHandler(error, stackTrace);
};
}
return (Handler innerHandler) {
return (request) {
return Future.sync(() => requestHandler!(request)).then((response) {
if (response != null) return response;
return Future.sync(() => innerHandler(request))
.then((response) => responseHandler!(response), onError: onError);
});
};
};
}