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