Skip to content

Commit d5df3d0

Browse files
committed
Add option to include headers in Esplora config
This is useful if the esplora server has a form of authentication in front of it
1 parent 57e1fb1 commit d5df3d0

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

src/builder.rs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ const LSPS_HARDENED_CHILD_INDEX: u32 = 577;
8787
enum ChainDataSourceConfig {
8888
Esplora {
8989
server_url: String,
90+
headers: HashMap<String, String>,
9091
sync_config: Option<EsploraSyncConfig>,
9192
},
9293
Electrum {
@@ -294,9 +295,28 @@ impl NodeBuilder {
294295
/// information.
295296
pub fn set_chain_source_esplora(
296297
&mut self, server_url: String, sync_config: Option<EsploraSyncConfig>,
298+
) -> &mut Self {
299+
self.chain_data_source_config = Some(ChainDataSourceConfig::Esplora {
300+
server_url,
301+
headers: Default::default(),
302+
sync_config,
303+
});
304+
self
305+
}
306+
307+
/// Configures the [`Node`] instance to source its chain data from the given Esplora server.
308+
///
309+
/// The given `headers` will be included in all requests to the Esplora server, typically used for
310+
/// authentication purposes.
311+
///
312+
/// If no `sync_config` is given, default values are used. See [`EsploraSyncConfig`] for more
313+
/// information.
314+
pub fn set_chain_source_esplora_with_headers(
315+
&mut self, server_url: String, headers: HashMap<String, String>,
316+
sync_config: Option<EsploraSyncConfig>,
297317
) -> &mut Self {
298318
self.chain_data_source_config =
299-
Some(ChainDataSourceConfig::Esplora { server_url, sync_config });
319+
Some(ChainDataSourceConfig::Esplora { server_url, headers, sync_config });
300320
self
301321
}
302322

@@ -754,6 +774,24 @@ impl ArcedNodeBuilder {
754774
self.inner.write().unwrap().set_chain_source_esplora(server_url, sync_config);
755775
}
756776

777+
/// Configures the [`Node`] instance to source its chain data from the given Esplora server.
778+
///
779+
/// The given `headers` will be included in all requests to the Esplora server, typically used for
780+
/// authentication purposes.
781+
///
782+
/// If no `sync_config` is given, default values are used. See [`EsploraSyncConfig`] for more
783+
/// information.
784+
pub fn set_chain_source_esplora_with_headers(
785+
&self, server_url: String, headers: HashMap<String, String>,
786+
sync_config: Option<EsploraSyncConfig>,
787+
) {
788+
self.inner.write().unwrap().set_chain_source_esplora_with_headers(
789+
server_url,
790+
headers,
791+
sync_config,
792+
);
793+
}
794+
757795
/// Configures the [`Node`] instance to source its chain data from the given Electrum server.
758796
///
759797
/// If no `sync_config` is given, default values are used. See [`ElectrumSyncConfig`] for more
@@ -1117,10 +1155,11 @@ fn build_with_store_internal(
11171155
));
11181156

11191157
let chain_source = match chain_data_source_config {
1120-
Some(ChainDataSourceConfig::Esplora { server_url, sync_config }) => {
1158+
Some(ChainDataSourceConfig::Esplora { server_url, headers, sync_config }) => {
11211159
let sync_config = sync_config.unwrap_or(EsploraSyncConfig::default());
11221160
Arc::new(ChainSource::new_esplora(
11231161
server_url.clone(),
1162+
headers.clone(),
11241163
sync_config,
11251164
Arc::clone(&wallet),
11261165
Arc::clone(&fee_estimator),
@@ -1187,6 +1226,7 @@ fn build_with_store_internal(
11871226
let sync_config = EsploraSyncConfig::default();
11881227
Arc::new(ChainSource::new_esplora(
11891228
server_url.clone(),
1229+
HashMap::new(),
11901230
sync_config,
11911231
Arc::clone(&wallet),
11921232
Arc::clone(&fee_estimator),

src/chain/mod.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,21 +233,31 @@ pub(crate) enum ChainSource {
233233

234234
impl ChainSource {
235235
pub(crate) fn new_esplora(
236-
server_url: String, sync_config: EsploraSyncConfig, onchain_wallet: Arc<Wallet>,
237-
fee_estimator: Arc<OnchainFeeEstimator>, tx_broadcaster: Arc<Broadcaster>,
238-
kv_store: Arc<DynStore>, config: Arc<Config>, logger: Arc<Logger>,
239-
node_metrics: Arc<RwLock<NodeMetrics>>,
236+
server_url: String, headers: HashMap<String, String>, sync_config: EsploraSyncConfig,
237+
onchain_wallet: Arc<Wallet>, fee_estimator: Arc<OnchainFeeEstimator>,
238+
tx_broadcaster: Arc<Broadcaster>, kv_store: Arc<DynStore>, config: Arc<Config>,
239+
logger: Arc<Logger>, node_metrics: Arc<RwLock<NodeMetrics>>,
240240
) -> Self {
241241
// FIXME / TODO: We introduced this to make `bdk_esplora` work separately without updating
242242
// `lightning-transaction-sync`. We should revert this as part of of the upgrade to LDK 0.2.
243243
let mut client_builder_0_11 = esplora_client_0_11::Builder::new(&server_url);
244244
client_builder_0_11 = client_builder_0_11.timeout(DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS);
245+
246+
for (header_name, header_value) in &headers {
247+
client_builder_0_11 = client_builder_0_11.header(header_name, header_value);
248+
}
249+
245250
let esplora_client_0_11 = client_builder_0_11.build_async().unwrap();
246251
let tx_sync =
247252
Arc::new(EsploraSyncClient::from_client(esplora_client_0_11, Arc::clone(&logger)));
248253

249254
let mut client_builder = esplora_client::Builder::new(&server_url);
250255
client_builder = client_builder.timeout(DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS);
256+
257+
for (header_name, header_value) in &headers {
258+
client_builder = client_builder.header(header_name, header_value);
259+
}
260+
251261
let esplora_client = client_builder.build_async().unwrap();
252262

253263
let onchain_wallet_sync_status = Mutex::new(WalletSyncStatus::Completed);

0 commit comments

Comments
 (0)