@@ -146,22 +146,40 @@ app.get('/har/:key/:mode(clean|gitcasso)', async (req, res) => {
146146
147147    // Find the main HTML response 
148148    const  harData  =  await  loadHar ( key ) 
149+     const  originalUrl  =  PAGES [ key ] 
149150    const  mainEntry  =  harData . log . entries . find ( 
150151      ( 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  && 
152158        entry . response . content . mimeType ?. includes ( 'text/html' )  && 
153159        entry . response . content . text , 
154160    ) 
155161    if  ( ! mainEntry )  { 
156162      return  res . status ( 404 ) . send ( 'No HTML content found in HAR file' ) 
157163    } 
158164
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+ 
159176    // Replace external URLs with local asset URLs 
160177    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+     } ) 
165183    if  ( mode  ===  'gitcasso' )  { 
166184      html  =  injectGitcassoScript ( key ,  html ) 
167185    } 
@@ -183,10 +201,27 @@ app.get('/asset/:key/*', async (req, res) => {
183201
184202    const  harData  =  await  loadHar ( key ) 
185203
186-     // Find matching asset in HAR 
204+     // Find matching asset in HAR by full URL comparison  
187205    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+       } 
190225    } ) 
191226
192227    if  ( ! assetEntry )  { 
0 commit comments