var cookieParser = require('cookie-parser') var basicAuth = require('basic-auth') var express = require('express') var fs = require('fs') var http = require('http') var path = require('path') var url = require('url') var app = express() var server = http.createServer(app) // Otherwise, use 'application/octet-stream' var copiesMimeTypes = { '/basic.txt': 'text/plain' } var maxDelay = 5000 // ms // This should make sure bodies aren't cached // so the streaming tests always pass app.use(function (req, res, next) { res.setHeader('Cache-Control', 'no-store') next() }) app.get('/testHeaders', function (req, res) { var parsed = url.parse(req.url, true) // Values in query parameters are sent as response headers Object.keys(parsed.query).forEach(function (key) { res.setHeader('Test-' + key, parsed.query[key]) }) res.setHeader('Content-Type', 'application/json') res.setHeader('Cache-Control', 'no-cache') // Request headers are sent in the body as json var reqHeaders = {} Object.keys(req.headers).forEach(function (key) { key = key.toLowerCase() if (key.indexOf('test-') === 0) { // different browsers format request headers with multiple values // slightly differently, so normalize reqHeaders[key] = req.headers[key].replace(', ', ',') } }) var body = JSON.stringify(reqHeaders) res.setHeader('Content-Length', body.length) res.write(body) res.end() }) app.get('/cookie', cookieParser(), function (req, res) { res.setHeader('Content-Type', 'text/plain') res.write('hello=' + req.cookies.hello) res.end() }) app.get('/auth', function (req, res) { var user = basicAuth(req) if (!user || user.name !== 'TestUser' || user.pass !== 'trustno1') { res.setHeader('WWW-Authenticate', 'Basic realm="example"') res.end('Access denied') } else { res.setHeader('Content-Type', 'text/plain') res.write('You\'re in!') res.end() } }) app.post('/echo', function (req, res) { res.setHeader('Content-Type', 'application/octet-stream') req.pipe(res) }) app.use('/verifyEmpty', function (req, res) { var empty = true req.on('data', function (buf) { if (buf.length > 0) { empty = false } }) req.on('end', function () { res.setHeader('Content-Type', 'text/plain') if (empty) { res.end('empty') } else { res.end('not empty') } }) }) app.use(function (req, res, next) { var parsed = url.parse(req.url, true) if ('copies' in parsed.query) { var totalCopies = parseInt(parsed.query.copies, 10) function fail () { res.statusCode = 500 res.end() } fs.readFile(path.join(__dirname, 'static', parsed.pathname), function (err, data) { if (err) return fail() var mimeType = copiesMimeTypes[parsed.pathname] || 'application/octet-stream' res.setHeader('Content-Type', mimeType) res.setHeader('Content-Length', data.length * totalCopies) var pieceDelay = maxDelay / totalCopies if (pieceDelay > 100) pieceDelay = 100 function write (copies) { if (copies === 0) return res.end() res.write(data, function (err) { if (err) return fail() setTimeout(write.bind(null, copies - 1), pieceDelay) }) } write(totalCopies) }) return } next() }) app.use(express.static(path.join(__dirname, 'static'))) var port = parseInt(process.env.AIRTAP_PORT) || 8199 console.log('Test server listening on port', port) server.listen(port)