@@ -175,9 +175,9 @@ impl TriggerExecutor for HttpTrigger {
175
175
176
176
let self_ = Arc :: new ( self ) ;
177
177
if let Some ( tls) = tls {
178
- self_. serve_tls ( listener, tls) . await ?
178
+ self_. serve_tls ( listener, listen_addr , tls) . await ?
179
179
} else {
180
- self_. serve ( listener) . await ?
180
+ self_. serve ( listener, listen_addr ) . await ?
181
181
} ;
182
182
183
183
Ok ( ( ) )
@@ -227,9 +227,10 @@ impl HttpTrigger {
227
227
& self ,
228
228
mut req : Request < Body > ,
229
229
scheme : Scheme ,
230
- addr : SocketAddr ,
230
+ server_addr : SocketAddr ,
231
+ client_addr : SocketAddr ,
231
232
) -> Result < Response < Body > > {
232
- set_req_uri ( & mut req, scheme) ?;
233
+ set_req_uri ( & mut req, scheme, server_addr ) ?;
233
234
strip_forbidden_headers ( & mut req) ;
234
235
235
236
spin_telemetry:: extract_trace_context ( & req) ;
@@ -273,15 +274,27 @@ impl HttpTrigger {
273
274
let res = match executor {
274
275
HttpExecutorType :: Http => {
275
276
HttpHandlerExecutor
276
- . execute ( self . engine . clone ( ) , & self . base , & route_match, req, addr)
277
+ . execute (
278
+ self . engine . clone ( ) ,
279
+ & self . base ,
280
+ & route_match,
281
+ req,
282
+ client_addr,
283
+ )
277
284
. await
278
285
}
279
286
HttpExecutorType :: Wagi ( wagi_config) => {
280
287
let executor = WagiHttpExecutor {
281
288
wagi_config : wagi_config. clone ( ) ,
282
289
} ;
283
290
executor
284
- . execute ( self . engine . clone ( ) , & self . base , & route_match, req, addr)
291
+ . execute (
292
+ self . engine . clone ( ) ,
293
+ & self . base ,
294
+ & route_match,
295
+ req,
296
+ client_addr,
297
+ )
285
298
. await
286
299
}
287
300
} ;
@@ -347,14 +360,18 @@ impl HttpTrigger {
347
360
fn serve_connection < S : AsyncRead + AsyncWrite + Unpin + Send + ' static > (
348
361
self : Arc < Self > ,
349
362
stream : S ,
350
- addr : SocketAddr ,
363
+ server_addr : SocketAddr ,
364
+ client_addr : SocketAddr ,
351
365
) {
352
366
task:: spawn ( async move {
353
367
if let Err ( e) = http1:: Builder :: new ( )
354
368
. keep_alive ( true )
355
369
. serve_connection (
356
370
TokioIo :: new ( stream) ,
357
- service_fn ( move |request| self . clone ( ) . instrumented_service_fn ( addr, request) ) ,
371
+ service_fn ( move |request| {
372
+ self . clone ( )
373
+ . instrumented_service_fn ( server_addr, client_addr, request)
374
+ } ) ,
358
375
)
359
376
. await
360
377
{
@@ -365,10 +382,11 @@ impl HttpTrigger {
365
382
366
383
async fn instrumented_service_fn (
367
384
self : Arc < Self > ,
368
- addr : SocketAddr ,
385
+ server_addr : SocketAddr ,
386
+ client_addr : SocketAddr ,
369
387
request : Request < Incoming > ,
370
388
) -> Result < Response < HyperOutgoingBody > > {
371
- let span = http_span ! ( request, addr ) ;
389
+ let span = http_span ! ( request, client_addr ) ;
372
390
let method = request. method ( ) . to_string ( ) ;
373
391
async {
374
392
let result = self
@@ -378,7 +396,8 @@ impl HttpTrigger {
378
396
. boxed ( )
379
397
} ) ,
380
398
Scheme :: HTTP ,
381
- addr,
399
+ server_addr,
400
+ client_addr,
382
401
)
383
402
. await ;
384
403
finalize_http_span ( result, method)
@@ -387,22 +406,28 @@ impl HttpTrigger {
387
406
. await
388
407
}
389
408
390
- async fn serve ( self : Arc < Self > , listener : TcpListener ) -> Result < ( ) > {
409
+ async fn serve ( self : Arc < Self > , listener : TcpListener , listen_addr : SocketAddr ) -> Result < ( ) > {
391
410
self . print_startup_msgs ( "http" , & listener) ?;
392
411
loop {
393
- let ( stream, addr) = listener. accept ( ) . await ?;
394
- Self :: serve_connection ( self . clone ( ) , stream, addr) ;
412
+ let ( stream, client_addr) = listener. accept ( ) . await ?;
413
+ self . clone ( )
414
+ . serve_connection ( stream, listen_addr, client_addr) ;
395
415
}
396
416
}
397
417
398
- async fn serve_tls ( self : Arc < Self > , listener : TcpListener , tls : TlsConfig ) -> Result < ( ) > {
418
+ async fn serve_tls (
419
+ self : Arc < Self > ,
420
+ listener : TcpListener ,
421
+ listen_addr : SocketAddr ,
422
+ tls : TlsConfig ,
423
+ ) -> Result < ( ) > {
399
424
let acceptor = tls. server_config ( ) ?;
400
425
self . print_startup_msgs ( "https" , & listener) ?;
401
426
402
427
loop {
403
428
let ( stream, addr) = listener. accept ( ) . await ?;
404
429
match acceptor. accept ( stream) . await {
405
- Ok ( stream) => self . clone ( ) . serve_connection ( stream, addr) ,
430
+ Ok ( stream) => self . clone ( ) . serve_connection ( stream, listen_addr , addr) ,
406
431
Err ( err) => tracing:: error!( ?err, "Failed to start TLS session" ) ,
407
432
}
408
433
}
@@ -440,21 +465,15 @@ fn parse_listen_addr(addr: &str) -> anyhow::Result<SocketAddr> {
440
465
addrs. into_iter ( ) . next ( ) . context ( "couldn't resolve address" )
441
466
}
442
467
443
- fn set_req_uri ( req : & mut Request < Body > , scheme : Scheme ) -> Result < ( ) > {
444
- const DEFAULT_HOST : & str = "localhost" ;
445
-
446
- let authority_hdr = req
447
- . headers ( )
448
- . get ( http:: header:: HOST )
449
- . map ( |h| h. to_str ( ) . context ( "Expected UTF8 header value (authority)" ) )
450
- . unwrap_or ( Ok ( DEFAULT_HOST ) ) ?;
468
+ /// The incoming request's scheme and authority
469
+ ///
470
+ /// The incoming request's URI is relative to the server, so we need to set the scheme and authority
471
+ fn set_req_uri ( req : & mut Request < Body > , scheme : Scheme , addr : SocketAddr ) -> Result < ( ) > {
451
472
let uri = req. uri ( ) . clone ( ) ;
452
473
let mut parts = uri. into_parts ( ) ;
453
- parts. authority = authority_hdr
454
- . parse ( )
455
- . map ( Option :: Some )
456
- . map_err ( |e| anyhow:: anyhow!( "Invalid authority {:?}" , e) ) ?;
474
+ let authority = format ! ( "{}:{}" , addr. ip( ) , addr. port( ) ) . parse ( ) . unwrap ( ) ;
457
475
parts. scheme = Some ( scheme) ;
476
+ parts. authority = Some ( authority) ;
458
477
* req. uri_mut ( ) = Uri :: from_parts ( parts) . unwrap ( ) ;
459
478
Ok ( ( ) )
460
479
}
0 commit comments