@@ -2,6 +2,7 @@ use std::{
2
2
error:: Error ,
3
3
future:: Future ,
4
4
io:: IoSlice ,
5
+ net:: SocketAddr ,
5
6
pin:: Pin ,
6
7
sync:: Arc ,
7
8
task:: { Context , Poll } ,
@@ -113,7 +114,7 @@ impl WasiHttpView for WasiHttpImplInner<'_> {
113
114
http. response. status_code = Empty ,
114
115
server. address = Empty ,
115
116
server. port = Empty ,
116
- ) ,
117
+ )
117
118
) ]
118
119
fn send_request (
119
120
& mut self ,
@@ -166,12 +167,12 @@ impl RequestSender {
166
167
spin_telemetry:: inject_trace_context ( & mut request) ;
167
168
168
169
// Run any configured request interceptor
169
- let mut override_connect_host = None ;
170
+ let mut override_connect_addr = None ;
170
171
if let Some ( interceptor) = & self . request_interceptor {
171
172
let intercept_request = std:: mem:: take ( & mut request) . into ( ) ;
172
173
match interceptor. intercept ( intercept_request) . await ? {
173
174
InterceptOutcome :: Continue ( mut req) => {
174
- override_connect_host = req. override_connect_host . take ( ) ;
175
+ override_connect_addr = req. override_connect_addr . take ( ) ;
175
176
request = req. into_hyper_request ( ) ;
176
177
}
177
178
InterceptOutcome :: Complete ( resp) => {
@@ -186,17 +187,19 @@ impl RequestSender {
186
187
}
187
188
188
189
// 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) ;
195
198
}
196
199
}
197
200
198
201
Ok ( self
199
- . send_request ( request, config, override_connect_host )
202
+ . send_request ( request, config, override_connect_addr )
200
203
. await ?)
201
204
}
202
205
@@ -275,7 +278,7 @@ impl RequestSender {
275
278
self ,
276
279
request : OutgoingRequest ,
277
280
config : OutgoingRequestConfig ,
278
- override_connect_host : Option < String > ,
281
+ override_connect_addr : Option < SocketAddr > ,
279
282
) -> Result < IncomingResponse , ErrorCode > {
280
283
let OutgoingRequestConfig {
281
284
use_tls,
@@ -296,7 +299,7 @@ impl RequestSender {
296
299
blocked_networks : self . blocked_networks ,
297
300
connect_timeout,
298
301
tls_client_config,
299
- override_connect_host ,
302
+ override_connect_addr ,
300
303
} ,
301
304
async move {
302
305
if use_tls {
@@ -376,26 +379,33 @@ struct ConnectOptions {
376
379
blocked_networks : BlockedNetworks ,
377
380
connect_timeout : Duration ,
378
381
tls_client_config : Option < TlsClientConfig > ,
379
- override_connect_host : Option < String > ,
382
+ override_connect_addr : Option < SocketAddr > ,
380
383
}
381
384
382
385
impl ConnectOptions {
383
386
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
+ } ;
399
409
400
410
// Remove blocked IPs
401
411
let blocked_addrs = self . blocked_networks . remove_blocked ( & mut socket_addrs) ;
0 commit comments