ultimate-express 1.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.
- package/.github/workflows/test.yml +27 -0
- package/EXPRESS_LICENSE +26 -0
- package/README.md +269 -0
- package/package.json +76 -0
- package/src/application.js +295 -0
- package/src/index.js +23 -0
- package/src/middlewares.js +95 -0
- package/src/request.js +324 -0
- package/src/response.js +686 -0
- package/src/router.js +490 -0
- package/src/utils.js +285 -0
- package/src/view.js +103 -0
- package/src/workers/fs.js +14 -0
- package/tests/index.js +64 -0
- package/tests/parts/.test/index.html +11 -0
- package/tests/parts/big.jpg +0 -0
- package/tests/parts/index.art +12 -0
- package/tests/parts/index.dot +12 -0
- package/tests/parts/index.ejs +12 -0
- package/tests/parts/index.handlebars +2 -0
- package/tests/parts/index.html +12 -0
- package/tests/parts/index.mustache +12 -0
- package/tests/parts/index.pug +6 -0
- package/tests/parts/index.swig +12 -0
- package/tests/parts/layouts/main.handlebars +12 -0
- package/tests/preload.cjs +5 -0
- package/tests/singular.js +41 -0
- package/tests/tests/app/app-engine.js +8 -0
- package/tests/tests/app/app-on-mount.js +24 -0
- package/tests/tests/app/app-path.js +21 -0
- package/tests/tests/app/app-route.js +30 -0
- package/tests/tests/app/options.js +16 -0
- package/tests/tests/app/setting-inheritance.js +16 -0
- package/tests/tests/engines/art-template.js +33 -0
- package/tests/tests/engines/dot.js +28 -0
- package/tests/tests/engines/ejs.js +25 -0
- package/tests/tests/engines/handlebars.js +28 -0
- package/tests/tests/engines/mustache.js +28 -0
- package/tests/tests/engines/pug.js +25 -0
- package/tests/tests/engines/swig.js +28 -0
- package/tests/tests/errors/error-handling-middleware.js +22 -0
- package/tests/tests/errors/next-error-optimized.js +26 -0
- package/tests/tests/errors/next-error.js +26 -0
- package/tests/tests/errors/unexpected-error-handling.js +18 -0
- package/tests/tests/listen/listen-random.js +11 -0
- package/tests/tests/listen/listen-specific.js +17 -0
- package/tests/tests/middlewares/body-json.js +31 -0
- package/tests/tests/middlewares/body-raw-deflate.js +43 -0
- package/tests/tests/middlewares/body-raw-gzip.js +43 -0
- package/tests/tests/middlewares/body-raw.js +41 -0
- package/tests/tests/middlewares/body-text.js +27 -0
- package/tests/tests/middlewares/body-urlencoded.js +30 -0
- package/tests/tests/middlewares/cookie-parser-signed.js +31 -0
- package/tests/tests/middlewares/cookie-parser.js +28 -0
- package/tests/tests/middlewares/cookie-session.js +40 -0
- package/tests/tests/middlewares/cors.js +29 -0
- package/tests/tests/middlewares/errorhandler.js +26 -0
- package/tests/tests/middlewares/express-fileupload-temp.js +46 -0
- package/tests/tests/middlewares/express-fileupload.js +28 -0
- package/tests/tests/middlewares/express-rate-limit.js +33 -0
- package/tests/tests/middlewares/express-session.js +37 -0
- package/tests/tests/middlewares/express-static-options.js +72 -0
- package/tests/tests/middlewares/express-static.js +40 -0
- package/tests/tests/middlewares/method-override.js +33 -0
- package/tests/tests/middlewares/multer.js +43 -0
- package/tests/tests/middlewares/multiple-middlewares.js +37 -0
- package/tests/tests/middlewares/response-time.js +29 -0
- package/tests/tests/middlewares/serve-index.js +38 -0
- package/tests/tests/middlewares/serve-static.js +38 -0
- package/tests/tests/middlewares/vhost.js +50 -0
- package/tests/tests/params/array-param.js +30 -0
- package/tests/tests/params/nested-params.js +24 -0
- package/tests/tests/params/param-errors.js +56 -0
- package/tests/tests/params/param-function.js +49 -0
- package/tests/tests/params/param-next-route.js +48 -0
- package/tests/tests/params/param-optimized.js +38 -0
- package/tests/tests/params/param-use.js +39 -0
- package/tests/tests/params/param.js +68 -0
- package/tests/tests/params/params-regex.js +26 -0
- package/tests/tests/params/params-use.js +20 -0
- package/tests/tests/params/params.js +35 -0
- package/tests/tests/req/req-accepts-charsets.js +40 -0
- package/tests/tests/req/req-accepts-encodings.js +36 -0
- package/tests/tests/req/req-accepts-languages.js +41 -0
- package/tests/tests/req/req-accepts.js +41 -0
- package/tests/tests/req/req-app.js +17 -0
- package/tests/tests/req/req-baseurl.js +38 -0
- package/tests/tests/req/req-connection.js +19 -0
- package/tests/tests/req/req-fresh.js +59 -0
- package/tests/tests/req/req-get.js +78 -0
- package/tests/tests/req/req-headers-distinct.js +72 -0
- package/tests/tests/req/req-headers.js +72 -0
- package/tests/tests/req/req-host.js +45 -0
- package/tests/tests/req/req-hostname.js +45 -0
- package/tests/tests/req/req-ip.js +19 -0
- package/tests/tests/req/req-is.js +44 -0
- package/tests/tests/req/req-original-url.js +29 -0
- package/tests/tests/req/req-param.js +29 -0
- package/tests/tests/req/req-protocol.js +20 -0
- package/tests/tests/req/req-query.js +23 -0
- package/tests/tests/req/req-range.js +48 -0
- package/tests/tests/req/req-raw-headers.js +72 -0
- package/tests/tests/req/req-subdomains.js +48 -0
- package/tests/tests/req/req-url-nested.js +27 -0
- package/tests/tests/req/req-url-optimized-router.js +26 -0
- package/tests/tests/req/req-url-optimized.js +23 -0
- package/tests/tests/req/req-url.js +36 -0
- package/tests/tests/req/req-xhr.js +23 -0
- package/tests/tests/res/head-content-length.js +18 -0
- package/tests/tests/res/head.js +47 -0
- package/tests/tests/res/injecting.js +25 -0
- package/tests/tests/res/piping.js +23 -0
- package/tests/tests/res/res-app.js +17 -0
- package/tests/tests/res/res-append.js +24 -0
- package/tests/tests/res/res-attachment.js +19 -0
- package/tests/tests/res/res-clear-cookie.js +18 -0
- package/tests/tests/res/res-cookie.js +22 -0
- package/tests/tests/res/res-download.js +36 -0
- package/tests/tests/res/res-format.js +57 -0
- package/tests/tests/res/res-get.js +18 -0
- package/tests/tests/res/res-headers-sent.js +18 -0
- package/tests/tests/res/res-json.js +17 -0
- package/tests/tests/res/res-jsonp.js +25 -0
- package/tests/tests/res/res-links.js +21 -0
- package/tests/tests/res/res-location.js +34 -0
- package/tests/tests/res/res-redirect.js +46 -0
- package/tests/tests/res/res-remove-header.js +19 -0
- package/tests/tests/res/res-send-file.js +17 -0
- package/tests/tests/res/res-send-status.js +17 -0
- package/tests/tests/res/res-send.js +69 -0
- package/tests/tests/res/res-set.js +28 -0
- package/tests/tests/res/res-status.js +18 -0
- package/tests/tests/res/res-type.js +19 -0
- package/tests/tests/res/res-vary.js +19 -0
- package/tests/tests/res/res-write.js +29 -0
- package/tests/tests/routers/complex-routers.js +34 -0
- package/tests/tests/routers/empty-router.js +25 -0
- package/tests/tests/routers/lot-of-routes.js +38 -0
- package/tests/tests/routers/mergeparams.js +42 -0
- package/tests/tests/routers/nested-routers.js +52 -0
- package/tests/tests/routers/router-options.js +68 -0
- package/tests/tests/routers/routers.js +45 -0
- package/tests/tests/routers/simple-routers.js +35 -0
- package/tests/tests/routing/all.js +47 -0
- package/tests/tests/routing/array-arguments.js +35 -0
- package/tests/tests/routing/array-use.js +33 -0
- package/tests/tests/routing/async-use.js +25 -0
- package/tests/tests/routing/complex-routes.js +50 -0
- package/tests/tests/routing/lot-of-param-routes.js +26 -0
- package/tests/tests/routing/lot-of-routes.js +59 -0
- package/tests/tests/routing/next-existent-optimized-route.js +29 -0
- package/tests/tests/routing/next-existent-route.js +29 -0
- package/tests/tests/routing/next-nonexistent-optimized-route.js +19 -0
- package/tests/tests/routing/next-nonexistent-route.js +19 -0
- package/tests/tests/routing/next-special-cases.js +54 -0
- package/tests/tests/routing/next-unoptimized.js +39 -0
- package/tests/tests/routing/no-path-use.js +29 -0
- package/tests/tests/routing/non-string-routes.js +27 -0
- package/tests/tests/routing/req-multiple-mountpaths.js +34 -0
- package/tests/tests/routing/simple-routes.js +29 -0
- package/tests/tests/routing/simple-use.js +52 -0
- package/tests/tests/routing/some-middlewares.js +27 -0
- package/tests/tests/routing/special-characters.js +28 -0
- package/tests/tests/routing/star.js +31 -0
- package/tests/tests/routing/sub-apps.js +32 -0
- package/tests/tests/routing/trailing-slash.js +37 -0
- package/tests/tests/routing/weird-route-start.js +18 -0
- package/tests/tests/send-file/accept-ranges.js +26 -0
- package/tests/tests/send-file/callback.js +23 -0
- package/tests/tests/send-file/default-error-routing.js +21 -0
- package/tests/tests/send-file/dotfiles.js +24 -0
- package/tests/tests/send-file/etag.js +19 -0
- package/tests/tests/send-file/fs-threads.js +39 -0
- package/tests/tests/send-file/head.js +49 -0
- package/tests/tests/send-file/headers.js +23 -0
- package/tests/tests/send-file/if-match.js +31 -0
- package/tests/tests/send-file/if-range.js +37 -0
- package/tests/tests/send-file/if-unmodified-since.js +32 -0
- package/tests/tests/send-file/immutable.js +22 -0
- package/tests/tests/send-file/large-file.js +19 -0
- package/tests/tests/send-file/last-modified.js +21 -0
- package/tests/tests/send-file/max-age.js +21 -0
- package/tests/tests/send-file/path-traversal.js +35 -0
- package/tests/tests/send-file/range.js +57 -0
- package/tests/tests/send-file/simple.js +18 -0
- package/tests/tests/settings/case-sensitive-routing.js +48 -0
- package/tests/tests/settings/env-errors.js +38 -0
- package/tests/tests/settings/etag.js +36 -0
- package/tests/tests/settings/json-escape.js +45 -0
- package/tests/tests/settings/json-replacer.js +50 -0
- package/tests/tests/settings/json-spaces.js +44 -0
- package/tests/tests/settings/query-parser.js +45 -0
- package/tests/tests/settings/strict-routing.js +64 -0
- package/tests/tests/settings/subdomain-offset.js +38 -0
- package/tests/tests/settings/trust-proxy-host.js +58 -0
- package/tests/tests/settings/trust-proxy-ip.js +58 -0
- package/tests/tests/settings/trust-proxy-ips.js +58 -0
- package/tests/tests/settings/trust-proxy-protocol.js +46 -0
- package/tests/tests/settings/x-powered-by.js +32 -0
- package/tests/uws.js +14 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// must support req.fresh and req.stale
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
|
|
7
|
+
app.get('/test', (req, res) => {
|
|
8
|
+
res.set('ETag', '"123"');
|
|
9
|
+
res.send([req.fresh, req.stale]);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const date = new Date();
|
|
13
|
+
|
|
14
|
+
app.get('/test2', (req, res) => {
|
|
15
|
+
res.set('Etag', '"1234"');
|
|
16
|
+
res.set('last-modified', date.toISOString());
|
|
17
|
+
res.send([req.fresh, req.stale]);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
app.listen(13333, async () => {
|
|
21
|
+
console.log('Server is running on port 13333');
|
|
22
|
+
|
|
23
|
+
const responses = await Promise.all([
|
|
24
|
+
fetch('http://localhost:13333/test', {
|
|
25
|
+
headers: {
|
|
26
|
+
'cache-control': 'max-age=604800',
|
|
27
|
+
},
|
|
28
|
+
}),
|
|
29
|
+
fetch('http://localhost:13333/test', {
|
|
30
|
+
headers: {
|
|
31
|
+
'cache-control': 'max-age=604800',
|
|
32
|
+
'if-none-match': '"123"',
|
|
33
|
+
},
|
|
34
|
+
}),
|
|
35
|
+
fetch('http://localhost:13333/test', {
|
|
36
|
+
headers: {
|
|
37
|
+
'cache-control': 'max-age=604800',
|
|
38
|
+
'if-none-match': '"1234"',
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
fetch('http://localhost:13333/test2', {
|
|
42
|
+
headers: {
|
|
43
|
+
'cache-control': 'max-age=604800',
|
|
44
|
+
},
|
|
45
|
+
}),
|
|
46
|
+
fetch('http://localhost:13333/test2', {
|
|
47
|
+
headers: {
|
|
48
|
+
'cache-control': 'max-age=604800',
|
|
49
|
+
'if-modified-since': new Date(date.getTime() - 1000).toISOString(),
|
|
50
|
+
},
|
|
51
|
+
}),
|
|
52
|
+
]);
|
|
53
|
+
|
|
54
|
+
const texts = await Promise.all(responses.map(res => res.text()));
|
|
55
|
+
|
|
56
|
+
console.log(texts, responses.map(res => res.status));
|
|
57
|
+
|
|
58
|
+
process.exit(0);
|
|
59
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// must support req.get()
|
|
2
|
+
|
|
3
|
+
const net = require("net");
|
|
4
|
+
const express = require("express");
|
|
5
|
+
|
|
6
|
+
// this is needed to actually test multiple headers with the same name
|
|
7
|
+
// because fetch just combines them into one
|
|
8
|
+
async function sendRequest(method, url, arrayHeaders) {
|
|
9
|
+
// arrayHeaders is an array of [key, value] pairs
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const client = new net.Socket();
|
|
12
|
+
const [host, port] = url.split('://')[1].split('/')[0].split(':');
|
|
13
|
+
const path = '/' + url.split('/').slice(3).join('/');
|
|
14
|
+
|
|
15
|
+
client.connect(parseInt(port), host, () => {
|
|
16
|
+
let request = `${method} ${path} HTTP/1.1\r\n`;
|
|
17
|
+
request += `Host: ${host}:${port}\r\n`;
|
|
18
|
+
|
|
19
|
+
for (const [key, value] of arrayHeaders) {
|
|
20
|
+
request += `${key}: ${value}\r\n`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
request += '\r\n';
|
|
24
|
+
|
|
25
|
+
client.write(request);
|
|
26
|
+
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
client.destroy();
|
|
29
|
+
resolve();
|
|
30
|
+
}, 100);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const app = express();
|
|
36
|
+
app.get("/test", (req, res) => {
|
|
37
|
+
console.log(req.get('X-Test'));
|
|
38
|
+
console.log(req.get('Referer'));
|
|
39
|
+
console.log(req.get('referrer'));
|
|
40
|
+
console.log(req.get('Content-Type'));
|
|
41
|
+
console.log(req.get('Set-Cookie'));
|
|
42
|
+
res.send("test");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
app.listen(13333, async () => {
|
|
46
|
+
console.log('Server is running on port 13333');
|
|
47
|
+
|
|
48
|
+
let res;
|
|
49
|
+
res = await fetch('http://localhost:13333/test');
|
|
50
|
+
console.log(await res.text());
|
|
51
|
+
|
|
52
|
+
res = await fetch('http://localhost:13333/test', {
|
|
53
|
+
headers: {
|
|
54
|
+
'X-Test': 'test',
|
|
55
|
+
'Referer': 'http://example.com',
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
console.log(await res.text());
|
|
59
|
+
|
|
60
|
+
res = await fetch('http://localhost:13333/test', {
|
|
61
|
+
headers: {
|
|
62
|
+
'Set-Cookie': 'test=test; HttpOnly; Secure; SameSite=Strict',
|
|
63
|
+
'Referrer': 'http://example.com'
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
console.log(await res.text());
|
|
67
|
+
|
|
68
|
+
const headers = [];
|
|
69
|
+
headers.push(['X-Test', 'test']);
|
|
70
|
+
headers.push(['X-Test', 'test2']);
|
|
71
|
+
headers.push(['Cookie', 'test=test']);
|
|
72
|
+
headers.push(['Cookie', 'test2=test2']);
|
|
73
|
+
headers.push(['content-type', 'text/plain']);
|
|
74
|
+
headers.push(['content-type', 'application/json']);
|
|
75
|
+
res = await sendRequest('GET', 'http://localhost:13333/test', headers);
|
|
76
|
+
|
|
77
|
+
process.exit(0);
|
|
78
|
+
})
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// must support req.headersDistinct
|
|
2
|
+
|
|
3
|
+
const net = require("net");
|
|
4
|
+
const express = require("express");
|
|
5
|
+
|
|
6
|
+
// this is needed to actually test multiple headers with the same name
|
|
7
|
+
// because fetch just combines them into one
|
|
8
|
+
async function sendRequest(method, url, arrayHeaders) {
|
|
9
|
+
// arrayHeaders is an array of [key, value] pairs
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const client = new net.Socket();
|
|
12
|
+
const [host, port] = url.split('://')[1].split('/')[0].split(':');
|
|
13
|
+
const path = '/' + url.split('/').slice(3).join('/');
|
|
14
|
+
|
|
15
|
+
client.connect(parseInt(port), host, () => {
|
|
16
|
+
let request = `${method} ${path} HTTP/1.1\r\n`;
|
|
17
|
+
request += `Host: ${host}:${port}\r\n`;
|
|
18
|
+
|
|
19
|
+
for (const [key, value] of arrayHeaders) {
|
|
20
|
+
request += `${key}: ${value}\r\n`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
request += '\r\n';
|
|
24
|
+
|
|
25
|
+
client.write(request);
|
|
26
|
+
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
client.destroy();
|
|
29
|
+
resolve();
|
|
30
|
+
}, 100);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const app = express();
|
|
36
|
+
app.get("/test", (req, res) => {
|
|
37
|
+
console.log(req.headersDistinct);
|
|
38
|
+
res.send("test");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
app.listen(13333, async () => {
|
|
42
|
+
console.log('Server is running on port 13333');
|
|
43
|
+
|
|
44
|
+
let res;
|
|
45
|
+
res = await fetch('http://localhost:13333/test');
|
|
46
|
+
console.log(await res.text());
|
|
47
|
+
|
|
48
|
+
res = await fetch('http://localhost:13333/test', {
|
|
49
|
+
headers: {
|
|
50
|
+
'X-Test': 'test'
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
console.log(await res.text());
|
|
54
|
+
|
|
55
|
+
res = await fetch('http://localhost:13333/test', {
|
|
56
|
+
headers: {
|
|
57
|
+
'Set-Cookie': 'test=test; HttpOnly; Secure; SameSite=Strict'
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
console.log(await res.text());
|
|
61
|
+
|
|
62
|
+
const headers = [];
|
|
63
|
+
headers.push(['X-Test', 'test']);
|
|
64
|
+
headers.push(['X-Test', 'test2']);
|
|
65
|
+
headers.push(['Cookie', 'test=test']);
|
|
66
|
+
headers.push(['Cookie', 'test2=test2']);
|
|
67
|
+
headers.push(['content-type', 'text/plain']);
|
|
68
|
+
headers.push(['content-type', 'application/json']);
|
|
69
|
+
res = await sendRequest('GET', 'http://localhost:13333/test', headers);
|
|
70
|
+
|
|
71
|
+
process.exit(0);
|
|
72
|
+
})
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// must support req.headers
|
|
2
|
+
|
|
3
|
+
const net = require("net");
|
|
4
|
+
const express = require("express");
|
|
5
|
+
|
|
6
|
+
// this is needed to actually test multiple headers with the same name
|
|
7
|
+
// because fetch just combines them into one
|
|
8
|
+
async function sendRequest(method, url, arrayHeaders) {
|
|
9
|
+
// arrayHeaders is an array of [key, value] pairs
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const client = new net.Socket();
|
|
12
|
+
const [host, port] = url.split('://')[1].split('/')[0].split(':');
|
|
13
|
+
const path = '/' + url.split('/').slice(3).join('/');
|
|
14
|
+
|
|
15
|
+
client.connect(parseInt(port), host, () => {
|
|
16
|
+
let request = `${method} ${path} HTTP/1.1\r\n`;
|
|
17
|
+
request += `Host: ${host}:${port}\r\n`;
|
|
18
|
+
|
|
19
|
+
for (const [key, value] of arrayHeaders) {
|
|
20
|
+
request += `${key}: ${value}\r\n`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
request += '\r\n';
|
|
24
|
+
|
|
25
|
+
client.write(request);
|
|
26
|
+
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
client.destroy();
|
|
29
|
+
resolve();
|
|
30
|
+
}, 100);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const app = express();
|
|
36
|
+
app.get("/test", (req, res) => {
|
|
37
|
+
console.log(req.headers);
|
|
38
|
+
res.send("test");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
app.listen(13333, async () => {
|
|
42
|
+
console.log('Server is running on port 13333');
|
|
43
|
+
|
|
44
|
+
let res;
|
|
45
|
+
res = await fetch('http://localhost:13333/test');
|
|
46
|
+
console.log(await res.text());
|
|
47
|
+
|
|
48
|
+
res = await fetch('http://localhost:13333/test', {
|
|
49
|
+
headers: {
|
|
50
|
+
'X-Test': 'test'
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
console.log(await res.text());
|
|
54
|
+
|
|
55
|
+
res = await fetch('http://localhost:13333/test', {
|
|
56
|
+
headers: {
|
|
57
|
+
'Set-Cookie': 'test=test; HttpOnly; Secure; SameSite=Strict'
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
console.log(await res.text());
|
|
61
|
+
|
|
62
|
+
const headers = [];
|
|
63
|
+
headers.push(['X-Test', 'test']);
|
|
64
|
+
headers.push(['X-Test', 'test2']);
|
|
65
|
+
headers.push(['Cookie', 'test=test']);
|
|
66
|
+
headers.push(['Cookie', 'test2=test2']);
|
|
67
|
+
headers.push(['content-type', 'text/plain']);
|
|
68
|
+
headers.push(['content-type', 'application/json']);
|
|
69
|
+
res = await sendRequest('GET', 'http://localhost:13333/test', headers);
|
|
70
|
+
|
|
71
|
+
process.exit(0);
|
|
72
|
+
})
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// must support req.host
|
|
2
|
+
|
|
3
|
+
const net = require("net");
|
|
4
|
+
const express = require("express");
|
|
5
|
+
|
|
6
|
+
async function sendRequest(method, url, customHost) {
|
|
7
|
+
// arrayHeaders is an array of [key, value] pairs
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
const client = new net.Socket();
|
|
10
|
+
const [host, port] = url.split('://')[1].split('/')[0].split(':');
|
|
11
|
+
const path = '/' + url.split('/').slice(3).join('/');
|
|
12
|
+
|
|
13
|
+
client.connect(parseInt(port), host, () => {
|
|
14
|
+
let request = `${method} ${path} HTTP/1.1\r\n`;
|
|
15
|
+
request += `Host: ${customHost}\r\n`;
|
|
16
|
+
|
|
17
|
+
request += '\r\n';
|
|
18
|
+
|
|
19
|
+
client.write(request);
|
|
20
|
+
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
client.destroy();
|
|
23
|
+
resolve();
|
|
24
|
+
}, 100);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const app = express();
|
|
30
|
+
app.get("/test", (req, res) => {
|
|
31
|
+
console.log(req.host);
|
|
32
|
+
res.send("test");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
app.listen(13333, async () => {
|
|
36
|
+
console.log('Server is running on port 13333');
|
|
37
|
+
|
|
38
|
+
let res;
|
|
39
|
+
res = await fetch('http://localhost:13333/test');
|
|
40
|
+
console.log(await res.text());
|
|
41
|
+
|
|
42
|
+
res = await sendRequest('GET', 'http://localhost:13333/test', 'test:13333');
|
|
43
|
+
|
|
44
|
+
process.exit(0);
|
|
45
|
+
})
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// must support req.hostname
|
|
2
|
+
|
|
3
|
+
const net = require("net");
|
|
4
|
+
const express = require("express");
|
|
5
|
+
|
|
6
|
+
async function sendRequest(method, url, customHost) {
|
|
7
|
+
// arrayHeaders is an array of [key, value] pairs
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
const client = new net.Socket();
|
|
10
|
+
const [host, port] = url.split('://')[1].split('/')[0].split(':');
|
|
11
|
+
const path = '/' + url.split('/').slice(3).join('/');
|
|
12
|
+
|
|
13
|
+
client.connect(parseInt(port), host, () => {
|
|
14
|
+
let request = `${method} ${path} HTTP/1.1\r\n`;
|
|
15
|
+
request += `Host: ${customHost}\r\n`;
|
|
16
|
+
|
|
17
|
+
request += '\r\n';
|
|
18
|
+
|
|
19
|
+
client.write(request);
|
|
20
|
+
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
client.destroy();
|
|
23
|
+
resolve();
|
|
24
|
+
}, 100);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const app = express();
|
|
30
|
+
app.get("/test", (req, res) => {
|
|
31
|
+
console.log(req.hostname);
|
|
32
|
+
res.send("test");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
app.listen(13333, async () => {
|
|
36
|
+
console.log('Server is running on port 13333');
|
|
37
|
+
|
|
38
|
+
let res;
|
|
39
|
+
res = await fetch('http://localhost:13333/test');
|
|
40
|
+
console.log(await res.text());
|
|
41
|
+
|
|
42
|
+
res = await sendRequest('GET', 'http://localhost:13333/test', 'test:13333');
|
|
43
|
+
|
|
44
|
+
process.exit(0);
|
|
45
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// must support req.ip
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
|
|
7
|
+
app.get("/test", (req, res) => {
|
|
8
|
+
res.send(req.ip.replace('0000:0000:0000:0000:0000:0000:0000:000', "::"));
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
app.listen(13333, async () => {
|
|
12
|
+
console.log('Server is running on port 13333');
|
|
13
|
+
|
|
14
|
+
let res;
|
|
15
|
+
res = await fetch('http://localhost:13333/test');
|
|
16
|
+
console.log(await res.text());
|
|
17
|
+
|
|
18
|
+
process.exit(0);
|
|
19
|
+
})
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// must support req.is()
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
|
|
7
|
+
app.all('/test', (req, res) => {
|
|
8
|
+
console.log(req.is('html'));
|
|
9
|
+
console.log(req.is('json'));
|
|
10
|
+
console.log(req.is('text'));
|
|
11
|
+
console.log(req.is('*/*'));
|
|
12
|
+
console.log(req.is('application/json'));
|
|
13
|
+
console.log(req.is('application/*'));
|
|
14
|
+
console.log(req.is('text/html'));
|
|
15
|
+
res.send('test');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
app.listen(13333, async () => {
|
|
19
|
+
console.log('Server is running on port 13333');
|
|
20
|
+
|
|
21
|
+
await fetch('http://localhost:13333/test').then(res => res.text());
|
|
22
|
+
await fetch('http://localhost:13333/test', {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: {
|
|
25
|
+
'Content-Type': 'application/json'
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify({ test: 'test' })
|
|
28
|
+
}).then(res => res.text());
|
|
29
|
+
await fetch('http://localhost:13333/test', {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: {
|
|
32
|
+
'Content-Type': 'text/html'
|
|
33
|
+
},
|
|
34
|
+
body: '<html><body><h1>Hello, World!</h1></body></html>'
|
|
35
|
+
}).then(res => res.text());
|
|
36
|
+
await fetch('http://localhost:13333/test', {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'text/plain'
|
|
40
|
+
},
|
|
41
|
+
body: 'Hello, World!'
|
|
42
|
+
}).then(res => res.text());
|
|
43
|
+
process.exit(0);
|
|
44
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// must support req.originalUrl
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
const router = express.Router();
|
|
7
|
+
|
|
8
|
+
app.get("/test", (req, res) => {
|
|
9
|
+
res.send(req.originalUrl);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
router.get("/test", (req, res) => {
|
|
13
|
+
res.send(req.originalUrl);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
app.use("/router", router);
|
|
17
|
+
|
|
18
|
+
app.listen(13333, async () => {
|
|
19
|
+
console.log('Server is running on port 13333');
|
|
20
|
+
|
|
21
|
+
let res;
|
|
22
|
+
res = await fetch('http://localhost:13333/test#asdf');
|
|
23
|
+
console.log(await res.text());
|
|
24
|
+
|
|
25
|
+
res = await fetch('http://localhost:13333/router/test?test');
|
|
26
|
+
console.log(await res.text());
|
|
27
|
+
|
|
28
|
+
process.exit(0);
|
|
29
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// must support req.param()
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
|
|
7
|
+
app.all('/test', (req, res) => {
|
|
8
|
+
console.log(req.param('test'));
|
|
9
|
+
console.log(req.param('test', 'default'));
|
|
10
|
+
res.send('test');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
app.get('/test/:test', (req, res) => {
|
|
14
|
+
console.log(req.param('test'));
|
|
15
|
+
console.log(req.param('test', 'default'));
|
|
16
|
+
res.send('test');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
app.listen(13333, async () => {
|
|
20
|
+
console.log('Server is running on port 13333');
|
|
21
|
+
|
|
22
|
+
await fetch('http://localhost:13333/test').then(res => res.text());
|
|
23
|
+
await fetch('http://localhost:13333/test?test=test').then(res => res.text());
|
|
24
|
+
await fetch('http://localhost:13333/test?test=test&test2=test2').then(res => res.text());
|
|
25
|
+
await fetch('http://localhost:13333/test?asdf').then(res => res.text());
|
|
26
|
+
await fetch('http://localhost:13333/test/test').then(res => res.text());
|
|
27
|
+
await fetch('http://localhost:13333/test/test/test').then(res => res.text());
|
|
28
|
+
process.exit(0);
|
|
29
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// must support req.protocol and req.secure
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
|
|
7
|
+
app.get("/test", (req, res) => {
|
|
8
|
+
res.send(req.protocol + ' ' + req.secure);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
app.listen(13333, async () => {
|
|
12
|
+
console.log('Server is running on port 13333');
|
|
13
|
+
|
|
14
|
+
let res;
|
|
15
|
+
res = await fetch('http://localhost:13333/test');
|
|
16
|
+
console.log(await res.text());
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
process.exit(0);
|
|
20
|
+
})
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// must support req.query
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
|
|
7
|
+
app.get('/test', (req, res) => {
|
|
8
|
+
console.log(req.query);
|
|
9
|
+
res.send('test');
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
app.listen(13333, async () => {
|
|
13
|
+
console.log('Server is running on port 13333');
|
|
14
|
+
|
|
15
|
+
await fetch('http://localhost:13333/test').then(res => res.text());
|
|
16
|
+
await fetch('http://localhost:13333/test?test=1').then(res => res.text());
|
|
17
|
+
await fetch('http://localhost:13333/test?test=1&test=2').then(res => res.text());
|
|
18
|
+
await fetch('http://localhost:13333/test?test1=1&test2=2').then(res => res.text());
|
|
19
|
+
await fetch('http://localhost:13333/test?test=1&&asdf').then(res => res.text());
|
|
20
|
+
await fetch('http://localhost:13333/test?test').then(res => res.text());
|
|
21
|
+
|
|
22
|
+
process.exit(0);
|
|
23
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// must support req.range()
|
|
2
|
+
|
|
3
|
+
const express = require("express");
|
|
4
|
+
|
|
5
|
+
const app = express();
|
|
6
|
+
|
|
7
|
+
app.get('/test', (req, res) => {
|
|
8
|
+
console.log(req.range(10));
|
|
9
|
+
console.log(req.range(1000));
|
|
10
|
+
console.log(req.range(10000));
|
|
11
|
+
console.log(req.range(100, {
|
|
12
|
+
combine: true
|
|
13
|
+
}));
|
|
14
|
+
res.send('test');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
app.listen(13333, async () => {
|
|
18
|
+
console.log('Server is running on port 13333');
|
|
19
|
+
|
|
20
|
+
await fetch('http://localhost:13333/test').then(res => res.text());
|
|
21
|
+
await fetch('http://localhost:13333/test', {
|
|
22
|
+
headers: {
|
|
23
|
+
'Range': 'bytes=100-200'
|
|
24
|
+
}
|
|
25
|
+
}).then(res => res.text());
|
|
26
|
+
await fetch('http://localhost:13333/test', {
|
|
27
|
+
headers: {
|
|
28
|
+
'Range': 'bytes=100-200, 300-400'
|
|
29
|
+
}
|
|
30
|
+
}).then(res => res.text());
|
|
31
|
+
await fetch('http://localhost:13333/test', {
|
|
32
|
+
headers: {
|
|
33
|
+
'Range': 'bytes=100-200, 300-400, 500-600'
|
|
34
|
+
}
|
|
35
|
+
}).then(res => res.text());
|
|
36
|
+
await fetch('http://localhost:13333/test', {
|
|
37
|
+
headers: {
|
|
38
|
+
'Range': 'bytes=100-200, 300-400, 500-600, 100-800'
|
|
39
|
+
}
|
|
40
|
+
}).then(res => res.text());
|
|
41
|
+
await fetch('http://localhost:13333/test', {
|
|
42
|
+
headers: {
|
|
43
|
+
'Range': 'asdf'
|
|
44
|
+
}
|
|
45
|
+
}).then(res => res.text());
|
|
46
|
+
|
|
47
|
+
process.exit(0);
|
|
48
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// must support req.rawHeaders
|
|
2
|
+
|
|
3
|
+
const net = require("net");
|
|
4
|
+
const express = require("express");
|
|
5
|
+
|
|
6
|
+
// this is needed to actually test multiple headers with the same name
|
|
7
|
+
// because fetch just combines them into one
|
|
8
|
+
async function sendRequest(method, url, arrayHeaders) {
|
|
9
|
+
// arrayHeaders is an array of [key, value] pairs
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const client = new net.Socket();
|
|
12
|
+
const [host, port] = url.split('://')[1].split('/')[0].split(':');
|
|
13
|
+
const path = '/' + url.split('/').slice(3).join('/');
|
|
14
|
+
|
|
15
|
+
client.connect(parseInt(port), host, () => {
|
|
16
|
+
let request = `${method} ${path} HTTP/1.1\r\n`;
|
|
17
|
+
request += `Host: ${host}:${port}\r\n`;
|
|
18
|
+
|
|
19
|
+
for (const [key, value] of arrayHeaders) {
|
|
20
|
+
request += `${key}: ${value}\r\n`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
request += '\r\n';
|
|
24
|
+
|
|
25
|
+
client.write(request);
|
|
26
|
+
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
client.destroy();
|
|
29
|
+
resolve();
|
|
30
|
+
}, 100);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const app = express();
|
|
36
|
+
app.get("/test", (req, res) => {
|
|
37
|
+
console.log(req.rawHeaders.map(h => h.toLowerCase()));
|
|
38
|
+
res.send("test");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
app.listen(13333, async () => {
|
|
42
|
+
console.log('Server is running on port 13333');
|
|
43
|
+
|
|
44
|
+
let res;
|
|
45
|
+
res = await fetch('http://localhost:13333/test');
|
|
46
|
+
console.log(await res.text());
|
|
47
|
+
|
|
48
|
+
res = await fetch('http://localhost:13333/test', {
|
|
49
|
+
headers: {
|
|
50
|
+
'x-test': 'test'
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
console.log(await res.text());
|
|
54
|
+
|
|
55
|
+
res = await fetch('http://localhost:13333/test', {
|
|
56
|
+
headers: {
|
|
57
|
+
'set-cookie': 'test=test; HttpOnly; Secure; SameSite=Strict'
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
console.log(await res.text());
|
|
61
|
+
|
|
62
|
+
const headers = [];
|
|
63
|
+
headers.push(['x-test', 'test']);
|
|
64
|
+
headers.push(['x-test', 'test2']);
|
|
65
|
+
headers.push(['cookie', 'test=test']);
|
|
66
|
+
headers.push(['cookie', 'test2=test2']);
|
|
67
|
+
headers.push(['content-type', 'text/plain']);
|
|
68
|
+
headers.push(['content-type', 'application/json']);
|
|
69
|
+
res = await sendRequest('GET', 'http://localhost:13333/test', headers);
|
|
70
|
+
|
|
71
|
+
process.exit(0);
|
|
72
|
+
})
|