server.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /* eslint-disable compat/compat */
  2. const http = require('node:http')
  3. const qs = require('node:querystring')
  4. const e = require('he').encode
  5. /**
  6. * A very haxxor server that outputs some of the data it receives in a POST form parameter.
  7. */
  8. const server = http.createServer(onrequest)
  9. server.listen(9967)
  10. function onrequest (req, res) {
  11. if (req.url !== '/test') {
  12. res.writeHead(404, { 'content-type': 'text/html' })
  13. res.end('404')
  14. return
  15. }
  16. let body = ''
  17. req.on('data', (chunk) => { body += chunk })
  18. req.on('end', () => {
  19. onbody(body)
  20. })
  21. function onbody (body) {
  22. const fields = qs.parse(body)
  23. const assemblies = JSON.parse(fields.transloadit)
  24. res.setHeader('content-type', 'text/html')
  25. res.write(Header())
  26. res.write(FormFields(fields))
  27. assemblies.forEach((assembly) => {
  28. res.write(AssemblyResult(assembly))
  29. })
  30. res.end(Footer())
  31. }
  32. }
  33. function Header () {
  34. return `
  35. <!DOCTYPE html>
  36. <html>
  37. <head>
  38. <style>
  39. body { background: #f1f1f1; }
  40. main {
  41. padding: 20px;
  42. font: 12pt sans-serif;
  43. background: white;
  44. width: 800px;
  45. margin: auto;
  46. }
  47. </style>
  48. </head>
  49. <body>
  50. <main>
  51. `
  52. }
  53. function Footer () {
  54. return `
  55. </main>
  56. </body>
  57. </html>
  58. `
  59. }
  60. function FormFields (fields) {
  61. return `
  62. <h1>Form Fields</h1>
  63. <dl>
  64. ${Object.entries(fields).map(Field).join('\n')}
  65. </dl>
  66. `
  67. function Field ([name, value]) {
  68. if (name === 'transloadit') return ''
  69. return `
  70. <dt>${e(name)}</dt>
  71. <dd>${e(value)}</dd>
  72. `
  73. }
  74. }
  75. function AssemblyResult (assembly) {
  76. return `
  77. <h1>${e(assembly.assembly_id)} (${e(assembly.ok)})</h1>
  78. ${UploadsList(assembly.uploads)}
  79. ${ResultsList(assembly.results)}
  80. `
  81. }
  82. function UploadsList (uploads) {
  83. return `
  84. <ul>
  85. ${uploads.map(Upload).join('\n')}
  86. </ul>
  87. `
  88. function Upload (upload) {
  89. return `<li>${e(upload.name)}</li>`
  90. }
  91. }
  92. function ResultsList (results) {
  93. return Object.keys(results)
  94. .map(ResultsSection)
  95. .join('\n')
  96. function ResultsSection (stepName) {
  97. return `
  98. <h2>${e(stepName)}</h2>
  99. <ul>
  100. ${results[stepName].map(Result).join('\n')}
  101. </ul>
  102. `
  103. }
  104. function Result (result) {
  105. return `<li>${e(result.name)} <a href="${result.ssl_url}" target="_blank">View</a></li>`
  106. }
  107. }