///|
let request_id_counter : Ref[Int64] = Ref::new(0L)

///|
/// Returns a middleware that assigns a unique `X-Request-Id` header to every
/// request and response.
pub fn request_id() -> Middleware {
  async fn(event, next) noraise {
    let id = match event.req.get_header("X-Request-Id") {
      Some(existing) => existing
      None => {
        request_id_counter.val += 1L
        "req-\{request_id_counter.val}"
      }
    }
    // Set on request headers so handlers can access via event.request_id()
    event.req.headers.set("X-Request-Id", id)
    let res = next()
    // Set on response so clients can correlate
    event.res.headers.set("X-Request-Id", id)
    res
  }
}

///|
/// Returns the request ID for this event, or `None` if the middleware is not active.
pub fn MocketEvent::request_id(self : MocketEvent) -> String? {
  self.req.get_header("X-Request-Id")
}