···11-use allegedly::{Db, ListenConf, bin::GlobalArgs, bin_init, pages_to_pg, poll_upstream, serve};
11+use allegedly::{
22+ Db, ExperimentalConf, ListenConf, bin::GlobalArgs, bin_init, pages_to_pg, poll_upstream, serve,
33+};
24use clap::Parser;
35use reqwest::Url;
46use std::{net::SocketAddr, path::PathBuf};
···3941 #[arg(long, requires("acme_domain"), env = "ALLEGEDLY_ACME_DIRECTORY_URL")]
4042 #[clap(default_value = "https://acme-v02.api.letsencrypt.org/directory")]
4143 acme_directory_url: Url,
4242- /// listen for ipv6
4444+ /// try to listen for ipv6
4345 #[arg(long, action, requires("acme_domain"), env = "ALLEGEDLY_ACME_IPV6")]
4446 acme_ipv6: bool,
4747+ /// only accept experimental requests at this hostname
4848+ ///
4949+ /// a cert will be provisioned for it from letsencrypt. if you're not using
5050+ /// acme (eg., behind a tls-terminating reverse proxy), open a feature request.
5151+ #[arg(
5252+ long,
5353+ requires("acme_domain"),
5454+ env = "ALLEGEDLY_EXPERIMENTAL_ACME_DOMAIN"
5555+ )]
5656+ experimental_acme_domain: Option<String>,
5757+ /// accept writes! by forwarding them upstream
5858+ #[arg(long, action, env = "ALLEGEDLY_EXPERIMENTAL_WRITE_UPSTREAM")]
5959+ experimental_write_upstream: bool,
4560}
46614762pub async fn run(
···5570 acme_cache_path,
5671 acme_directory_url,
5772 acme_ipv6,
7373+ experimental_acme_domain,
7474+ experimental_write_upstream,
5875 }: Args,
5976) -> anyhow::Result<()> {
6077 let db = Db::new(wrap_pg.as_str(), wrap_pg_cert).await?;
···7996 }
8097 (bind, true, None) => ListenConf::Bind(bind),
8198 (_, _, _) => unreachable!(),
9999+ };
100100+101101+ let experimental_conf = ExperimentalConf {
102102+ acme_domain: experimental_acme_domain,
103103+ write_upstream: experimental_write_upstream,
82104 };
8310584106 let mut tasks = JoinSet::new();
···9011291113 tasks.spawn(poll_upstream(Some(latest), poll_url, send_page));
92114 tasks.spawn(pages_to_pg(db.clone(), recv_page));
9393- tasks.spawn(serve(upstream, wrap, listen_conf, db.clone()));
115115+ tasks.spawn(serve(
116116+ upstream,
117117+ wrap,
118118+ listen_conf,
119119+ experimental_conf,
120120+ db.clone(),
121121+ ));
9412295123 while let Some(next) = tasks.join_next().await {
96124 match next {
+2-2
src/lib.rs
···1515pub use backfill::backfill;
1616pub use cached_value::{CachedValue, Fetcher};
1717pub use client::{CLIENT, UA};
1818-pub use mirror::{ListenConf, serve};
1818+pub use mirror::{ExperimentalConf, ListenConf, serve};
1919pub use plc_pg::{Db, backfill_to_pg, pages_to_pg};
2020pub use poll::{PageBoundaryState, get_page, poll_upstream};
2121-pub use ratelimit::GovernorMiddleware;
2121+pub use ratelimit::{CreatePlcOpLimiter, GovernorMiddleware, IpLimiters};
2222pub use weekly::{BundleSource, FolderSource, HttpSource, Week, pages_to_weeks, week_to_pages};
23232424pub type Dt = chrono::DateTime<chrono::Utc>;