ordinary-utils 0.8.0

Utils for Ordinary
Documentation
// Copyright (C) 2026 Ordinary Labs, LLC.
//
// SPDX-License-Identifier: AGPL-3.0-only

use crate::get_http_version_str;
use axum::body::Body;
use axum::http::{HeaderValue, StatusCode, header};
use axum::response::{IntoResponse, Response};

pub fn get_response_for_forwarded(via_domain: &str, res: reqwest::Response) -> impl IntoResponse {
    let mut response_builder = Response::builder().status(res.status());

    if let Some(headers) = response_builder.headers_mut() {
        *headers = res.headers().clone();

        let res_version = get_http_version_str(res.version());

        let via = if let Some(src_via) = headers.get(header::VIA)
            && let Ok(src_via) = src_via.to_str()
        {
            format!("{src_via}, {res_version} {via_domain} (ordinaryd)")
        } else {
            format!("{res_version} {via_domain} (ordinaryd)")
        };

        if let Ok(via) = HeaderValue::from_str(&via) {
            headers.insert(header::VIA, via);
        }
    }

    match response_builder.body(Body::from_stream(res.bytes_stream())) {
        Ok(res) => res.into_response(),
        Err(err) => {
            tracing::error!(%err);
            StatusCode::INTERNAL_SERVER_ERROR.into_response()
        }
    }
}