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 === '/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 |
|
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 | }
|