@@ -606,6 +606,12 @@ class HttpTransport extends TransportAdapter {
606606 * `cors` is disabled. For an allow-list, the request `Origin` is echoed
607607 * only when it matches (and `Vary: Origin` is set so caches don't mix
608608 * responses across origins).
609+ *
610+ * `Access-Control-Allow-Headers` reflects the browser's
611+ * `Access-Control-Request-Headers` when present, so authenticated or
612+ * custom-header requests (`Authorization`, `X-*`, …) pass preflight
613+ * rather than being limited to `content-type`. The reflected value is
614+ * added to `Vary` to keep caches correct.
609615 */
610616 _applyCors ( req , res ) {
611617 if ( ! this . cors ) return ;
@@ -620,7 +626,15 @@ class HttpTransport extends TransportAdapter {
620626 }
621627 }
622628 res . setHeader ( 'access-control-allow-methods' , 'GET, POST, OPTIONS' ) ;
623- res . setHeader ( 'access-control-allow-headers' , 'content-type' ) ;
629+ // Echo whatever headers the browser says it will send; fall back to
630+ // `content-type` for non-preflight requests that carry no such hint.
631+ const requested = req . headers [ 'access-control-request-headers' ] ;
632+ if ( requested ) {
633+ res . appendHeader ( 'vary' , 'Access-Control-Request-Headers' ) ;
634+ res . setHeader ( 'access-control-allow-headers' , requested ) ;
635+ } else {
636+ res . setHeader ( 'access-control-allow-headers' , 'content-type' ) ;
637+ }
624638 res . setHeader ( 'access-control-max-age' , '86400' ) ;
625639 }
626640}
0 commit comments