chiark / gitweb /
refactor body limit, for reuse in server, allow to discard data
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 8 Aug 2021 14:47:57 +0000 (15:47 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 8 Aug 2021 14:48:46 +0000 (15:48 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/client.rs
src/utils.rs

index 1f382bb7f8c8e69708fc90fb0ae88116b3948f6e..201ca8e760350c059cfa07476c210da3db2e0e9a 100644 (file)
@@ -143,7 +143,7 @@ fn submit_request<'r, 'c:'r, C:HCC>(
       let mut resp = resp.into_body();
       let max_body = c.ic.max_batch_down.sat() + MAX_OVERHEAD;
       let resp = read_limited_bytes(max_body, &mut resp).await
-        .context("fetching response body")?;
+        .discard_data().context("fetching response body")?;
 
       if ! status.is_success() {
         throw!(anyhow!("HTTP error status={} body={:?}",
index 0890cd5b9cbab4df721e5ab0c6f9ca959051da3d..a254b7b60e51acf0c7084817e78f7eaec94b3242 100644 (file)
@@ -25,6 +25,19 @@ pub enum ReadLimitedError {
   Hyper(#[from] hyper::Error),
 }
 
+impl ReadLimitedError {
+  pub fn discard_data(&mut self) { match self {
+    ReadLimitedError::Truncated { sofar,.. } => { mem::take(sofar); },
+    _ => { },
+  } }
+}
+#[ext(pub)]
+impl<T> Result<T,ReadLimitedError> {
+  fn discard_data(self) -> Self {
+    self.map_err(|mut e| { e.discard_data(); e })
+  }
+}
+
 #[throws(ReadLimitedError)]
 pub async fn read_limited_bytes<S>(limit: usize, stream: &mut S) -> Box<[u8]>
 where S: futures::Stream<Item=Result<hyper::body::Bytes,hyper::Error>>