Skip to content

Commit 228c39b

Browse files
committed
Make V1Context::process_response response &[u8]
Simplify the function signature to take a bytes slice instead of a generic reader.
1 parent 8708c86 commit 228c39b

4 files changed

Lines changed: 20 additions & 37 deletions

File tree

payjoin-cli/src/app/v1.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,10 @@ impl AppTrait for App {
8888
"Sent fallback transaction hex: {:#}",
8989
payjoin::bitcoin::consensus::encode::serialize_hex(&fallback_tx)
9090
);
91-
let psbt = ctx.process_response(&mut response.bytes().await?.to_vec().as_slice()).map_err(
92-
|e| {
93-
log::debug!("Error processing response: {e:?}");
94-
anyhow!("Failed to process response {e}")
95-
},
96-
)?;
91+
let psbt = ctx.process_response(&response.bytes().await?).map_err(|e| {
92+
log::debug!("Error processing response: {e:?}");
93+
anyhow!("Failed to process response {e}")
94+
})?;
9795

9896
self.process_pj_response(psbt)?;
9997
Ok(())

payjoin-cli/src/app/v2/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ impl App {
230230
println!("Posting Original PSBT Payload request...");
231231
let response = post_request(req).await?;
232232
println!("Sent fallback transaction");
233-
match v1_ctx.process_response(&mut response.bytes().await?.to_vec().as_slice()) {
233+
match v1_ctx.process_response(&response.bytes().await?) {
234234
Ok(psbt) => Ok(psbt),
235235
Err(re) => {
236236
println!("{re}");

payjoin/src/send/v1.rs

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -275,18 +275,12 @@ impl V1Context {
275275
/// Call this method with response from receiver to continue BIP78 flow. If the response is
276276
/// valid you will get appropriate PSBT that you should sign and broadcast.
277277
#[inline]
278-
pub fn process_response(
279-
self,
280-
response: &mut impl std::io::Read,
281-
) -> Result<Psbt, ResponseError> {
282-
let mut buf_reader = BufReader::with_capacity(MAX_CONTENT_LENGTH + 1, response);
283-
let buffer = buf_reader.fill_buf().map_err(InternalValidationError::Io)?;
284-
285-
if buffer.len() > MAX_CONTENT_LENGTH {
278+
pub fn process_response(self, response: &[u8]) -> Result<Psbt, ResponseError> {
279+
if response.len() > MAX_CONTENT_LENGTH {
286280
return Err(ResponseError::from(InternalValidationError::ContentTooLarge));
287281
}
288282

289-
let res_str = std::str::from_utf8(buffer).map_err(|_| InternalValidationError::Parse)?;
283+
let res_str = std::str::from_utf8(response).map_err(|_| InternalValidationError::Parse)?;
290284
let proposal = Psbt::from_str(res_str).map_err(|_| ResponseError::parse(res_str))?;
291285
self.psbt_context.process_proposal(proposal).map_err(Into::into)
292286
}
@@ -334,7 +328,7 @@ mod test {
334328
"message": "This version of payjoin is not supported."
335329
})
336330
.to_string();
337-
match ctx.process_response(&mut known_json_error.as_bytes()) {
331+
match ctx.process_response(known_json_error.as_bytes()) {
338332
Err(ResponseError::WellKnown(WellKnownError {
339333
code: ErrorCode::VersionUnsupported,
340334
..
@@ -348,27 +342,23 @@ mod test {
348342
"message": "This version of payjoin is not supported."
349343
})
350344
.to_string();
351-
match ctx.process_response(&mut invalid_json_error.as_bytes()) {
345+
match ctx.process_response(invalid_json_error.as_bytes()) {
352346
Err(ResponseError::Validation(_)) => (),
353347
_ => panic!("Expected unrecognized JSON error"),
354348
}
355349
}
356350

357351
#[test]
358352
fn process_response_valid() {
359-
let mut cursor = std::io::Cursor::new(PAYJOIN_PROPOSAL.as_bytes());
360-
361353
let ctx = create_v1_context();
362-
let response = ctx.process_response(&mut cursor);
354+
let response = ctx.process_response(PAYJOIN_PROPOSAL.as_bytes());
363355
assert!(response.is_ok())
364356
}
365357

366358
#[test]
367359
fn process_response_invalid_psbt() {
368-
let mut cursor = std::io::Cursor::new(INVALID_PSBT.as_bytes());
369-
370360
let ctx = create_v1_context();
371-
let response = ctx.process_response(&mut cursor);
361+
let response = ctx.process_response(INVALID_PSBT.as_bytes());
372362
match response {
373363
Ok(_) => panic!("Invalid PSBT should have caused an error"),
374364
Err(error) => match error {
@@ -386,11 +376,10 @@ mod test {
386376
#[test]
387377
fn process_response_invalid_utf8() {
388378
// In UTF-8, 0xF0 represents the start of a 4-byte sequence, so 0xF0 by itself is invalid
389-
let invalid_utf8 = [0xF0];
390-
let mut cursor = std::io::Cursor::new(invalid_utf8);
379+
let invalid_utf8 = &[0xF0];
391380

392381
let ctx = create_v1_context();
393-
let response = ctx.process_response(&mut cursor);
382+
let response = ctx.process_response(invalid_utf8);
394383
match response {
395384
Ok(_) => panic!("Invalid UTF-8 should have caused an error"),
396385
Err(error) => match error {

payjoin/tests/integration.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ mod integration {
100100
// **********************
101101
// Inside the Sender:
102102
// Sender checks, signs, finalizes, extracts, and broadcasts
103-
let checked_payjoin_proposal_psbt = ctx.process_response(&mut response.as_bytes())?;
103+
let checked_payjoin_proposal_psbt = ctx.process_response(response.as_bytes())?;
104104
let payjoin_tx = extract_pj_tx(&sender, checked_payjoin_proposal_psbt)?;
105105
sender.send_raw_transaction(&payjoin_tx)?;
106106

@@ -565,7 +565,7 @@ mod integration {
565565
// **********************
566566
// Inside the Sender:
567567
// Sender checks, signs, finalizes, extracts, and broadcasts
568-
let checked_payjoin_proposal_psbt = ctx.process_response(&mut response.as_bytes())?;
568+
let checked_payjoin_proposal_psbt = ctx.process_response(response.as_bytes())?;
569569
let payjoin_tx = extract_pj_tx(&sender, checked_payjoin_proposal_psbt)?;
570570
sender.send_raw_transaction(&payjoin_tx)?;
571571

@@ -694,9 +694,8 @@ mod integration {
694694
log::info!("Response: {:#?}", &response);
695695
assert!(response.status().is_success(), "error response: {}", response.status());
696696

697-
let res = response.bytes().await?.to_vec();
698697
let checked_payjoin_proposal_psbt =
699-
send_ctx.process_response(&mut res.as_slice())?;
698+
send_ctx.process_response(&response.bytes().await?)?;
700699
let payjoin_tx = extract_pj_tx(&sender, checked_payjoin_proposal_psbt)?;
701700
sender.send_raw_transaction(&payjoin_tx)?;
702701
log::info!("sent");
@@ -984,10 +983,7 @@ mod integration {
984983
.await?;
985984
assert!(response.status().is_success());
986985

987-
finalize_ctx.process_response(
988-
response.bytes().await?.to_vec().as_slice(),
989-
ohttp_response_ctx,
990-
)?;
986+
finalize_ctx.process_response(&response.bytes().await?, ohttp_response_ctx)?;
991987
}
992988

993989
//**********************
@@ -1183,7 +1179,7 @@ mod integration {
11831179
// **********************
11841180
// Inside the Sender:
11851181
// Sender checks, signs, finalizes, extracts, and broadcasts
1186-
let checked_payjoin_proposal_psbt = ctx.process_response(&mut response.as_bytes())?;
1182+
let checked_payjoin_proposal_psbt = ctx.process_response(response.as_bytes())?;
11871183
let payjoin_tx = extract_pj_tx(&sender, checked_payjoin_proposal_psbt)?;
11881184
sender.send_raw_transaction(&payjoin_tx)?;
11891185

@@ -1269,7 +1265,7 @@ mod integration {
12691265
// **********************
12701266
// Inside the Sender:
12711267
// Sender checks, signs, finalizes, extracts, and broadcasts
1272-
let checked_payjoin_proposal_psbt = ctx.process_response(&mut response.as_bytes())?;
1268+
let checked_payjoin_proposal_psbt = ctx.process_response(response.as_bytes())?;
12731269
let payjoin_tx = extract_pj_tx(&sender, checked_payjoin_proposal_psbt)?;
12741270
sender.send_raw_transaction(&payjoin_tx)?;
12751271

0 commit comments

Comments
 (0)