requestIdMiddleware function

Middleware requestIdMiddleware({
  1. String headerName = 'X-Request-Id',
})

Middleware that attaches a unique X-Request-Id header to every request/response pair.

If the incoming request already carries an X-Request-Id header that value is propagated; otherwise a new random ID is generated.

Pipeline()
  .addMiddleware(requestIdMiddleware())
  .addHandler(router.handler)

The request ID is stored in request.context['requestId'] so downstream handlers can read it for logging or tracing.

Implementation

Middleware requestIdMiddleware({
  /// Override the header name. Defaults to `X-Request-Id`.
  String headerName = 'X-Request-Id',
}) {
  return (Handler inner) {
    return (Request request) async {
      final id = request.headers[headerName] ?? _generateId();

      final updatedRequest = request.change(
        context: {...request.context, 'requestId': id},
      );

      final response = await inner(updatedRequest);

      return response.change(
        headers: {
          ...response.headersAll.map((k, v) => MapEntry(k, v.join(','))),
          headerName: id,
        },
      );
    };
  };
}