@@ -52,19 +52,25 @@ export function getMiddleware(
52
52
}
53
53
}
54
54
55
- const response = await next ( ) ;
56
- const isHTMLResponse = ! ! response . headers
55
+ const hostResponse = await next ( ) ;
56
+ const isHTMLResponse = ! ! hostResponse . headers
57
57
. get ( "content-type" )
58
58
?. startsWith ( "text/html" ) ;
59
59
60
60
if ( isHTMLResponse ) {
61
61
const matchedFragment = gateway . matchRequestToFragment ( request ) ;
62
62
if ( matchedFragment ) {
63
+ const {
64
+ fragmentId,
65
+ upstream,
66
+ forwardFragmentHeaders,
67
+ prePiercingClassNames,
68
+ onSsrFetchError,
69
+ } = matchedFragment ;
63
70
const requestUrl = new URL ( request . url ) ;
64
-
65
71
const upstreamUrl = new URL (
66
72
`${ requestUrl . pathname } ${ requestUrl . search } ` ,
67
- matchedFragment . upstream
73
+ upstream
68
74
) ;
69
75
70
76
// TODO: this logic should not be here but in the reframed package (and imported and used here)
@@ -95,14 +101,18 @@ export function getMiddleware(
95
101
fragmentReq . headers . set ( "Accept-Encoding" , "gzip" ) ;
96
102
}
97
103
98
- let fragmentRes : Response ;
104
+ let embeddedFragmentResponse : Response = new Response ( ) ;
99
105
let fragmentFailedResOrError : Response | unknown | null = null ;
100
106
try {
101
- const response = await fetch ( fragmentReq ) ;
102
- if ( response . status >= 400 && response . status <= 599 ) {
103
- fragmentFailedResOrError = response ;
107
+ const fragmentResponse = await fetch ( fragmentReq ) ;
108
+ if (
109
+ fragmentResponse . status >= 400 &&
110
+ fragmentResponse . status <= 599
111
+ ) {
112
+ fragmentFailedResOrError = fragmentResponse ;
104
113
} else {
105
- fragmentRes = scriptRewriter . transform ( response ) ;
114
+ embeddedFragmentResponse =
115
+ scriptRewriter . transform ( fragmentResponse ) ;
106
116
}
107
117
} catch ( e ) {
108
118
fragmentFailedResOrError = e ;
@@ -117,22 +127,21 @@ export function getMiddleware(
117
127
* return an object from the callback with property {overwriteResponse: true}
118
128
*/
119
129
if ( fragmentFailedResOrError ) {
120
- if ( matchedFragment . onSsrFetchError ) {
121
- const { response, overrideResponse } =
122
- await matchedFragment . onSsrFetchError (
123
- fragmentReq ,
124
- fragmentFailedResOrError
125
- ) ;
130
+ if ( onSsrFetchError ) {
131
+ const { response, overrideResponse } = await onSsrFetchError (
132
+ fragmentReq ,
133
+ fragmentFailedResOrError
134
+ ) ;
126
135
127
136
if ( overrideResponse ) {
128
137
return response ;
129
138
}
130
139
131
- fragmentRes = response ;
140
+ embeddedFragmentResponse = response ;
132
141
} else {
133
- fragmentRes = new Response (
142
+ embeddedFragmentResponse = new Response (
134
143
mode === "development"
135
- ? `<p>Fetching fragment upstream failed: ${ matchedFragment . upstream } </p>`
144
+ ? `<p>Fetching fragment upstream failed: ${ upstream } </p>`
136
145
: "<p>There was a problem fulfilling your request.</p>" ,
137
146
{ headers : [ [ "content-type" , "text/html" ] ] }
138
147
) ;
@@ -151,20 +160,31 @@ export function getMiddleware(
151
160
// we should look into this and support streams if possible
152
161
element . append (
153
162
fragmentHostInitialization ( {
154
- fragmentId : matchedFragment . fragmentId ,
163
+ fragmentId,
155
164
// TODO: what if don't get a body (i.e. can't fetch the fragment)? we should add some error handling here
156
- content : await fragmentRes . text ( ) ,
157
- classNames : matchedFragment . prePiercingClassNames . join ( " " ) ,
165
+ content : await embeddedFragmentResponse . text ( ) ,
166
+ classNames : prePiercingClassNames . join ( " " ) ,
158
167
} ) ,
159
168
{ html : true }
160
169
) ;
161
170
} ,
162
171
} ) ;
163
172
164
- return rewriter . transform ( response ) ;
173
+ const gatewayResponse = rewriter . transform ( hostResponse ) ;
174
+
175
+ if ( forwardFragmentHeaders ?. length ) {
176
+ forwardFragmentHeaders . forEach ( ( header ) => {
177
+ gatewayResponse . headers . append (
178
+ header ,
179
+ embeddedFragmentResponse . headers . get ( header ) || ""
180
+ ) ;
181
+ } ) ;
182
+ }
183
+
184
+ return gatewayResponse ;
165
185
}
166
186
}
167
187
168
- return response ;
188
+ return hostResponse ;
169
189
} ;
170
190
}
0 commit comments