@@ -56,6 +56,25 @@ impl ArweaveClient {
5656 client : Client :: builder ( ) . gzip ( false ) . build ( ) . unwrap ( ) ,
5757 }
5858 }
59+
60+ /// Make a request to arweave.net to fetch the content of the file with
61+ /// the given txid/filename. Returns `None` if `arweave.net` is not
62+ /// reachable.
63+ #[ cfg( debug_assertions) ]
64+ pub async fn get_test ( file : & Base64 ) -> Option < Vec < u8 > > {
65+ let client = Self :: default ( ) ;
66+
67+ match client. get ( file) . await {
68+ Ok ( resp) => Some ( resp) ,
69+ Err ( ArweaveClientError :: ServerUnavailable ( _) ) => {
70+ eprintln ! ( "arweave.net is not reachable, skipping arweave tests" ) ;
71+ None
72+ }
73+ Err ( e) => {
74+ panic ! ( "Failed to fetch from arweave.net: {:?}" , e) ;
75+ }
76+ }
77+ }
5978}
6079
6180#[ async_trait]
@@ -77,6 +96,13 @@ impl ArweaveResolver for ArweaveClient {
7796 . await
7897 . map_err ( ArweaveClientError :: from) ?;
7998
99+ println ! ( "Got response from arweave.net with status {}" , rsp. status( ) ) ;
100+ if rsp. status ( ) == reqwest:: StatusCode :: GATEWAY_TIMEOUT {
101+ return Err ( ArweaveClientError :: ServerUnavailable (
102+ self . base_url . to_string ( ) ,
103+ ) ) ;
104+ }
105+
80106 match ( & limit, rsp. content_length ( ) ) {
81107 ( _, None ) => return Err ( ArweaveClientError :: UnableToCheckFileSize ) ,
82108 ( FileSizeLimit :: MaxBytes ( max) , Some ( cl) ) if cl > * max => {
@@ -114,16 +140,15 @@ pub enum ArweaveClientError {
114140 FileTooLarge { got : u64 , max : u64 } ,
115141 #[ error( "Unknown error" ) ]
116142 Unknown ( #[ from] reqwest:: Error ) ,
143+ #[ error( "Server {0} unavailable" ) ]
144+ ServerUnavailable ( String ) ,
117145}
118146
119147#[ cfg( test) ]
120148mod test {
121149 use serde_derive:: Deserialize ;
122150
123- use crate :: {
124- components:: link_resolver:: { ArweaveClient , ArweaveResolver } ,
125- data_source:: offchain:: Base64 ,
126- } ;
151+ use crate :: { components:: link_resolver:: ArweaveClient , data_source:: offchain:: Base64 } ;
127152
128153 // This test ensures that passing txid/filename works when the txid refers to manifest.
129154 // the actual data seems to have some binary header and footer so these ranges were found
@@ -136,8 +161,11 @@ mod test {
136161 pub manifest : String ,
137162 }
138163
139- let client = ArweaveClient :: default ( ) ;
140- let no_header = & client. get ( & url) . await . unwrap ( ) [ 1295 ..320078 ] ;
164+ let Some ( body) = ArweaveClient :: get_test ( & url) . await else {
165+ return ;
166+ } ;
167+
168+ let no_header = & body[ 1295 ..320078 ] ;
141169 let content: Manifest = serde_json:: from_slice ( no_header) . unwrap ( ) ;
142170 assert_eq ! (
143171 content,
0 commit comments