@@ -390,6 +390,122 @@ func TestWellKnownReverseProxy(t *testing.T) {
390390 })
391391}
392392
393+ func TestWellKnownHeaderPropagation (t * testing.T ) {
394+ cases := []string {
395+ ".well-known/oauth-authorization-server" ,
396+ ".well-known/oauth-protected-resource" ,
397+ ".well-known/openid-configuration" ,
398+ }
399+ var receivedRequestHeaders http.Header
400+ testServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
401+ if ! strings .HasPrefix (r .URL .EscapedPath (), "/.well-known/" ) {
402+ http .NotFound (w , r )
403+ return
404+ }
405+ // Capture headers received from the proxy
406+ receivedRequestHeaders = r .Header .Clone ()
407+ // Set response headers that should be propagated back
408+ w .Header ().Set ("Content-Type" , "application/json" )
409+ w .Header ().Set ("Access-Control-Allow-Origin" , "https://example.com" )
410+ w .Header ().Set ("Access-Control-Allow-Methods" , "GET, POST, OPTIONS" )
411+ w .Header ().Set ("Cache-Control" , "no-cache" )
412+ w .Header ().Set ("X-Custom-Backend-Header" , "backend-value" )
413+ _ , _ = w .Write ([]byte (`{"issuer": "https://example.com"}` ))
414+ }))
415+ t .Cleanup (testServer .Close )
416+ staticConfig := & config.StaticConfig {
417+ AuthorizationURL : testServer .URL ,
418+ RequireOAuth : true ,
419+ ValidateToken : true ,
420+ ClusterProviderStrategy : config .ClusterProviderKubeConfig ,
421+ }
422+ testCaseWithContext (t , & httpContext {StaticConfig : staticConfig }, func (ctx * httpContext ) {
423+ for _ , path := range cases {
424+ receivedRequestHeaders = nil
425+ req , err := http .NewRequest ("GET" , fmt .Sprintf ("http://%s/%s" , ctx .HttpAddress , path ), nil )
426+ if err != nil {
427+ t .Fatalf ("Failed to create request: %v" , err )
428+ }
429+ // Add various headers to test propagation
430+ req .Header .Set ("Origin" , "https://example.com" )
431+ req .Header .Set ("User-Agent" , "Test-Agent/1.0" )
432+ req .Header .Set ("Accept" , "application/json" )
433+ req .Header .Set ("Accept-Language" , "en-US" )
434+ req .Header .Set ("X-Custom-Header" , "custom-value" )
435+ req .Header .Set ("Referer" , "https://example.com/page" )
436+
437+ resp , err := http .DefaultClient .Do (req )
438+ if err != nil {
439+ t .Fatalf ("Failed to get %s endpoint: %v" , path , err )
440+ }
441+ t .Cleanup (func () { _ = resp .Body .Close () })
442+
443+ t .Run ("Well-known proxy propagates Origin header to backend for " + path , func (t * testing.T ) {
444+ if receivedRequestHeaders == nil {
445+ t .Fatal ("Backend did not receive any headers" )
446+ }
447+ if receivedRequestHeaders .Get ("Origin" ) != "https://example.com" {
448+ t .Errorf ("Expected Origin header 'https://example.com', got '%s'" , receivedRequestHeaders .Get ("Origin" ))
449+ }
450+ })
451+
452+ t .Run ("Well-known proxy propagates User-Agent header to backend for " + path , func (t * testing.T ) {
453+ if receivedRequestHeaders .Get ("User-Agent" ) != "Test-Agent/1.0" {
454+ t .Errorf ("Expected User-Agent header 'Test-Agent/1.0', got '%s'" , receivedRequestHeaders .Get ("User-Agent" ))
455+ }
456+ })
457+
458+ t .Run ("Well-known proxy propagates Accept header to backend for " + path , func (t * testing.T ) {
459+ if receivedRequestHeaders .Get ("Accept" ) != "application/json" {
460+ t .Errorf ("Expected Accept header 'application/json', got '%s'" , receivedRequestHeaders .Get ("Accept" ))
461+ }
462+ })
463+
464+ t .Run ("Well-known proxy propagates Accept-Language header to backend for " + path , func (t * testing.T ) {
465+ if receivedRequestHeaders .Get ("Accept-Language" ) != "en-US" {
466+ t .Errorf ("Expected Accept-Language header 'en-US', got '%s'" , receivedRequestHeaders .Get ("Accept-Language" ))
467+ }
468+ })
469+
470+ t .Run ("Well-known proxy propagates custom headers to backend for " + path , func (t * testing.T ) {
471+ if receivedRequestHeaders .Get ("X-Custom-Header" ) != "custom-value" {
472+ t .Errorf ("Expected X-Custom-Header 'custom-value', got '%s'" , receivedRequestHeaders .Get ("X-Custom-Header" ))
473+ }
474+ })
475+
476+ t .Run ("Well-known proxy propagates Referer header to backend for " + path , func (t * testing.T ) {
477+ if receivedRequestHeaders .Get ("Referer" ) != "https://example.com/page" {
478+ t .Errorf ("Expected Referer header 'https://example.com/page', got '%s'" , receivedRequestHeaders .Get ("Referer" ))
479+ }
480+ })
481+
482+ t .Run ("Well-known proxy returns Access-Control-Allow-Origin from backend for " + path , func (t * testing.T ) {
483+ if resp .Header .Get ("Access-Control-Allow-Origin" ) != "https://example.com" {
484+ t .Errorf ("Expected Access-Control-Allow-Origin header 'https://example.com', got '%s'" , resp .Header .Get ("Access-Control-Allow-Origin" ))
485+ }
486+ })
487+
488+ t .Run ("Well-known proxy returns Access-Control-Allow-Methods from backend for " + path , func (t * testing.T ) {
489+ if resp .Header .Get ("Access-Control-Allow-Methods" ) != "GET, POST, OPTIONS" {
490+ t .Errorf ("Expected Access-Control-Allow-Methods header 'GET, POST, OPTIONS', got '%s'" , resp .Header .Get ("Access-Control-Allow-Methods" ))
491+ }
492+ })
493+
494+ t .Run ("Well-known proxy returns Cache-Control from backend for " + path , func (t * testing.T ) {
495+ if resp .Header .Get ("Cache-Control" ) != "no-cache" {
496+ t .Errorf ("Expected Cache-Control header 'no-cache', got '%s'" , resp .Header .Get ("Cache-Control" ))
497+ }
498+ })
499+
500+ t .Run ("Well-known proxy returns custom response headers from backend for " + path , func (t * testing.T ) {
501+ if resp .Header .Get ("X-Custom-Backend-Header" ) != "backend-value" {
502+ t .Errorf ("Expected X-Custom-Backend-Header 'backend-value', got '%s'" , resp .Header .Get ("X-Custom-Backend-Header" ))
503+ }
504+ })
505+ }
506+ })
507+ }
508+
393509func TestWellKnownOverrides (t * testing.T ) {
394510 cases := []string {
395511 ".well-known/oauth-authorization-server" ,
0 commit comments