@@ -31,8 +31,8 @@ export function responseInterceptor(interceptor: Interceptor) {
31
31
_proxyRes . on ( 'data' , ( chunk ) => ( buffer = Buffer . concat ( [ buffer , chunk ] ) ) ) ;
32
32
33
33
_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 ) ;
36
36
37
37
// call interceptor with intercepted response (buffer)
38
38
const interceptedBuffer = Buffer . from ( await interceptor ( buffer , originalProxyRes , req , res ) ) ;
@@ -79,3 +79,33 @@ function decompress(proxyRes: http.IncomingMessage, contentEncoding: string) {
79
79
80
80
return _proxyRes ;
81
81
}
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