From 7bcfeb08946e64642b33f4b099ff235ba8527697 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Fri, 11 Oct 2024 15:33:40 -0400 Subject: Add a `server` header to responses. --- src/cli.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/cli.rs b/src/cli.rs index 2552f90..1c0d007 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -3,10 +3,15 @@ //! This module supports running `hi` as a freestanding program, via the //! [`Args`] struct. -use std::io; - -use axum::{middleware, Router}; -use clap::Parser; +use std::{future, io}; + +use axum::{ + http::header, + middleware, + response::{IntoResponse, Response}, + Router, +}; +use clap::{CommandFactory, Parser}; use sqlx::sqlite::SqlitePool; use tokio::net; @@ -32,6 +37,7 @@ use crate::{app::App, boot, channel, clock, db, event, expire, login, message, u /// ``` #[derive(Parser)] #[command( + version, about = "Run the `hi` server.", long_about = r#"Run the `hi` server. @@ -81,6 +87,7 @@ impl Args { expire::middleware, )) .route_layer(middleware::from_fn(clock::middleware)) + .route_layer(middleware::map_response(Self::server_info())) .with_state(app); let listener = self.listener().await?; @@ -106,6 +113,17 @@ impl Args { async fn pool(&self) -> Result { db::prepare(&self.database_url, &self.backup_database_url).await } + + fn server_info() -> impl Clone + Fn(Response) -> future::Ready { + let command = Self::command(); + let name = command.get_name(); + let version = command.get_version().unwrap_or("unknown version"); + let version = format!("{name}/{version}"); + move |resp| { + let response = ([(header::SERVER, &version)], resp).into_response(); + future::ready(response) + } + } } fn routers() -> Router { -- cgit v1.2.3