@@ -31,8 +31,8 @@ export function responseInterceptor(interceptor: Interceptor) {
3131 _proxyRes . on ( 'data' , ( chunk ) => ( buffer = Buffer . concat ( [ buffer , chunk ] ) ) ) ;
3232
3333 _proxyRes . on ( 'end' , async ( ) => {
34- // set original content type from upstream
35- res . setHeader ( 'content-type' , originalProxyRes . headers [ 'content-type' ] || '' ) ;
34+ // copy original headers
35+ copyHeaders ( proxyRes , res ) ;
3636
3737 // call interceptor with intercepted response (buffer)
3838 const interceptedBuffer = Buffer . from ( await interceptor ( buffer , originalProxyRes , req , res ) ) ;
@@ -79,3 +79,33 @@ function decompress(proxyRes: http.IncomingMessage, contentEncoding: string) {
7979
8080 return _proxyRes ;
8181}
82+
83+ /**
84+ * Copy original headers
85+ * https://github.com/apache/superset/blob/9773aba522e957ed9423045ca153219638a85d2f/superset-frontend/webpack.proxy-config.js#L78
86+ */
87+ function copyHeaders ( originalResponse , response ) {
88+ response . statusCode = originalResponse . statusCode ;
89+ response . statusMessage = originalResponse . statusMessage ;
90+
91+ if ( response . setHeader ) {
92+ let keys = Object . keys ( originalResponse . headers ) ;
93+
94+ // ignore chunked, brotli, gzip, deflate headers
95+ keys = keys . filter ( ( key ) => ! [ 'content-encoding' , 'transfer-encoding' ] . includes ( key ) ) ;
96+
97+ keys . forEach ( ( key ) => {
98+ let value = originalResponse . headers [ key ] ;
99+
100+ if ( key === 'set-cookie' ) {
101+ // remove cookie domain
102+ value = Array . isArray ( value ) ? value : [ value ] ;
103+ value = value . map ( ( x ) => x . replace ( / D o m a i n = [ ^ ; ] + ?/ i, '' ) ) ;
104+ }
105+
106+ response . setHeader ( key , value ) ;
107+ } ) ;
108+ } else {
109+ response . headers = originalResponse . headers ;
110+ }
111+ }
0 commit comments