Run the ephemeral callback server for the OIDC redirect. Listens for `GET /callback?code=...&state=...`.
(
listener: TcpListener,
tx: oneshot::Sender<String>,
expected_state: String,
)
| 346 | /// |
| 347 | /// Listens for `GET /callback?code=...&state=...`. |
| 348 | async fn run_oidc_callback_server( |
| 349 | listener: TcpListener, |
| 350 | tx: oneshot::Sender<String>, |
| 351 | expected_state: String, |
| 352 | ) { |
| 353 | let state = Arc::new(CallbackState { |
| 354 | expected_state, |
| 355 | tx: Mutex::new(Some(tx)), |
| 356 | }); |
| 357 | |
| 358 | loop { |
| 359 | let Ok((stream, _)) = listener.accept().await else { |
| 360 | return; |
| 361 | }; |
| 362 | let state = Arc::clone(&state); |
| 363 | tokio::spawn(async move { |
| 364 | let service = service_fn(move |req| { |
| 365 | let state = Arc::clone(&state); |
| 366 | async move { Ok::<_, Infallible>(handle_oidc_callback(req, state)) } |
| 367 | }); |
| 368 | |
| 369 | if let Err(error) = Builder::new(TokioExecutor::new()) |
| 370 | .serve_connection(TokioIo::new(stream), service) |
| 371 | .await |
| 372 | { |
| 373 | debug!(error = %error, "OIDC callback server connection failed"); |
| 374 | } |
| 375 | }); |
| 376 | } |
| 377 | } |
| 378 | |
| 379 | fn handle_oidc_callback( |
| 380 | req: hyper::Request<hyper::body::Incoming>, |
no test coverage detected