UNPKG

5.4 kBJavaScriptView Raw
1
2var http = require('http');
3var parse = require('url').parse;
4var zlib = require('zlib');
5var stream = require('stream');
6var convert = require('encoding').convert;
7
8module.exports = TestServer;
9
10function TestServer() {
11 this.server = http.createServer(this.router);
12 this.port = 30001;
13 this.hostname = 'localhost';
14 this.server.on('error', function(err) {
15 console.log(err.stack);
16 });
17}
18
19TestServer.prototype.start = function(cb) {
20 this.server.listen(this.port, this.hostname, cb);
21}
22
23TestServer.prototype.stop = function(cb) {
24 this.server.close(cb);
25}
26
27TestServer.prototype.router = function(req, res) {
28
29 var p = parse(req.url).pathname;
30
31 if (p === '/hello') {
32 res.statusCode = 200;
33 res.setHeader('Content-Type', 'text/plain');
34 res.end('world');
35 }
36
37 if (p === '/plain') {
38 res.statusCode = 200;
39 res.setHeader('Content-Type', 'text/plain');
40 res.end('text');
41 }
42
43 if (p === '/html') {
44 res.statusCode = 200;
45 res.setHeader('Content-Type', 'text/html');
46 res.end('<html></html>');
47 }
48
49 if (p === '/json') {
50 res.statusCode = 200;
51 res.setHeader('Content-Type', 'application/json');
52 res.end(JSON.stringify({
53 name: 'value'
54 }));
55 }
56
57 if (p === '/gzip') {
58 res.statusCode = 200;
59 res.setHeader('Content-Type', 'text/plain');
60 res.setHeader('Content-Encoding', 'gzip');
61 zlib.gzip('hello world', function(err, buffer) {
62 res.end(buffer);
63 });
64 }
65
66 if (p === '/deflate') {
67 res.statusCode = 200;
68 res.setHeader('Content-Type', 'text/plain');
69 res.setHeader('Content-Encoding', 'deflate');
70 zlib.deflate('hello world', function(err, buffer) {
71 res.end(buffer);
72 });
73 }
74
75 if (p === '/sdch') {
76 res.statusCode = 200;
77 res.setHeader('Content-Type', 'text/plain');
78 res.setHeader('Content-Encoding', 'sdch');
79 res.end('fake sdch string');
80 }
81
82 if (p === '/timeout') {
83 setTimeout(function() {
84 res.statusCode = 200;
85 res.setHeader('Content-Type', 'text/plain');
86 res.end('text');
87 }, 1000);
88 }
89
90 if (p === '/slow') {
91 res.statusCode = 200;
92 res.setHeader('Content-Type', 'text/plain');
93 res.write('test');
94 setTimeout(function() {
95 res.end('test');
96 }, 1000);
97 }
98
99 if (p === '/cookie') {
100 res.statusCode = 200;
101 res.setHeader('Set-Cookie', ['a=1', 'b=1']);
102 res.end('cookie');
103 }
104
105 if (p === '/size/chunk') {
106 res.statusCode = 200;
107 res.setHeader('Content-Type', 'text/plain');
108 setTimeout(function() {
109 res.write('test');
110 }, 50);
111 setTimeout(function() {
112 res.end('test');
113 }, 100);
114 }
115
116 if (p === '/size/long') {
117 res.statusCode = 200;
118 res.setHeader('Content-Type', 'text/plain');
119 res.end('testtest');
120 }
121
122 if (p === '/encoding/gbk') {
123 res.statusCode = 200;
124 res.setHeader('Content-Type', 'text/html');
125 res.end(convert('<meta charset="gbk"><div>中文</div>', 'gbk'));
126 }
127
128 if (p === '/encoding/gb2312') {
129 res.statusCode = 200;
130 res.setHeader('Content-Type', 'text/html');
131 res.end(convert('<meta http-equiv="Content-Type" content="text/html; charset=gb2312"><div>中文</div>', 'gb2312'));
132 }
133
134 if (p === '/encoding/shift-jis') {
135 res.statusCode = 200;
136 res.setHeader('Content-Type', 'text/html; charset=Shift-JIS');
137 res.end(convert('<div>日本語</div>', 'Shift_JIS'));
138 }
139
140 if (p === '/encoding/euc-jp') {
141 res.statusCode = 200;
142 res.setHeader('Content-Type', 'text/xml');
143 res.end(convert('<?xml version="1.0" encoding="EUC-JP"?><title>日本語</title>', 'EUC-JP'));
144 }
145
146 if (p === '/encoding/utf8') {
147 res.statusCode = 200;
148 res.end('中文');
149 }
150
151 if (p === '/encoding/order1') {
152 res.statusCode = 200;
153 res.setHeader('Content-Type', 'charset=gbk; text/plain');
154 res.end(convert('中文', 'gbk'));
155 }
156
157 if (p === '/encoding/order2') {
158 res.statusCode = 200;
159 res.setHeader('Content-Type', 'text/plain; charset=gbk; qs=1');
160 res.end(convert('中文', 'gbk'));
161 }
162
163 if (p === '/redirect/301') {
164 res.statusCode = 301;
165 res.setHeader('Location', '/inspect');
166 res.end();
167 }
168
169 if (p === '/redirect/302') {
170 res.statusCode = 302;
171 res.setHeader('Location', '/inspect');
172 res.end();
173 }
174
175 if (p === '/redirect/303') {
176 res.statusCode = 303;
177 res.setHeader('Location', '/inspect');
178 res.end();
179 }
180
181 if (p === '/redirect/307') {
182 res.statusCode = 307;
183 res.setHeader('Location', '/inspect');
184 res.end();
185 }
186
187 if (p === '/redirect/308') {
188 res.statusCode = 308;
189 res.setHeader('Location', '/inspect');
190 res.end();
191 }
192
193 if (p === '/redirect/chain') {
194 res.statusCode = 301;
195 res.setHeader('Location', '/redirect/301');
196 res.end();
197 }
198
199 if (p === '/error/redirect') {
200 res.statusCode = 301;
201 //res.setHeader('Location', '/inspect');
202 res.end();
203 }
204
205 if (p === '/error/400') {
206 res.statusCode = 400;
207 res.setHeader('Content-Type', 'text/plain');
208 res.end('client error');
209 }
210
211 if (p === '/error/500') {
212 res.statusCode = 500;
213 res.setHeader('Content-Type', 'text/plain');
214 res.end('server error');
215 }
216
217 if (p === '/error/reset') {
218 res.destroy();
219 }
220
221 if (p === '/error/json') {
222 res.statusCode = 200;
223 res.setHeader('Content-Type', 'application/json');
224 res.end('invalid json');
225 }
226
227 if (p === '/empty') {
228 res.statusCode = 204;
229 res.end();
230 }
231
232 if (p === '/inspect') {
233 res.statusCode = 200;
234 res.setHeader('Content-Type', 'application/json');
235 var body = '';
236 req.on('data', function(c) { body += c });
237 req.on('end', function() {
238 res.end(JSON.stringify({
239 method: req.method,
240 url: req.url,
241 headers: req.headers,
242 body: body
243 }));
244 });
245 }
246
247}