1 |
|
2 | var http = require('http');
|
3 | var parse = require('url').parse;
|
4 | var zlib = require('zlib');
|
5 | var stream = require('stream');
|
6 | var convert = require('encoding').convert;
|
7 |
|
8 | module.exports = TestServer;
|
9 |
|
10 | function 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 |
|
19 | TestServer.prototype.start = function(cb) {
|
20 | this.server.listen(this.port, this.hostname, cb);
|
21 | }
|
22 |
|
23 | TestServer.prototype.stop = function(cb) {
|
24 | this.server.close(cb);
|
25 | }
|
26 |
|
27 | TestServer.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 |
|
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 | }
|