@@ -5,20 +5,43 @@ const path = require("path");
55const mime = require ( "mime-types" ) ;
66const parseurl = require ( "parseurl" ) ;
77const log = require ( "@ui5/logger" ) . getLogger ( "server:middleware:testRunner" ) ;
8+ const etag = require ( "etag" ) ;
9+ const fresh = require ( "fresh" ) ;
810
911const testRunnerResourceRegEx = / \/ t e s t - r e s o u r c e s \/ s a p \/ u i \/ q u n i t \/ ( t e s t r u n n e r \. ( h t m l | c s s ) | T e s t R u n n e r .j s ) $ / ;
1012const resourceCache = { } ;
1113
12- function serveResource ( res , resourcePath , resourceContent ) {
14+ function isFresh ( req , res ) {
15+ return fresh ( req . headers , {
16+ "etag" : res . getHeader ( "ETag" )
17+ } ) ;
18+ }
19+
20+ async function readResourceInfo ( resourceName ) {
21+ const content = await readFile ( path . join ( __dirname , "testRunner" , resourceName ) , { encoding : "utf8" } ) ;
22+ return {
23+ content,
24+ etag : etag ( content )
25+ } ;
26+ }
27+
28+ function serveResource ( req , res , resourcePath , resourceInfo ) {
1329 const type = mime . lookup ( resourcePath ) || "application/octet-stream" ;
1430 const charset = mime . charset ( type ) ;
1531 const contentType = type + ( charset ? "; charset=" + charset : "" ) ;
32+ res . setHeader ( "Content-Type" , contentType ) ;
1633
17- // resources served by this middleware do not change often
18- res . setHeader ( "Cache-Control " , "public, max-age=1800" ) ;
34+ // Enable ETag caching
35+ res . setHeader ( "ETag " , resourceInfo . etag ) ;
1936
20- res . setHeader ( "Content-Type" , contentType ) ;
21- res . end ( resourceContent ) ;
37+ if ( isFresh ( req , res ) ) {
38+ // client has a fresh copy of the resource
39+ res . statusCode = 304 ;
40+ res . end ( ) ;
41+ return ;
42+ }
43+
44+ res . end ( resourceInfo . content ) ;
2245}
2346
2447/**
@@ -40,14 +63,14 @@ function createMiddleware({resources}) {
4063 log . verbose ( `Serving ${ pathname } ` ) ;
4164 let pResource ;
4265 if ( ! resourceCache [ pathname ] ) {
43- pResource = readFile ( path . join ( __dirname , "testRunner" , resourceName ) , { encoding : "utf8" } ) ;
66+ pResource = readResourceInfo ( resourceName ) ;
4467 resourceCache [ pathname ] = pResource ;
4568 } else {
4669 pResource = resourceCache [ pathname ] ;
4770 }
4871
49- const resourceContent = await pResource ;
50- serveResource ( res , pathname , resourceContent ) ;
72+ const resourceInfo = await pResource ;
73+ serveResource ( req , res , pathname , resourceInfo ) ;
5174 } else {
5275 next ( ) ;
5376 }
0 commit comments