git-next/crates/cli/src/server/actors/webhook/server.rs
Paul Campbell 834dff4370
All checks were successful
ci/woodpecker/push/cron-docker-builder Pipeline was successful
ci/woodpecker/push/push-next Pipeline was successful
ci/woodpecker/push/tag-created Pipeline was successful
chore: convert project into a cargo workspace
2024-05-11 16:33:18 +01:00

59 lines
2.2 KiB
Rust

use std::net::SocketAddr;
use actix::prelude::*;
use tracing::{debug, info};
use crate::server::actors::webhook::message::WebhookMessage;
pub async fn start(
socket_addr: SocketAddr,
address: actix::prelude::Recipient<super::message::WebhookMessage>,
) {
// start webhook server
use warp::Filter;
// Define the Warp route to handle incoming HTTP requests
let route = warp::post()
.map(move || address.clone())
.and(warp::path::param())
// .and(warp::query::raw())
.and(warp::header::headers_cloned())
.and(warp::body::bytes())
.and_then(
|recipient: Recipient<WebhookMessage>,
path,
// query: String,
headers: warp::http::HeaderMap,
body: bytes::Bytes| async move {
let bytes = body.to_vec();
let request_data = String::from_utf8_lossy(&bytes).to_string();
let id = ulid::Ulid::new().to_string();
match headers.get("Authorization") {
Some(auhorisation) => {
debug!(id, path, "Received webhook");
let authorisation = auhorisation
.to_str()
.map_err(|_| warp::reject())? // valid characters
.strip_prefix("Basic ")
.ok_or_else(warp::reject)? // must start with "Basic "
.to_string();
let message = WebhookMessage::new(
id,
path,
/* query, headers, */ request_data,
authorisation,
);
recipient
.try_send(message)
.map(|_| warp::reply::with_status("OK", warp::http::StatusCode::OK))
.map_err(|_| warp::reject())
}
_ => Err(warp::reject()),
}
},
);
// Start the server
info!("Starting webhook server: {}", socket_addr);
warp::serve(route).run(socket_addr).await;
}