@@ -9,6 +9,7 @@ use crate::jsonrpc::{transports::JsonRpcTransport, JsonRpcMethod, JsonRpcRespons
9
9
pub struct HttpTransport {
10
10
client : Client ,
11
11
url : Url ,
12
+ headers : Vec < ( String , String ) > ,
12
13
}
13
14
14
15
#[ derive( Debug , thiserror:: Error ) ]
@@ -35,8 +36,27 @@ impl HttpTransport {
35
36
Self {
36
37
client,
37
38
url : url. into ( ) ,
39
+ headers : vec ! [ ] ,
38
40
}
39
41
}
42
+
43
+ /// Consumes the current [HttpTransport] instance and returns a new one with the header
44
+ /// appended. Same as calling [add_header].
45
+ pub fn with_header ( self , name : String , value : String ) -> Self {
46
+ let mut headers = self . headers ;
47
+ headers. push ( ( name, value) ) ;
48
+
49
+ Self {
50
+ client : self . client ,
51
+ url : self . url ,
52
+ headers,
53
+ }
54
+ }
55
+
56
+ /// Adds a custom HTTP header to be sent for requests.
57
+ pub fn add_header ( & mut self , name : String , value : String ) {
58
+ self . headers . push ( ( name, value) )
59
+ }
40
60
}
41
61
42
62
#[ cfg_attr( not( target_arch = "wasm32" ) , async_trait) ]
@@ -63,14 +83,16 @@ impl JsonRpcTransport for HttpTransport {
63
83
let request_body = serde_json:: to_string ( & request_body) . map_err ( Self :: Error :: Json ) ?;
64
84
trace ! ( "Sending request via JSON-RPC: {}" , request_body) ;
65
85
66
- let response = self
86
+ let mut request = self
67
87
. client
68
88
. post ( self . url . clone ( ) )
69
89
. body ( request_body)
70
- . header ( "Content-Type" , "application/json" )
71
- . send ( )
72
- . await
73
- . map_err ( Self :: Error :: Reqwest ) ?;
90
+ . header ( "Content-Type" , "application/json" ) ;
91
+ for ( name, value) in self . headers . iter ( ) {
92
+ request = request. header ( name, value) ;
93
+ }
94
+
95
+ let response = request. send ( ) . await . map_err ( Self :: Error :: Reqwest ) ?;
74
96
75
97
let response_body = response. text ( ) . await . map_err ( Self :: Error :: Reqwest ) ?;
76
98
trace ! ( "Response from JSON-RPC: {}" , response_body) ;
0 commit comments