@@ -2,6 +2,7 @@ use std::{
22 error:: Error ,
33 future:: Future ,
44 io:: IoSlice ,
5+ net:: SocketAddr ,
56 pin:: Pin ,
67 sync:: Arc ,
78 task:: { Context , Poll } ,
@@ -113,7 +114,7 @@ impl WasiHttpView for WasiHttpImplInner<'_> {
113114 http. response. status_code = Empty ,
114115 server. address = Empty ,
115116 server. port = Empty ,
116- ) ,
117+ )
117118 ) ]
118119 fn send_request (
119120 & mut self ,
@@ -166,12 +167,12 @@ impl RequestSender {
166167 spin_telemetry:: inject_trace_context ( & mut request) ;
167168
168169 // Run any configured request interceptor
169- let mut override_connect_host = None ;
170+ let mut override_connect_addr = None ;
170171 if let Some ( interceptor) = & self . request_interceptor {
171172 let intercept_request = std:: mem:: take ( & mut request) . into ( ) ;
172173 match interceptor. intercept ( intercept_request) . await ? {
173174 InterceptOutcome :: Continue ( mut req) => {
174- override_connect_host = req. override_connect_host . take ( ) ;
175+ override_connect_addr = req. override_connect_addr . take ( ) ;
175176 request = req. into_hyper_request ( ) ;
176177 }
177178 InterceptOutcome :: Complete ( resp) => {
@@ -186,17 +187,19 @@ impl RequestSender {
186187 }
187188
188189 // Backfill span fields after potentially updating the URL in the interceptor
189- if let Some ( authority) = request. uri ( ) . authority ( ) {
190- let span = tracing:: Span :: current ( ) ;
191- let host = override_connect_host. as_deref ( ) . unwrap_or ( authority. host ( ) ) ;
192- span. record ( "server.address" , host) ;
193- if let Some ( port) = authority. port ( ) {
194- span. record ( "server.port" , port. as_u16 ( ) ) ;
190+ let span = tracing:: Span :: current ( ) ;
191+ if let Some ( addr) = override_connect_addr {
192+ span. record ( "server.address" , addr. ip ( ) . to_string ( ) ) ;
193+ span. record ( "server.port" , addr. port ( ) ) ;
194+ } else if let Some ( authority) = request. uri ( ) . authority ( ) {
195+ span. record ( "server.address" , authority. host ( ) ) ;
196+ if let Some ( port) = authority. port_u16 ( ) {
197+ span. record ( "server.port" , port) ;
195198 }
196199 }
197200
198201 Ok ( self
199- . send_request ( request, config, override_connect_host )
202+ . send_request ( request, config, override_connect_addr )
200203 . await ?)
201204 }
202205
@@ -275,7 +278,7 @@ impl RequestSender {
275278 self ,
276279 request : OutgoingRequest ,
277280 config : OutgoingRequestConfig ,
278- override_connect_host : Option < String > ,
281+ override_connect_addr : Option < SocketAddr > ,
279282 ) -> Result < IncomingResponse , ErrorCode > {
280283 let OutgoingRequestConfig {
281284 use_tls,
@@ -296,7 +299,7 @@ impl RequestSender {
296299 blocked_networks : self . blocked_networks ,
297300 connect_timeout,
298301 tls_client_config,
299- override_connect_host ,
302+ override_connect_addr ,
300303 } ,
301304 async move {
302305 if use_tls {
@@ -376,26 +379,33 @@ struct ConnectOptions {
376379 blocked_networks : BlockedNetworks ,
377380 connect_timeout : Duration ,
378381 tls_client_config : Option < TlsClientConfig > ,
379- override_connect_host : Option < String > ,
382+ override_connect_addr : Option < SocketAddr > ,
380383}
381384
382385impl ConnectOptions {
383386 async fn connect_tcp ( & self , uri : & Uri , default_port : u16 ) -> Result < TcpStream , ErrorCode > {
384- let host = self
385- . override_connect_host
386- . as_deref ( )
387- . or ( uri. host ( ) )
388- . ok_or ( ErrorCode :: HttpRequestUriInvalid ) ?;
389- let host_and_port = ( host, uri. port_u16 ( ) . unwrap_or ( default_port) ) ;
390-
391- let mut socket_addrs = tokio:: net:: lookup_host ( host_and_port)
392- . await
393- . map_err ( |err| {
394- tracing:: debug!( ?host_and_port, ?err, "Error resolving host" ) ;
395- dns_error ( "address not available" . into ( ) , 0 )
396- } ) ?
397- . collect :: < Vec < _ > > ( ) ;
398- tracing:: debug!( ?host_and_port, ?socket_addrs, "Resolved host" ) ;
387+ let mut socket_addrs = match self . override_connect_addr {
388+ Some ( override_connect_addr) => vec ! [ override_connect_addr] ,
389+ None => {
390+ let authority = uri. authority ( ) . ok_or ( ErrorCode :: HttpRequestUriInvalid ) ?;
391+
392+ let host_and_port = if authority. port ( ) . is_some ( ) {
393+ authority. as_str ( ) . to_string ( )
394+ } else {
395+ format ! ( "{}:{}" , authority. as_str( ) , default_port)
396+ } ;
397+
398+ let socket_addrs = tokio:: net:: lookup_host ( & host_and_port)
399+ . await
400+ . map_err ( |err| {
401+ tracing:: debug!( ?host_and_port, ?err, "Error resolving host" ) ;
402+ dns_error ( "address not available" . into ( ) , 0 )
403+ } ) ?
404+ . collect :: < Vec < _ > > ( ) ;
405+ tracing:: debug!( ?host_and_port, ?socket_addrs, "Resolved host" ) ;
406+ socket_addrs
407+ }
408+ } ;
399409
400410 // Remove blocked IPs
401411 let blocked_addrs = self . blocked_networks . remove_blocked ( & mut socket_addrs) ;
0 commit comments