dax_fetcher_http 0.1.0

HTTP proof fetcher for dax-rs
Documentation
// SPDX-FileCopyrightText: 2024 Yarmo Mackenbach
//
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT

use dax_core::fetcher::{FetchedData, ProofFetchError};
pub use url::Url;

/// HTTP proof fetcher
pub struct HttpFetcher {}

impl HttpFetcher {
    /// Fetch a plaintext document over HTTP
    pub fn fetch_text(&self, url: Url) -> Result<FetchedData, dax_core::fetcher::ProofFetchError> {
        let result = ureq::get(url.as_str())
            .set(
                "User-Agent",
                format!("{}/{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")).as_str(),
            )
            .call();

        let response = match result {
            Ok(res) => res,
            Err(err) => match err {
                ureq::Error::Status(status, _) => return Err(ProofFetchError::HttpStatus(status)),
                ureq::Error::Transport(_) => return Err(ProofFetchError::Transport),
            },
        };

        let data = response.into_string()?;

        Ok(FetchedData::String(data))
    }
    /// Fetch a JSON document over HTTP
    pub fn fetch_json(&self, url: Url) -> Result<FetchedData, dax_core::fetcher::ProofFetchError> {
        let result = ureq::get(url.as_str())
            .set("Accept", "application/json")
            .set(
                "User-Agent",
                format!("{}/{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")).as_str(),
            )
            .call();

        let response = match result {
            Ok(res) => res,
            Err(err) => match err {
                ureq::Error::Status(status, _) => return Err(ProofFetchError::HttpStatus(status)),
                ureq::Error::Transport(_) => return Err(ProofFetchError::Transport),
            },
        };

        let data = response.into_json()?;

        Ok(FetchedData::Json(data))
    }
}