From bb26a701bc976a9d62e22820c4e1bec26c533aac Mon Sep 17 00:00:00 2001 From: Nutomic Date: Mon, 25 Nov 2024 16:43:34 +0000 Subject: [PATCH] Proxy pictrs healthz endpoint (#5224) --- api_tests/src/image.spec.ts | 3 +++ crates/routes/src/images.rs | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/api_tests/src/image.spec.ts b/api_tests/src/image.spec.ts index ed96451a2..7ac6e7221 100644 --- a/api_tests/src/image.spec.ts +++ b/api_tests/src/image.spec.ts @@ -41,6 +41,9 @@ afterAll(async () => { }); test("Upload image and delete it", async () => { + const healthz = await fetch(alphaUrl + "/pictrs/healthz"); + expect(healthz.status).toBe(200); + // Before running this test, you need to delete all previous images in the DB await deleteAllImages(alpha); diff --git a/crates/routes/src/images.rs b/crates/routes/src/images.rs index 54fe4ea83..fe91fa42c 100644 --- a/crates/routes/src/images.rs +++ b/crates/routes/src/images.rs @@ -38,7 +38,8 @@ pub fn config( ) // This has optional query params: /image/{filename}?format=jpg&thumbnail=256 .service(web::resource("/pictrs/image/{filename}").route(web::get().to(full_res))) - .service(web::resource("/pictrs/image/delete/{token}/{filename}").route(web::get().to(delete))); + .service(web::resource("/pictrs/image/delete/{token}/{filename}").route(web::get().to(delete))) + .service(web::resource("/pictrs/healthz").route(web::get().to(healthz))); } trait ProcessUrl { @@ -250,6 +251,25 @@ async fn delete( Ok(HttpResponse::build(convert_status(res.status())).body(BodyStream::new(res.bytes_stream()))) } +async fn healthz( + req: HttpRequest, + client: web::Data, + context: web::Data, +) -> LemmyResult { + let pictrs_config = context.settings().pictrs_config()?; + let url = format!("{}healthz", pictrs_config.url); + + let mut client_req = adapt_request(&req, &client, url); + + if let Some(addr) = req.head().peer_addr { + client_req = client_req.header("X-Forwarded-For", addr.to_string()); + } + + let res = client_req.send().await?; + + Ok(HttpResponse::build(convert_status(res.status())).body(BodyStream::new(res.bytes_stream()))) +} + pub async fn image_proxy( Query(params): Query, req: HttpRequest,