Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions core/src/polling_monitor/ipfs_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ mod test {
use std::time::Duration;

use graph::components::link_resolver::ArweaveClient;
use graph::components::link_resolver::ArweaveResolver;
use graph::data::value::Word;
use graph::ipfs::test_utils::add_files_to_local_ipfs_node_for_testing;
use graph::ipfs::{IpfsContext, IpfsMetrics, IpfsRpcClient, ServerAddress};
Expand Down Expand Up @@ -158,8 +157,9 @@ mod test {
async fn arweave_get() {
const ID: &str = "8APeQ5lW0-csTcBaGdPBDLAL2ci2AT9pTn2tppGPU_8";

let cl = ArweaveClient::default();
let body = cl.get(&Word::from(ID)).await.unwrap();
let Some(body) = ArweaveClient::get_test(&Word::from(ID)).await else {
return;
};
let body = String::from_utf8(body).unwrap();

let expected = r#"
Expand Down
40 changes: 34 additions & 6 deletions graph/src/components/link_resolver/arweave.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,25 @@ impl ArweaveClient {
client: Client::builder().gzip(false).build().unwrap(),
}
}

/// Make a request to arweave.net to fetch the content of the file with
/// the given txid/filename. Returns `None` if `arweave.net` is not
/// reachable.
#[cfg(debug_assertions)]
pub async fn get_test(file: &Base64) -> Option<Vec<u8>> {
let client = Self::default();

match client.get(file).await {
Ok(resp) => Some(resp),
Err(ArweaveClientError::ServerUnavailable(_)) => {
eprintln!("arweave.net is not reachable, skipping arweave tests");
None
}
Err(e) => {
panic!("Failed to fetch from arweave.net: {:?}", e);
}
}
}
}

#[async_trait]
Expand All @@ -77,6 +96,13 @@ impl ArweaveResolver for ArweaveClient {
.await
.map_err(ArweaveClientError::from)?;

println!("Got response from arweave.net with status {}", rsp.status());
if rsp.status() == reqwest::StatusCode::GATEWAY_TIMEOUT {
return Err(ArweaveClientError::ServerUnavailable(
self.base_url.to_string(),
));
}

match (&limit, rsp.content_length()) {
(_, None) => return Err(ArweaveClientError::UnableToCheckFileSize),
(FileSizeLimit::MaxBytes(max), Some(cl)) if cl > *max => {
Expand Down Expand Up @@ -114,16 +140,15 @@ pub enum ArweaveClientError {
FileTooLarge { got: u64, max: u64 },
#[error("Unknown error")]
Unknown(#[from] reqwest::Error),
#[error("Server {0} unavailable")]
ServerUnavailable(String),
}

#[cfg(test)]
mod test {
use serde_derive::Deserialize;

use crate::{
components::link_resolver::{ArweaveClient, ArweaveResolver},
data_source::offchain::Base64,
};
use crate::{components::link_resolver::ArweaveClient, data_source::offchain::Base64};

// This test ensures that passing txid/filename works when the txid refers to manifest.
// the actual data seems to have some binary header and footer so these ranges were found
Expand All @@ -136,8 +161,11 @@ mod test {
pub manifest: String,
}

let client = ArweaveClient::default();
let no_header = &client.get(&url).await.unwrap()[1295..320078];
let Some(body) = ArweaveClient::get_test(&url).await else {
return;
};

let no_header = &body[1295..320078];
let content: Manifest = serde_json::from_slice(no_header).unwrap();
assert_eq!(
content,
Expand Down
Loading