138 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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)
 |