| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent e0d098b commit e08514e
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -459,7 +459,15 @@ function validateUnion(value, name, union) { | |||
| 459 | 459 | } | |
| 460 | 460 | } | |
| 461 | 461 | ||
| 462 | - const linkValueRegExp = /^(?:<[^>]*>;)\s*(?:rel=(")?[^;"]*\1;?)\s*(?:(?:as|anchor|title|crossorigin|disabled|fetchpriority|rel|referrerpolicy)=(")?[^;"]*\2)?$/; | ||
| 462 | + /* | ||
| 463 | + The rules for the Link header field are described here: | ||
| 464 | + https://www.rfc-editor.org/rfc/rfc8288.html#section-3 | ||
| 465 | + | ||
| 466 | + This regex validates any string surrounded by angle brackets | ||
| 467 | + (not necessarily a valid URI reference) followed by zero or more | ||
| 468 | + link-params separated by semicolons. | ||
| 469 | + */ | ||
| 470 | + const linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/; | ||
| 463 | 471 | ||
| 464 | 472 | /** | |
| 465 | 473 | * @param {any} value | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6,28 +6,44 @@ const debug = require('node:util').debuglog('test'); | |||
| 6 | 6 | ||
| 7 | 7 | const testResBody = 'response content\n'; | |
| 8 | 8 | ||
| 9 | - const server = http.createServer(common.mustCall((req, res) => { | ||
| 10 | - debug('Server sending early hints...'); | ||
| 11 | - res.writeEarlyHints('bad argument type'); | ||
| 12 | - | ||
| 13 | - debug('Server sending full response...'); | ||
| 14 | - res.end(testResBody); | ||
| 15 | - })); | ||
| 16 | - | ||
| 17 | - server.listen(0, common.mustCall(() => { | ||
| 18 | - const req = http.request({ | ||
| 19 | - port: server.address().port, path: '/' | ||
| 20 | - }); | ||
| 21 | - | ||
| 22 | - req.end(); | ||
| 23 | - debug('Client sending request...'); | ||
| 24 | - | ||
| 25 | - req.on('information', common.mustNotCall()); | ||
| 26 | - | ||
| 27 | - process.on('uncaughtException', (err) => { | ||
| 28 | - debug(`Caught an exception: ${JSON.stringify(err)}`); | ||
| 29 | - if (err.name === 'AssertionError') throw err; | ||
| 30 | - assert.strictEqual(err.code, 'ERR_INVALID_ARG_TYPE'); | ||
| 31 | - process.exit(0); | ||
| 32 | - }); | ||
| 33 | - })); | ||
| 9 | + { | ||
| 10 | + const server = http.createServer(common.mustCall((req, res) => { | ||
| 11 | + debug('Server sending early hints...'); | ||
| 12 | + assert.throws(() => { | ||
| 13 | + res.writeEarlyHints('bad argument type'); | ||
| 14 | + }, (err) => err.code === 'ERR_INVALID_ARG_TYPE'); | ||
| 15 | + | ||
| 16 | + assert.throws(() => { | ||
| 17 | + res.writeEarlyHints({ | ||
| 18 | + link: '</>; ' | ||
| 19 | + }); | ||
| 20 | + }, (err) => err.code === 'ERR_INVALID_ARG_VALUE'); | ||
| 21 | + | ||
| 22 | + assert.throws(() => { | ||
| 23 | + res.writeEarlyHints({ | ||
| 24 | + link: 'rel=preload; </scripts.js>' | ||
| 25 | + }); | ||
| 26 | + }, (err) => err.code === 'ERR_INVALID_ARG_VALUE'); | ||
| 27 | + | ||
| 28 | + assert.throws(() => { | ||
| 29 | + res.writeEarlyHints({ | ||
| 30 | + link: 'invalid string' | ||
| 31 | + }); | ||
| 32 | + }, (err) => err.code === 'ERR_INVALID_ARG_VALUE'); | ||
| 33 | + | ||
| 34 | + debug('Server sending full response...'); | ||
| 35 | + res.end(testResBody); | ||
| 36 | + server.close(); | ||
| 37 | + })); | ||
| 38 | + | ||
| 39 | + server.listen(0, common.mustCall(() => { | ||
| 40 | + const req = http.request({ | ||
| 41 | + port: server.address().port, path: '/' | ||
| 42 | + }); | ||
| 43 | + | ||
| 44 | + req.end(); | ||
| 45 | + debug('Client sending request...'); | ||
| 46 | + | ||
| 47 | + req.on('information', common.mustNotCall()); | ||
| 48 | + })); | ||
| 49 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -58,7 +58,8 @@ const testResBody = 'response content\n'; | |||
| 58 | 58 | res.writeEarlyHints({ | |
| 59 | 59 | link: [ | |
| 60 | 60 | '</styles.css>; rel=preload; as=style', | |
| 61 | - '</scripts.js>; rel=preload; as=script', | ||
| 61 | + '</scripts.js>; crossorigin; rel=preload; as=script', | ||
| 62 | + '</scripts.js>; rel=preload; as=script; crossorigin', | ||
| 62 | 63 | ] | |
| 63 | 64 | }); | |
| 64 | 65 | ||
@@ -75,7 +76,8 @@ const testResBody = 'response content\n'; | |||
| 75 | 76 | req.on('information', common.mustCall((res) => { | |
| 76 | 77 | assert.strictEqual( | |
| 77 | 78 | res.headers.link, | |
| 78 | - '</styles.css>; rel=preload; as=style, </scripts.js>; rel=preload; as=script' | ||
| 79 | + '</styles.css>; rel=preload; as=style, </scripts.js>; crossorigin; ' + | ||
| 80 | + 'rel=preload; as=script, </scripts.js>; rel=preload; as=script; crossorigin' | ||
| 79 | 81 | ); | |
| 80 | 82 | })); | |
| 81 | 83 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments