UNPKG

4.9 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 === '/cookie') {
91 res.statusCode = 200;
92 res.setHeader('Set-Cookie', ['a=1', 'b=1']);
93 res.end('cookie');
94 }
95
96 if (p === '/size/chunk') {
97 res.statusCode = 200;
98 res.setHeader('Content-Type', 'text/plain');
99 setTimeout(function() {
100 res.write('test');
101 }, 50);
102 setTimeout(function() {
103 res.end('test');
104 }, 100);
105 }
106
107 if (p === '/size/long') {
108 res.statusCode = 200;
109 res.setHeader('Content-Type', 'text/plain');
110 res.end('testtest');
111 }
112
113 if (p === '/encoding/gbk') {
114 res.statusCode = 200;
115 res.setHeader('Content-Type', 'text/html');
116 res.end(convert('<meta charset="gbk"><div>中文</div>', 'gbk'));
117 }
118
119 if (p === '/encoding/gb2312') {
120 res.statusCode = 200;
121 res.setHeader('Content-Type', 'text/html');
122 res.end(convert('<meta http-equiv="Content-Type" content="text/html; charset=gb2312"><div>中文</div>', 'gb2312'));
123 }
124
125 if (p === '/encoding/shift-jis') {
126 res.statusCode = 200;
127 res.setHeader('Content-Type', 'text/html; charset=Shift-JIS');
128 res.end(convert('<div>日本語</div>', 'Shift_JIS'));
129 }
130
131 if (p === '/encoding/euc-jp') {
132 res.statusCode = 200;
133 res.setHeader('Content-Type', 'text/xml');
134 res.end(convert('<?xml version="1.0" encoding="EUC-JP"?><title>日本語</title>', 'EUC-JP'));
135 }
136
137 if (p === '/encoding/utf8') {
138 res.statusCode = 200;
139 res.end('中文');
140 }
141
142 if (p === '/redirect/301') {
143 res.statusCode = 301;
144 res.setHeader('Location', '/inspect');
145 res.end();
146 }
147
148 if (p === '/redirect/302') {
149 res.statusCode = 302;
150 res.setHeader('Location', '/inspect');
151 res.end();
152 }
153
154 if (p === '/redirect/303') {
155 res.statusCode = 303;
156 res.setHeader('Location', '/inspect');
157 res.end();
158 }
159
160 if (p === '/redirect/307') {
161 res.statusCode = 307;
162 res.setHeader('Location', '/inspect');
163 res.end();
164 }
165
166 if (p === '/redirect/308') {
167 res.statusCode = 308;
168 res.setHeader('Location', '/inspect');
169 res.end();
170 }
171
172 if (p === '/redirect/chain') {
173 res.statusCode = 301;
174 res.setHeader('Location', '/redirect/301');
175 res.end();
176 }
177
178 if (p === '/error/redirect') {
179 res.statusCode = 301;
180 //res.setHeader('Location', '/inspect');
181 res.end();
182 }
183
184 if (p === '/error/400') {
185 res.statusCode = 400;
186 res.setHeader('Content-Type', 'text/plain');
187 res.end('client error');
188 }
189
190 if (p === '/error/500') {
191 res.statusCode = 500;
192 res.setHeader('Content-Type', 'text/plain');
193 res.end('server error');
194 }
195
196 if (p === '/error/reset') {
197 res.destroy();
198 }
199
200 if (p === '/error/json') {
201 res.statusCode = 200;
202 res.setHeader('Content-Type', 'application/json');
203 res.end('invalid json');
204 }
205
206 if (p === '/empty') {
207 res.statusCode = 204;
208 res.end();
209 }
210
211 if (p === '/inspect') {
212 res.statusCode = 200;
213 res.setHeader('Content-Type', 'application/json');
214 var body = '';
215 req.on('data', function(c) { body += c });
216 req.on('end', function() {
217 res.end(JSON.stringify({
218 method: req.method,
219 url: req.url,
220 headers: req.headers,
221 body: body
222 }));
223 });
224 }
225
226}