server.coffee 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. express = require 'express'
  2. app = express()
  3. path = require 'path'
  4. module.exports = app
  5. project_root = path.resolve(__dirname, '..')
  6. app.use express.static(project_root)
  7. app.use express.static(project_root + 'node_modules/mocha')
  8. app.use express.static(project_root + 'node_modules/chai')
  9. app.use express.bodyParser()
  10. mime = (req) ->
  11. type = req.headers['content-type'] or ''
  12. type.split(';')[0]
  13. dump = (obj) ->
  14. obj = '' unless obj
  15. obj = JSON.stringify(obj) if obj and typeof obj isnt "string"
  16. obj
  17. cleanTrace = (traceStr) ->
  18. trace = traceStr.split("\n")
  19. filtered = []
  20. for line in trace
  21. if /\.html:/.test line
  22. line = line.replace(/^.+?@/, '')
  23. line = line.replace(/http:\/\/.+?\//, '')
  24. line = line.replace(/(:\d+):\d+$/, '$1')
  25. filtered.push line
  26. filtered
  27. browser = (ua) ->
  28. if m = ua.match /(Android .+?);/
  29. m[1]
  30. else if m = ua.match /(iPhone|iPad|iPod).*?OS ([\d_]+)/
  31. 'iOS ' + m[2].replace(/_/g, '.')
  32. else if m = ua.match /(Chrome\/[\d.]+)/
  33. m[1].replace '/', ' '
  34. else if m = ua.match /(Safari\/[\d.]+)/
  35. m[1].replace '/', ' '
  36. else if m = ua.match /(Firefox\/[\d.]+)/
  37. m[1].replace '/', ' '
  38. else if m = ua.match /\bMS(IE [\d.]+)/
  39. m[1]
  40. else
  41. ua
  42. app.all '/', (req, res) ->
  43. res.redirect '/test'
  44. app.all '/test/echo=?', (req, res) ->
  45. res.set 'Cache-Control', 'no-cache'
  46. res.send """
  47. #{req.method} ?#{dump(req.query)}
  48. content-type: #{mime(req)}
  49. accept: #{req.headers['accept']}
  50. #{dump(req.body)}
  51. """
  52. app.get '/test/jsonp', (req, res) ->
  53. res.jsonp
  54. query: req.query
  55. hello: 'world'
  56. # send JSONP response despite callback not being set
  57. app.get '/test/jsonpBlah', (req, res) ->
  58. res.set 'Content-Type', 'text/javascript'
  59. res.send 'blah()'
  60. app.get '/test/json', (req, res) ->
  61. res.set 'Cache-Control', 'no-cache'
  62. expectedType = req.headers['accept']
  63. if expectedType is '*/*' or /json/.test expectedType
  64. if req.query.invalid
  65. res.set 'Content-Type', 'application/json'
  66. res.send 'invalidJSON'
  67. else
  68. res.json
  69. query: req.query
  70. hello: 'world'
  71. else
  72. res.send 400, 'FAIL'
  73. app.get '/test/taintedJSON', (req, res) ->
  74. res.set 'Content-Type', 'application/json'
  75. res.send 'while(1);{"hello" : "world"}'
  76. app.post '/test/create', (req, res) ->
  77. res.json
  78. action: 'created'
  79. query: req.query
  80. payload: req.body
  81. app.all '/test/slow', (req, res) ->
  82. setTimeout ->
  83. res.jsonp result: 'ok'
  84. , 200
  85. app.get '/test/cached', (req, res) ->
  86. res.set 'Cache-Control', 'max-age=2'
  87. res.set 'Expires', new Date(Date.now() + 2000).toUTCString()
  88. now = new Date()
  89. res.send now.getTime().toString()
  90. app.get '/test/auth', (req, res) ->
  91. if req.headers.authorization is 'Basic emVwdG86ZG9nZQ=='
  92. res.send 200
  93. else
  94. res.set 'WWW-Authenticate', "Basic realm=\"#{req.query.realm}\""
  95. res.send 401
  96. app.post '/test/log', (req, res) ->
  97. params = req.body
  98. trace = cleanTrace params.trace
  99. console.log "[%s] %s: %s", browser(req.headers['user-agent']), params.name, params.message
  100. console.log trace.join("\n").replace(/^/mg, ' ') if trace.length
  101. res.send 200
  102. app.all '/test/error', (req, res) ->
  103. res.send 500, 'BOOM'
  104. if process.argv[1] is __filename
  105. port = process.argv[2]
  106. unless port
  107. port = 3000
  108. console.log "Listening on port #{port}"
  109. app.listen port