| 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)
 |