pib-service-api-auth-oidc 0.18.0

pib-service edit API authorization using OIDC
Documentation
// SPDX-FileCopyrightText: Politik im Blick developers
// SPDX-FileCopyrightText: Wolfgang Silbermayr <wolfgang@silbermayr.at>
//
// SPDX-License-Identifier: AGPL-3.0-or-later OR EUPL-1.2

use std::{ops::Deref, pin::Pin};

use openidconnect::{AsyncHttpClient, HttpClientError, HttpRequest, HttpResponse};

#[derive(Debug, Clone)]
pub(crate) struct ClientWrapper(pub reqwest::Client);

impl<'c> AsyncHttpClient<'c> for ClientWrapper {
    type Error = HttpClientError<reqwest::Error>;

    type Future =
        Pin<Box<dyn Future<Output = Result<HttpResponse, Self::Error>> + Send + Sync + 'c>>;

    fn call(&'c self, request: HttpRequest) -> Self::Future {
        Box::pin(async move {
            let response = self
                .0
                .execute(request.try_into().map_err(Box::new)?)
                .await
                .map_err(Box::new)?;

            let mut builder = http::Response::builder()
                .status(response.status())
                .version(response.version());

            for (name, value) in response.headers().iter() {
                builder = builder.header(name, value);
            }

            builder
                .body(response.bytes().await.map_err(Box::new)?.to_vec())
                .map_err(HttpClientError::Http)
        })
    }
}

impl From<reqwest::Client> for ClientWrapper {
    fn from(value: reqwest::Client) -> Self {
        Self(value)
    }
}

impl From<&reqwest::Client> for ClientWrapper {
    fn from(value: &reqwest::Client) -> Self {
        Self(value.clone())
    }
}

impl Deref for ClientWrapper {
    type Target = reqwest::Client;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}