diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8c66a38ac3d132c2cf00a7ed291941712ae3b896 GIT binary patch literal 32038 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 rT*3n67m%MoegpXt) -> String { format!( r#"{} -This is a PLC[1] mirror running Allegedly[2] in mirror mode. Allegedly synchronizes and proxies to a downstream PLC reference server instance[3] (why?[4]). +This is a PLC[1] mirror running Allegedly in mirror mode. Mirror mode wraps and +synchronizes a local PLC reference server instance[2] (why?[3]). Configured upstream: @@ -34,23 +35,35 @@ Configured upstream: Available APIs: - - All PLC GET requests [5]. - - Rejects POSTs. This is a mirror. + - GET /_health Health and version info - try `GET /{{did}}` to resolve an identity + - GET /* Proxies to wrapped server; see PLC API docs: + https://web.plc.directory/api/redoc + - POST /* Always rejected. This is a mirror. + + + tip: try `GET /{{did}}` to resolve an identity + + +Allegedly is a suit of open-source CLI tools for working with PLC logs: + + https://tangled.org/@microcosm.blue/Allegedly -[1] https://web.plc.directory -[2] https://tangled.org/@microcosm.blue/Allegedly -[3] https://github.com/did-method-plc/did-method-plc -[4] https://updates.microcosm.blue/3lz7nwvh4zc2u -[5] https://web.plc.directory/api/redoc +[1] https://web.plc.directory +[2] https://github.com/did-method-plc/did-method-plc +[3] https://updates.microcosm.blue/3lz7nwvh4zc2u "#, logo("mirror") ) } +#[handler] +fn favicon() -> impl IntoResponse { + include_bytes!("../favicon.ico").with_content_type("image/x-icon") +} + fn failed_to_reach_wrapped() -> String { format!( r#"{} @@ -204,6 +217,7 @@ pub async fn serve(upstream: Url, plc: Url, listen: ListenConf) -> anyhow::Resul let app = Route::new() .at("/", get(hello)) + .at("/favicon.ico", get(favicon)) .at("/_health", get(health)) .at("/:any", get(proxy).post(nope)) .with(AddData::new(state)) @@ -273,7 +287,10 @@ You probably want to change your request to use HTTPS instead of HTTP. ) } - let app = Route::new().at("/", get(oop_plz_be_secure)).with(Tracing); + let app = Route::new() + .at("/", get(oop_plz_be_secure)) + .at("/favicon.ico", get(favicon)) + .with(Tracing); Server::new(TcpListener::bind("0.0.0.0:80")) .name("allegedly (mirror:80 helper)") .run(app)