topbit 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +128 -0
  2. package/README.cn.md +1562 -0
  3. package/README.md +1272 -0
  4. package/bin/app.js +17 -0
  5. package/bin/loadinfo.sh +18 -0
  6. package/bin/new-ctl.js +230 -0
  7. package/bin/newapp.js +22 -0
  8. package/cache/allow.js +130 -0
  9. package/cache/errserv.js +45 -0
  10. package/cache/minserv.js +167 -0
  11. package/cache/router.js +84 -0
  12. package/cache/rsa/localhost-cert.pem +19 -0
  13. package/cache/rsa/localhost-privkey.pem +28 -0
  14. package/cache/servsock.js +286 -0
  15. package/cache/sni.js +66 -0
  16. package/demo/allow.js +98 -0
  17. package/demo/group-api.js +161 -0
  18. package/demo/group-api2.js +109 -0
  19. package/demo/log.js +118 -0
  20. package/demo/memlimit.js +31 -0
  21. package/demo/min.js +7 -0
  22. package/demo/serv.js +15 -0
  23. package/images/middleware.jpg +0 -0
  24. package/images/titbit-middleware.png +0 -0
  25. package/images/titbit.png +0 -0
  26. package/package.json +38 -8
  27. package/src/bodyparser.js +420 -0
  28. package/src/connfilter.js +125 -0
  29. package/src/context1.js +166 -0
  30. package/src/context2.js +179 -0
  31. package/src/ctxpool.js +38 -0
  32. package/src/ext.js +318 -0
  33. package/src/fastParseUrl.js +426 -0
  34. package/src/headerLimit.js +18 -0
  35. package/src/http1.js +337 -0
  36. package/src/http2.js +337 -0
  37. package/src/httpc.js +251 -0
  38. package/src/loader/loader.js +999 -0
  39. package/src/logger.js +32 -0
  40. package/src/loggermsg.js +349 -0
  41. package/src/makeId.js +200 -0
  42. package/src/midcore.js +213 -0
  43. package/src/middleware1.js +104 -0
  44. package/src/middleware2.js +121 -0
  45. package/src/monitor.js +380 -0
  46. package/src/movefile.js +30 -0
  47. package/src/optionsCheck.js +54 -0
  48. package/src/randstring.js +23 -0
  49. package/src/router.js +682 -0
  50. package/src/sendmsg.js +27 -0
  51. package/src/strong.js +72 -0
  52. package/src/token/token.js +462 -0
  53. package/src/topbit.js +1291 -0
  54. package/src/versionCheck.js +31 -0
  55. package/test/test-bigctx.js +29 -0
  56. package/test/test-daemon-args.js +7 -0
  57. package/test/test-find.js +69 -0
  58. package/test/test-helper.js +81 -0
  59. package/test/test-route-sort.js +71 -0
  60. package/test/test-route.js +49 -0
  61. package/test/test-route2.js +51 -0
  62. package/test/test-run-args.js +7 -0
  63. package/test/test-url.js +52 -0
  64. package/tmp/buff-code +134 -0
  65. package/tmp/devplan +9 -0
  66. package/tmp/evt-test.js +34 -0
  67. package/tmp/fastParseUrl.js +302 -0
  68. package/tmp/router-rule.js +559 -0
  69. package/tmp/test-cdps.js +122 -0
  70. package/tmp/titbit.js +1286 -0
  71. package/main.js +0 -0
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ const titbit = require('../lib/titbit.js');
4
+
5
+ var app = new titbit({
6
+ //daemon: true,
7
+ maxBody: 2500000,
8
+ debug: true,
9
+ useLimit: true,
10
+ //deny : ['10.7.10.149'],
11
+ maxIPRequest: 480,
12
+ peerTime: 1,
13
+ showLoadInfo: false,
14
+ globalLog: true,
15
+ logType: 'stdio',
16
+ loadInfoFile: '/tmp/loadinfo.log',
17
+ pageNotFound: `<!DOCTYPE html>
18
+ <html>
19
+ <head>
20
+ <meta charset="utf-8">
21
+ <meta name="viewport" content="width=device-width">
22
+ <title>titbit - not found</title>
23
+ </head>
24
+ <body>
25
+ <div style="margin-top:3.8rem;text-align:center;color:#565758;">
26
+ <h1>404 : page not found</h1>
27
+ </div>
28
+ </body>
29
+ </html>
30
+ `,
31
+ });
32
+
33
+ var {router} = app;
34
+
35
+ router.options('/*', async c => {
36
+ console.log(c.param.starPath);
37
+ c.setHeader('Access-control-allow-origin', '*');
38
+ c.setHeader('Access-control-allow-methods', app.router.methods);
39
+ }, 'options-check');
40
+
41
+ router.get('/', async ctx => {
42
+ ctx.res.body = 'ok';
43
+ });
44
+
45
+ router.post('/p', async ctx => {
46
+ ctx.res.body = ctx.body;
47
+ }, '@post');
48
+
49
+ router.post('/pt', async ctx => {
50
+ ctx.res.body = ctx.body;
51
+ }, {name: 'post-test2', group: 'post'});
52
+
53
+ app.use(async (ctx, next) => {
54
+ var start_time = Date.now();
55
+ await next(ctx);
56
+ var end_time = Date.now();
57
+ var timing = end_time-start_time;
58
+ console.log(process.pid,ctx.path, `: ${timing}ms`);
59
+ });
60
+
61
+ router.get('/err', async ctx => {
62
+ ctx.res.body = '500 error';
63
+ ctx.status(500);
64
+ });
65
+
66
+ router.get('/a/:a/:b/', async c => {
67
+ c.res.body = c.param;
68
+ });
69
+
70
+ router.get('x/*', async c => {
71
+ c.res.body = c.param.starPath;
72
+ });
73
+
74
+ router.get('/:name/:id/:age', async c => {
75
+ c.res.body = c.param;
76
+ });
77
+
78
+ //放在最后不会和/err冲突
79
+ router.get('/:name', async c => {
80
+ c.send(c.param.name)
81
+ })
82
+
83
+ app.run(2023);
84
+
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC/jCCAeagAwIBAgIJAM7LJO+3smgrMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
3
+ BAMMCWxvY2FsaG9zdDAeFw0xOTAzMTMxNDI1NDVaFw0xOTA0MTIxNDI1NDVaMBQx
4
+ EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
5
+ ggEBANlxw2tilmgttCHtzCkQRlbLicxSRjXEY/5JXSUZdKNGlBFLovclK/OrpixO
6
+ c9ijw6z6TPT3yvYkF2r1GKWYZWZeSdIfnd3M8UCJr06Jh8DAFZ14YUjyPcEo0Kfi
7
+ rJ/wecxRKsO1MehXo5YfgQ+IruuYYxyEhZOV8cmvXb7gi7hsKTnJ+2Xogef8sxlF
8
+ bHC+ySqHsODA2W1kX03jWUq2jo3j0D1yJ+8B103e2CMeiqjuIhvAzP700IOLNF2G
9
+ fPZ6RMLRWOTMpRMy5DtDKs/mX6Ohm7oVbpqhvC4QqP84+RyU30+/ThnU36K40rCH
10
+ 13VBi/4IThvXjjMCK06famj4bA0CAwEAAaNTMFEwHQYDVR0OBBYEFGpeaaG9leYI
11
+ W9rfUeTlgU7F0FP7MB8GA1UdIwQYMBaAFGpeaaG9leYIW9rfUeTlgU7F0FP7MA8G
12
+ A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBALtt9KQO1erWzNZGFN7h
13
+ NIsxMAg0DifUUR4HzOwVsOSjlxdkzkOylF7yYROptUIluuF90pC7RQ1EztwlPqTI
14
+ XrpLhU/JJcAx80Z+9XJJa3hS+mctaJ+Uv0lLY5uQgrYJCsK+qJ9XMOBjA8Uziyu/
15
+ mFgvfW/5Ts0mwTRn0MKLf2vRIH4F3syeiVLTxDJ0s6fKfrCryNSo8LGYAOfr0rCg
16
+ 4BbTyDt1UB+nTY6xM12zybJ/OtIZtfRG5JZHHsB1kbsOw+WzWrcKbsqncrivGt8m
17
+ XgNCpvSLE4v+giPocOkX6ySq+RCTFvdlhv1bCsHlOW5vMpSur0SQLcnSUnRfk41W
18
+ BuI=
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZccNrYpZoLbQh
3
+ 7cwpEEZWy4nMUkY1xGP+SV0lGXSjRpQRS6L3JSvzq6YsTnPYo8Os+kz098r2JBdq
4
+ 9RilmGVmXknSH53dzPFAia9OiYfAwBWdeGFI8j3BKNCn4qyf8HnMUSrDtTHoV6OW
5
+ H4EPiK7rmGMchIWTlfHJr12+4Iu4bCk5yftl6IHn/LMZRWxwvskqh7DgwNltZF9N
6
+ 41lKto6N49A9cifvAddN3tgjHoqo7iIbwMz+9NCDizRdhnz2ekTC0VjkzKUTMuQ7
7
+ QyrP5l+joZu6FW6aobwuEKj/OPkclN9Pv04Z1N+iuNKwh9d1QYv+CE4b144zAitO
8
+ n2po+GwNAgMBAAECggEAZN35+dlszfzNf6Owvie3iVG3pVlRCmYEwJPFqo0JZyg5
9
+ TWCZwy2yGsG4PvtRj+A/yAEAK+66br3FQy9Y9JAiEX+RnPBfqeEE1JxJ/xObLpWs
10
+ MTUDY/RDI1RMnmRvEW5bAaVxQgHOmen1j5EjrFIKWm2BJFxxHkpDM/yubvn4tl5T
11
+ JxQk+CSNsLFZ57jd8JyIugOOql7HQNyY21Si3c9Q2HXDbXvIv/s0Bw1PB1xGXBbI
12
+ /58wz/dSajNIuYbJB3Q85PRLo12Xkb+3L5GUJDoOqrOG3aZn9OM0uNpvUNaByPyT
13
+ wL86vlyLQAlLreAL0GDCiZAMalp1JKmNNSGqMa33oQKBgQD0Qo3m4+EW0uvijF8S
14
+ dWdHeKT4lmoowpTCQiZpcZmJ1iWkpxAovjMwZf48j+giLIg7cYpxQHGTmryBb3F+
15
+ bV3Vcc4QSD1r8tAgnI+WLA2rn698syuxsAG9UUpzzQgjLRY8298OIJJS3kypfCse
16
+ hjoLwUt6kbopNn/kKXSQ2krc6QKBgQDj5UMi5Yhq5Rvof5r2j+Wr9mlYdEMOV8zc
17
+ u5fmkrSpo/li16z7XHX/e1Srq4EAcbX7XBdZc9G5injVOrtmpeZC0+/8lU6nN4Po
18
+ q0Ab5Wra5Ws5WU7bog2poHac+tWGItds6R5bfwes0f4AtSS3623FnynB9kOPycST
19
+ ZeHSdtIPhQKBgAGtW1AUjH0doaUClbyItdbVyzwxvDTfcSoMTjs3HnjF0ahZxVCi
20
+ TbOtX5uG2W8yoxTVaL/yU1VSIK062KqnkZdfmqyd8l4FYsx2hr3fO5DMHeZbTJeB
21
+ v+FO55X3+HBVZOuyDswICTkscZZQVfN1tHxULXKAAak6yJIGfthnx0/RAoGAJLwb
22
+ 6lAdgT2VFhEbpYrkdqetq3hyJqm4eAw1HBGh1YZ8+JXTaGErFBeJOnLWxH+P2giq
23
+ Kt0kfUf42kYxVwZ+617GXGyk1Qd519Ni7hw48Tfx5LikoXqpwSIAfKViLdEH8KJT
24
+ JmR/lDf1PZ/1X0Av3Z8eWAmeMltPuIK/t/E3QxECgYAl76olBcjS+0LjOp10BnnZ
25
+ M4VM4JyqjXH21OQ7YcckhugHcF12A8Y1gUsZIL/NoIEECFeor4spF2AD74AFzyPw
26
+ +WUR2BETzvsQxEp0F096LXkRT0H8IlT3ZwUbdP0//NQ4KdLyn3o+8NsDXiXqeVpp
27
+ 4Ouzs+qyLyxI2/17yodFRA==
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,286 @@
1
+ 'use strict';
2
+
3
+ const titbit = require('../lib/titbit.js');
4
+ const zlib = require('zlib');
5
+ const fs = require('fs');
6
+ const cluster = require('cluster');
7
+
8
+ var app = new titbit({
9
+ //daemon: true,
10
+ maxBody: 1500000000,
11
+ debug: true,
12
+ useLimit: true,
13
+ //deny : ['192.168.3.4'],
14
+ maxIPRequest: 500,
15
+ peerTime: 2,
16
+ //cert : '../rsa/localhost-cert.pem',
17
+ //key : '../rsa/localhost-privkey.pem',
18
+ //http2: true,
19
+ //showLoadInfo: true,
20
+ loadInfoType : 'text',
21
+ loadInfoFile : '/tmp/titbit-load.log',
22
+ globalLog: true,
23
+ //loadInfoFile: '/tmp/loadinfo.log',
24
+ pageNotFound: `<!DOCTYPE html>
25
+ <html>
26
+ <head>
27
+ <meta charset="utf-8">
28
+ <meta name="viewport" content="width=device-width">
29
+ <title>titbit - not found</title>
30
+ </head>
31
+ <body>
32
+ <div style="margin-top:3.8rem;text-align:center;color:#565758;">
33
+ <h1>404 : page not found</h1>
34
+ </div>
35
+ </body>
36
+ </html>
37
+ `,
38
+ });
39
+
40
+ let sockpath = '/tmp/titbit.sock';
41
+ try {
42
+ fs.accessSync(sockpath);
43
+ fs.unlinkSync(sockpath);
44
+ } catch (err) {
45
+ }
46
+
47
+ app.service.router = app.router;
48
+
49
+ var {router} = app;
50
+ /*
51
+ app.addHook(async (c, next) => {
52
+ c.maxBody = 8;
53
+
54
+ await next(c);
55
+ }, {method : ['POST','PUT']});
56
+ */
57
+
58
+ var _userAgentCache = {};
59
+
60
+ app.use(async (c, next) => {
61
+ if (c.headers['user-agent'] === undefined) {
62
+ c.headers['user-agent'] = 'default-agent';
63
+ }
64
+
65
+ let ua = c.headers['user-agent'];
66
+
67
+ let key = `${ua}:${c.ip}`;
68
+
69
+ if (_userAgentCache[key] === undefined) {
70
+ _userAgentCache[key] = {
71
+ time : Date.now(),
72
+ count : 1
73
+ };
74
+ }
75
+
76
+ let uak = _userAgentCache[key];
77
+
78
+ let tm = Date.now();
79
+ if (tm - uak.time > 10000) {
80
+ uak.count = 1;
81
+ uak.time = tm;
82
+ }
83
+
84
+ if (uak.count > 150) {
85
+ c.status(503);
86
+ c.res.body = 'too many request';
87
+ return ;
88
+ }
89
+
90
+ uak.count += 1;
91
+
92
+ await next(c);
93
+
94
+ });
95
+
96
+ router.options('/*', async c => {
97
+ console.log(c.param.starPath);
98
+ c.setHeader('Access-control-allow-origin', '*');
99
+ c.setHeader('Access-control-allow-methods', app.router.methods);
100
+ }, 'options-check');
101
+
102
+ router.get('/', async ctx => {
103
+ let rsock = ctx.request.socket;
104
+ console.log(ctx.headers, rsock.remoteFamily);
105
+ ctx.send('ok');
106
+ });
107
+
108
+ router.get('/test', async ctx => {
109
+ let delay = parseInt(Math.random() * 300);
110
+
111
+ await new Promise((rv, rj) => {
112
+ setTimeout(() => {
113
+ rv();
114
+ }, delay);
115
+ });
116
+
117
+ ctx.send(Buffer.from(`我是中国人${delay}\n`));
118
+ });
119
+
120
+ router.post('/p', async ctx => {
121
+ ctx.res.body = ctx.body;
122
+ }, '@post');
123
+
124
+ router.post('/pt', async ctx => {
125
+ ctx.res.body = ctx.body;
126
+ }, {name: 'post-test2', group: 'post'});
127
+
128
+ app.get('/html', async c => {
129
+ c.html(`<!DOCTYPE html><html>
130
+ <head>
131
+ <meta charset="utf-8">
132
+ </head>
133
+ <body>
134
+ <div style="color:#676869;font-size:125%;text-align:center;">Great</div>
135
+ </body>
136
+ </html>`);
137
+ });
138
+
139
+ app.use(async (ctx, next) => {
140
+ var start_time = Date.now();
141
+ await next(ctx);
142
+ var end_time = Date.now();
143
+ var timing = end_time-start_time;
144
+ console.log(process.pid,ctx.path, `: ${timing}ms`);
145
+ });
146
+
147
+
148
+ /*
149
+ app.use(async (ctx, next) => {
150
+ console.log('middleware for POST/PUT');
151
+ await next(ctx);
152
+ console.log('middleware for POST/PUT -- ');
153
+ }, {method: ['POST','PUT']});
154
+
155
+ app.use(async (ctx, next) => {
156
+ console.log('a1');
157
+ await next(ctx);
158
+ console.log('a1');
159
+ });
160
+
161
+ app.use(async (ctx, next) => {
162
+ console.log('a2');
163
+ await next(ctx);
164
+ console.log('a2');
165
+ });
166
+
167
+ app.use(async (ctx, next) => {
168
+ console.log('a3');
169
+ await next(ctx);
170
+ console.log('a3');
171
+ }, {group: 'post'});
172
+ */
173
+
174
+ app.use(async (ctx, next) => {
175
+ console.log('checking file');
176
+ if (!ctx.isUpload) {
177
+ return ;
178
+ }
179
+ if (!ctx.getFile('image')) {
180
+ ctx.String('file not found, please upload with name "image" ');
181
+ return ;
182
+ }
183
+ await next(ctx);
184
+ }, {name: 'upload-image'});
185
+
186
+ router.post('/upload', async c => {
187
+ try {
188
+ console.log(c.files);
189
+ let results = [];
190
+ let tmp = '';
191
+ let fname = '';
192
+ let images = c.getFile('image', -1);
193
+
194
+ for(let i=0; i<images.length; i++) {
195
+ fname = `${process.env.HOME}/tmp/a/${c.helper.makeName(images[i].filename)}`;
196
+ tmp = await c.moveFile(images[i], fname);
197
+ results.push(tmp);
198
+ }
199
+ c.res.body = results;
200
+ } catch (err) {
201
+ console.log(err);
202
+ c.send(err.message);
203
+ }
204
+ }, {name: 'upload-image', group: 'upload'});
205
+
206
+ app.use(async (c, next) => {
207
+ if (c.getFile('file') === null) {
208
+ c.send('file not found -> c.files.file');
209
+ return ;
210
+ }
211
+ await next(c);
212
+
213
+ }, 'upload-file');
214
+
215
+ router.put('/upload', async c => {
216
+ try {
217
+ console.log(c.files);
218
+ console.log(c.body);
219
+ let files = c.getFile('file', -1);
220
+ let results = [];
221
+ let tmp = '';
222
+ for(let i=0; i<files.length; i++) {
223
+ try {
224
+ tmp = await c.moveFile(files[i], {
225
+ path: process.env.HOME+'/tmp/a'
226
+ });
227
+ results.push(tmp);
228
+ //console.log('not move');
229
+ } catch (err) {
230
+ console.log(err);
231
+ }
232
+ }
233
+ c.res.body = results;
234
+ } catch (err) {
235
+ c.res.body = err.message;
236
+ }
237
+ }, {name:'upload-file', group:'upload'});
238
+
239
+ router.get('/err', async ctx => {
240
+ throw 'Error: test';
241
+ });
242
+
243
+ router.get('/app', async c => {
244
+ c.send(c.service.router.group());
245
+ });
246
+
247
+ app.use(async (c, next) => {
248
+ c.cache = true;
249
+ c.setHeader('content-encoding', 'gzip');
250
+ c.setHeader('content-type', 'text/plain; charset=utf-8');
251
+ await next(c);
252
+ c.resBody = await new Promise((rv, rj) => {
253
+ zlib.gzip(c.resBody, {encoding:'utf8'}, (err, data) => {
254
+ if (err) {rj (err);}
255
+ rv(data);
256
+ });
257
+ });
258
+ }, {name: 'gzip-test'});
259
+
260
+ router.get('/quantum', async c => {
261
+ let data = await new Promise((rv, rj) => {
262
+ fs.readFile('../tmp/quantum', {encoding:'utf8'}, (err, data) => {
263
+ if (err) { rj(err); }
264
+ rv(data);
265
+ });
266
+ });
267
+ c.send(data);
268
+ }, 'gzip-test');
269
+
270
+ router.get('/router', async c => {
271
+ c.res.body = [
272
+ c.service.router.routeTable(),
273
+ c.service.router.group()
274
+ ];
275
+ });
276
+
277
+ /*
278
+ if (cluster.isWorker) {
279
+ setTimeout(() => {
280
+ process.exit(2);
281
+ }, 150);
282
+ }
283
+ */
284
+
285
+ app.daemon(sockpath, 1);
286
+
package/cache/sni.js ADDED
@@ -0,0 +1,66 @@
1
+ 'use strict';
2
+
3
+ const titbit = require('../lib/titbit.js');
4
+ const fs = require('fs');
5
+ const tls = require('tls');
6
+
7
+ var certs = {
8
+ 'daojian.w3xm.top' : {
9
+ cert : fs.readFileSync('../tmp/daojian.w3xm.top.pem'),
10
+ key : fs.readFileSync('../tmp/daojian.w3xm.top.key')
11
+ },
12
+
13
+ 'www.w3xm.top' : {
14
+ cert : fs.readFileSync('../tmp/www.w3xm.top.pem'),
15
+ key : fs.readFileSync('../tmp/www.w3xm.top.key')
16
+ }
17
+ };
18
+
19
+ var app = new titbit({
20
+ debug: true,
21
+ showLoadInfo: false,
22
+ http2: true,
23
+ https: true,
24
+ server : {
25
+ SNICallback : (servername, cb) => {
26
+ return cb(null, tls.createSecureContext(certs[servername]));
27
+ }
28
+ },
29
+ pidFile: '/tmp/mymaster.pid'
30
+ });
31
+
32
+ var {router} = app;
33
+
34
+ app.use(async (ctx, next) => {
35
+ console.log('mid');
36
+ await next(ctx);
37
+ });
38
+
39
+ app.use(async (c, next) => {
40
+ if (!c.getFile('image')) {
41
+ c.res.body = 'image not found';
42
+ return ;
43
+ }
44
+ await next(c);
45
+ }, {method:'POST', group: 'upload'});
46
+
47
+ router.get('/', async c => {
48
+ c.res.body = 'ok';
49
+ });
50
+
51
+ router.post('/p', async c => {
52
+ c.res.body = c.body;
53
+ });
54
+
55
+ router.post('/upload', async c => {
56
+ try {
57
+ c.res.body = await c.moveFile(c.getFile('image'), {
58
+ path: process.env.HOME + '/tmp/buffer'
59
+ });
60
+ } catch (err) {
61
+ c.res.body = err.message;
62
+ }
63
+ }, '@upload');
64
+
65
+ app.daemon(1990);
66
+
package/demo/allow.js ADDED
@@ -0,0 +1,98 @@
1
+ 'use strict';
2
+
3
+ const titbit = require('../lib/titbit.js');
4
+
5
+ const app = new titbit({
6
+ debug : true,
7
+ allow : new Set(['127.0.0.1']),
8
+ maxIPRequest: 2,
9
+ unitTime: 10,
10
+ useLimit: true,
11
+ maxConn: 2000,
12
+ //http2: true,
13
+ showLoadInfo: true,
14
+ loadInfoType : 'text',
15
+ globalLog : true,
16
+ logType: 'stdio',
17
+ loadInfoFile : '/tmp/loadinfo.log'
18
+ });
19
+
20
+ app.use(async (c, next) => {
21
+ console.log('pre middleware start');
22
+ console.log(c.group, c.name, c.method, c.path);
23
+ await next();
24
+ console.log('pre middleware end');
25
+ }, {pre : true});
26
+
27
+ app.use(async (c, next) => {
28
+ console.log('middleware 1');
29
+ await next();
30
+ console.log('middleware 1 end');
31
+ }, 'home');
32
+
33
+ app.use(async (c, next) => {
34
+ console.log('middleware 2');
35
+ c.body.say = '你好';
36
+ await next();
37
+ console.log('middleware 2 end');
38
+ }, {group: 'test', method: 'POST'});
39
+
40
+ app.use(async (c, next) => {
41
+ console.log('middleware 3');
42
+ if (c.query.say == 'hey') {
43
+ c.send('你好,test 接口 GET请求结束。');
44
+ } else {
45
+ await next();
46
+ }
47
+ console.log('middleware 3 end');
48
+ }, {group: 'test', method : 'GET'});
49
+
50
+ app.use(async (c, next) => {
51
+ console.log('set body size');
52
+ c.maxBody = 24;
53
+ await next();
54
+ }, {name: 'test-post', pre: true});
55
+
56
+ app.use(async (c, next) => {
57
+ console.log('middleware 4');
58
+ c.body.x = 12;
59
+ await next();
60
+ console.log('middleware 4 end');
61
+ }, 'test-post');
62
+
63
+ app.get('/', async c => {
64
+ c.send('ok');
65
+ }, 'home');
66
+
67
+ app.get('/test', async c => {
68
+ c.send(c.name);
69
+ }, {group: 'test', name : 'test'});
70
+
71
+ app.post('/test', async c => {
72
+ c.send(c.body);
73
+ }, {group: 'test', name : 'test-post'});
74
+
75
+ app.post('/transmit', async c => {
76
+ c.send('ok');
77
+ }, 'transmit');
78
+
79
+ app.use(async (c, next) => {
80
+ let total = 0;
81
+
82
+ c.box.dataHandle = (data) => {
83
+ total += data.length;
84
+ if (total > 32) {
85
+ c.response.statusCode = 413;
86
+ c.response.end('太多了,限制32字节以内');
87
+ return ;
88
+ }
89
+ };
90
+
91
+ await next();
92
+
93
+ console.log(total, 'bytes');
94
+
95
+ }, {pre: true, method: 'POST', name: 'transmit'});
96
+
97
+
98
+ app.daemon(2034, 2);