aboutsummaryrefslogtreecommitdiff
path: root/node_modules/stream-http/test/server/index.js
blob: f9f45de04335993c078d790ad03f2dd5a955d85d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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.ZUUL_PORT) || 8199
console.log('Test server listening on port', port)
server.listen(port)