app.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. const http = require('http')
  2. const fsPromises = require('fs').promises
  3. const path = require('path')
  4. const crypto = require('crypto')
  5. const sleep = require('util').promisify(setTimeout)
  6. const argvIndexOfFile = process.argv.indexOf(__filename)
  7. let SLEEP_TIME = parseInt(process.argv[argvIndexOfFile + 1])
  8. if (isNaN(SLEEP_TIME)) {
  9. SLEEP_TIME = 200
  10. }
  11. let CACHE_MAX_AGE = parseInt(process.argv[argvIndexOfFile + 2])
  12. if (isNaN(CACHE_MAX_AGE)) {
  13. CACHE_MAX_AGE = 0
  14. }
  15. let PORT = parseInt(process.argv[argvIndexOfFile + 3])
  16. if (isNaN(PORT)) {
  17. PORT = 8000
  18. }
  19. function sha384(data) {
  20. const hash = crypto.createHash('sha384')
  21. hash.update(data)
  22. return hash.digest('base64')
  23. }
  24. async function requestListener(req, res) {
  25. let headers = {
  26. 'Content-Type': 'text/html',
  27. }
  28. let pathString = req.url.substr(1)
  29. let page = parseInt(pathString)
  30. if (pathString == '') {
  31. page = 1
  32. }
  33. let content = ''
  34. const jsContent = await fsPromises.readFile(path.resolve(__dirname, '../instantpage.js'))
  35. const jsHash = sha384(jsContent)
  36. if (pathString == 'instantpage.js') {
  37. headers['Content-Type'] = 'text/javascript'
  38. content += jsContent
  39. }
  40. else if (!isNaN(page)) {
  41. await sleep(SLEEP_TIME)
  42. if (CACHE_MAX_AGE) {
  43. headers['Cache-Control'] = `max-age=${CACHE_MAX_AGE}`
  44. }
  45. content += await fsPromises.readFile(path.resolve(__dirname, 'header.html'))
  46. content += `<h1>Page ${page}</h1>`
  47. for (let i = 1; i <= 3; i++) {
  48. if (page != i) {
  49. content += `<a href="/${i}?${Math.random()}"><span>Page ${i}</span></a>`
  50. }
  51. }
  52. content += `<a href="${req.url}#anchor" id="anchor"><span>Same-page anchor</span></a>`
  53. content += `<a href="/${page}?${Math.random()}#anchor"><span>Other page anchor</span></a>`
  54. content += `<a href="/${page}?${Math.random()}" data-instant="no"><span>Manually blacklisted link</span></a>`
  55. content += `<a href="https://www.google.com/"><span>External link</span></a>`
  56. let footer = await fsPromises.readFile(path.resolve(__dirname, 'footer.html'))
  57. footer = footer.toString().replace('__HASH__', jsHash)
  58. content += footer
  59. }
  60. res.writeHead(200, headers)
  61. res.write(content)
  62. res.end()
  63. }
  64. http.createServer(requestListener).listen(PORT)