@@ -21,6 +21,7 @@ use crate::payment::{Bolt11Payment, Bolt12Payment, OnchainPayment};
2121use crate :: types:: HRNResolver ;
2222use crate :: Config ;
2323use std:: sync:: Arc ;
24+ use std:: time:: Duration ;
2425use std:: vec:: IntoIter ;
2526
2627use lightning:: ln:: channelmanager:: PaymentId ;
@@ -35,6 +36,7 @@ use bitcoin::{Amount, Txid};
3536use bitcoin_payment_instructions:: {
3637 amount:: Amount as BPIAmount , PaymentInstructions , PaymentMethod ,
3738} ;
39+ use tokio:: time:: timeout;
3840
3941type Uri < ' a > = bip21:: Uri < ' a , NetworkChecked , Extras > ;
4042
@@ -160,13 +162,25 @@ impl UnifiedPayment {
160162 Error :: HrnResolverNotConfigured
161163 } ) ?;
162164
163- let instructions =
164- PaymentInstructions :: parse ( uri_str, self . config . network , resolver. as_ref ( ) , false )
165- . await
166- . map_err ( |e| {
167- log_error ! ( self . logger, "Failed to parse payment instructions: {:?}" , e) ;
168- Error :: UriParameterParsingFailed
169- } ) ?;
165+ const TIMEOUT_DURATION : Duration = Duration :: from_secs ( 30 ) ;
166+
167+ let instructions = timeout (
168+ TIMEOUT_DURATION ,
169+ PaymentInstructions :: parse ( uri_str, self . config . network , resolver. as_ref ( ) , false ) ,
170+ )
171+ . await
172+ . map_err ( |_| {
173+ log_error ! (
174+ self . logger,
175+ "Payment instruction parsing timed out after {:?}" ,
176+ TIMEOUT_DURATION
177+ ) ;
178+ Error :: TimeoutOccurred
179+ } ) ?
180+ . map_err ( |e| {
181+ log_error ! ( self . logger, "Failed to parse payment instructions: {:?}" , e) ;
182+ Error :: UriParameterParsingFailed
183+ } ) ?;
170184
171185 let resolved = match instructions {
172186 PaymentInstructions :: ConfigurableAmount ( instr) => {
0 commit comments