From 506ca48dc8f6d985083bd6b765d95f9ce35c8d85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <bkchr@users.noreply.github.com>
Date: Wed, 17 Nov 2021 11:35:21 +0100
Subject: [PATCH] Offchain testing: Fix reading response (#10294)

---
 .../primitives/core/src/offchain/testing.rs   |  2 +-
 .../primitives/runtime/src/offchain/http.rs   | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/substrate/primitives/core/src/offchain/testing.rs b/substrate/primitives/core/src/offchain/testing.rs
index 26bcdb66de8..29b9edb03de 100644
--- a/substrate/primitives/core/src/offchain/testing.rs
+++ b/substrate/primitives/core/src/offchain/testing.rs
@@ -341,7 +341,7 @@ impl offchain::Externalities for TestOffchainExt {
 				Ok(0)
 			} else {
 				let read = std::cmp::min(buffer.len(), response[req.read..].len());
-				buffer[0..read].copy_from_slice(&response[req.read..read]);
+				buffer[0..read].copy_from_slice(&response[req.read..req.read + read]);
 				req.read += read;
 				Ok(read)
 			}
diff --git a/substrate/primitives/runtime/src/offchain/http.rs b/substrate/primitives/runtime/src/offchain/http.rs
index 469f2fb5aff..a8c82e616a4 100644
--- a/substrate/primitives/runtime/src/offchain/http.rs
+++ b/substrate/primitives/runtime/src/offchain/http.rs
@@ -535,6 +535,38 @@ mod tests {
 		})
 	}
 
+	#[test]
+	fn should_send_huge_response() {
+		let (offchain, state) = testing::TestOffchainExt::new();
+		let mut t = TestExternalities::default();
+		t.register_extension(OffchainWorkerExt::new(offchain));
+
+		t.execute_with(|| {
+			let request: Request = Request::get("http://localhost:1234");
+			let pending = request.add_header("X-Auth", "hunter2").send().unwrap();
+			// make sure it's sent correctly
+			state.write().fulfill_pending_request(
+				0,
+				testing::PendingRequest {
+					method: "GET".into(),
+					uri: "http://localhost:1234".into(),
+					headers: vec![("X-Auth".into(), "hunter2".into())],
+					sent: true,
+					..Default::default()
+				},
+				vec![0; 5923],
+				None,
+			);
+
+			// wait
+			let response = pending.wait().unwrap();
+
+			let body = response.body();
+			assert_eq!(body.clone().collect::<Vec<_>>(), vec![0; 5923]);
+			assert_eq!(body.error(), &None);
+		})
+	}
+
 	#[test]
 	fn should_send_a_post_request() {
 		let (offchain, state) = testing::TestOffchainExt::new();
-- 
GitLab