Skip to main content

ctclient_async/internal/
getentries.rs

1use std::convert::TryFrom;
2use std::ops::Range;
3
4use async_stream::try_stream;
5use futures::Stream;
6
7use crate::Error;
8use crate::jsons;
9
10use super::Leaf;
11use super::get_json;
12
13/// Request leaf entries from the CT log. Does not verify if these entries are
14/// consistent with the tree or anything like that. Returns an iterator over the
15/// leaves.
16///
17/// After the first Err result, the iterator will not produce anything else.
18///
19/// Uses `O(1)` memory itself.
20pub fn get_entries<'a>(
21    client: &'a reqwest::Client,
22    base_url: &'a reqwest::Url,
23    range: Range<u64>,
24    batch_size: u64,
25) -> impl Stream<Item = Result<Leaf, Error>> + 'a {
26    try_stream! {
27        let mut next_index = range.start;
28
29        while next_index < range.end {
30            let end = u64::min(next_index + batch_size, range.end);
31            let url = format!("ct/v1/get-entries?start={}&end={}", next_index, end - 1);
32
33            let entries: jsons::GetEntries = get_json(client, base_url, &url).await?;
34            if entries.entries.is_empty() {
35                break;
36            }
37
38            for entry in entries.entries {
39                let leaf = Leaf::try_from(&entry)?;
40                yield leaf;
41            }
42
43            next_index = end;
44        }
45    }
46}