@@ -5,20 +5,43 @@ const path = require("path");
5
5
const mime = require ( "mime-types" ) ;
6
6
const parseurl = require ( "parseurl" ) ;
7
7
const log = require ( "@ui5/logger" ) . getLogger ( "server:middleware:testRunner" ) ;
8
+ const etag = require ( "etag" ) ;
9
+ const fresh = require ( "fresh" ) ;
8
10
9
11
const 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 ) $ / ;
10
12
const resourceCache = { } ;
11
13
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 ) {
13
29
const type = mime . lookup ( resourcePath ) || "application/octet-stream" ;
14
30
const charset = mime . charset ( type ) ;
15
31
const contentType = type + ( charset ? "; charset=" + charset : "" ) ;
32
+ res . setHeader ( "Content-Type" , contentType ) ;
16
33
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 ) ;
19
36
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 ) ;
22
45
}
23
46
24
47
/**
@@ -40,14 +63,14 @@ function createMiddleware({resources}) {
40
63
log . verbose ( `Serving ${ pathname } ` ) ;
41
64
let pResource ;
42
65
if ( ! resourceCache [ pathname ] ) {
43
- pResource = readFile ( path . join ( __dirname , "testRunner" , resourceName ) , { encoding : "utf8" } ) ;
66
+ pResource = readResourceInfo ( resourceName ) ;
44
67
resourceCache [ pathname ] = pResource ;
45
68
} else {
46
69
pResource = resourceCache [ pathname ] ;
47
70
}
48
71
49
- const resourceContent = await pResource ;
50
- serveResource ( res , pathname , resourceContent ) ;
72
+ const resourceInfo = await pResource ;
73
+ serveResource ( req , res , pathname , resourceInfo ) ;
51
74
} else {
52
75
next ( ) ;
53
76
}
0 commit comments