@@ -146,22 +146,40 @@ app.get('/har/:key/:mode(clean|gitcasso)', async (req, res) => {
146
146
147
147
// Find the main HTML response
148
148
const harData = await loadHar ( key )
149
+ const originalUrl = PAGES [ key ]
149
150
const mainEntry = harData . log . entries . find (
150
151
( entry ) =>
151
- entry . request . url . includes ( 'github.com' ) &&
152
+ entry . request . url === originalUrl &&
153
+ entry . response . content . mimeType ?. includes ( 'text/html' ) &&
154
+ entry . response . content . text ,
155
+ ) || harData . log . entries . find (
156
+ ( entry ) =>
157
+ entry . response . status === 200 &&
152
158
entry . response . content . mimeType ?. includes ( 'text/html' ) &&
153
159
entry . response . content . text ,
154
160
)
155
161
if ( ! mainEntry ) {
156
162
return res . status ( 404 ) . send ( 'No HTML content found in HAR file' )
157
163
}
158
164
165
+ // Extract all domains from HAR entries for dynamic replacement
166
+ const domains = new Set < string > ( )
167
+ harData . log . entries . forEach ( entry => {
168
+ try {
169
+ const url = new URL ( entry . request . url )
170
+ domains . add ( url . hostname )
171
+ } catch {
172
+ // Skip invalid URLs
173
+ }
174
+ } )
175
+
159
176
// Replace external URLs with local asset URLs
160
177
let html = mainEntry . response . content . text !
161
- html = html . replace (
162
- / h t t p s : \/ \/ ( g i t h u b \. c o m | a s s e t s \. g i t h u b \. c o m | a v a t a r s \. g i t h u b u s e r c o n t e n t \. c o m | u s e r - i m a g e s \. g i t h u b u s e r c o n t e n t \. c o m ) / g,
163
- `/asset/${ key } ` ,
164
- )
178
+ domains . forEach ( domain => {
179
+ const escapedDomain = domain . replace ( / [ . * + ? ^ $ { } ( ) | [ \] \\ ] / g, '\\$&' )
180
+ const regex = new RegExp ( `https?://${ escapedDomain } ` , 'g' )
181
+ html = html . replace ( regex , `/asset/${ key } ` )
182
+ } )
165
183
if ( mode === 'gitcasso' ) {
166
184
html = injectGitcassoScript ( key , html )
167
185
}
@@ -183,10 +201,27 @@ app.get('/asset/:key/*', async (req, res) => {
183
201
184
202
const harData = await loadHar ( key )
185
203
186
- // Find matching asset in HAR
204
+ // Find matching asset in HAR by full URL comparison
187
205
const assetEntry = harData . log . entries . find ( ( entry ) => {
188
- const url = new URL ( entry . request . url )
189
- return url . pathname === `/${ assetPath } ` || url . pathname . endsWith ( `/${ assetPath } ` )
206
+ try {
207
+ const url = new URL ( entry . request . url )
208
+ // First try exact path match
209
+ if ( url . pathname === `/${ assetPath } ` ) {
210
+ return true
211
+ }
212
+ // Then try path ending match (for nested paths)
213
+ if ( url . pathname . endsWith ( `/${ assetPath } ` ) ) {
214
+ return true
215
+ }
216
+ // Handle query parameters - check if path without query matches
217
+ const pathWithoutQuery = url . pathname + url . search
218
+ if ( pathWithoutQuery === `/${ assetPath } ` || pathWithoutQuery . endsWith ( `/${ assetPath } ` ) ) {
219
+ return true
220
+ }
221
+ return false
222
+ } catch {
223
+ return false
224
+ }
190
225
} )
191
226
192
227
if ( ! assetEntry ) {
0 commit comments