s3-test-server 0.0.0-stage → 1.0.1
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/LICENSE +21 -0
- package/README.md +258 -2
- package/bin/s3-test-server.js +4 -0
- package/lib/checksums.js +176 -0
- package/lib/chunked.js +118 -0
- package/lib/cli.js +142 -0
- package/lib/controllers/bucket.js +624 -0
- package/lib/controllers/object.js +1216 -0
- package/lib/controllers/post.js +150 -0
- package/lib/controllers/service.js +19 -0
- package/lib/index.d.ts +193 -0
- package/lib/index.js +241 -0
- package/lib/middleware/cors.js +107 -0
- package/lib/middleware/error-handler.js +31 -0
- package/lib/middleware/vhost.js +61 -0
- package/lib/middleware/website.js +108 -0
- package/lib/models/error.js +79 -0
- package/lib/models/response.js +157 -0
- package/lib/routes.js +155 -0
- package/lib/signature/common.js +28 -0
- package/lib/signature/index.js +49 -0
- package/lib/signature/v2.js +129 -0
- package/lib/signature/v4.js +227 -0
- package/lib/stores/filesystem.js +391 -0
- package/lib/utils.js +115 -0
- package/lib/xml.js +162 -0
- package/package.json +46 -4
package/lib/cli.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const S3TestServer = require('./index');
|
|
6
|
+
|
|
7
|
+
const HELP = `Usage: s3-test-server [options]
|
|
8
|
+
|
|
9
|
+
A lightweight Amazon S3 emulator for development and testing.
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
-a, --address <host> Hostname or IP to bind to (default: localhost)
|
|
13
|
+
-p, --port <n> Port of the server (default: 4568)
|
|
14
|
+
-d, --directory <path> Data directory (default: a temporary directory)
|
|
15
|
+
--access-key-id <id> Access key clients must sign with (default: S3TEST)
|
|
16
|
+
--secret-access-key <key> Matching secret access key (default: S3TEST)
|
|
17
|
+
--region <region> Region reported by the server (default: us-east-1)
|
|
18
|
+
--key <path> Path to a private key file for HTTPS
|
|
19
|
+
--cert <path> Path to a certificate file for HTTPS
|
|
20
|
+
--service-endpoint <host> Root domain for virtual-host-style access
|
|
21
|
+
(default: amazonaws.com)
|
|
22
|
+
--no-vhost-buckets Disable virtual-host-style bucket addressing
|
|
23
|
+
--allow-mismatched-signatures Accept well-formed but incorrect signatures
|
|
24
|
+
--reset-on-start Clear the data directory when the server starts
|
|
25
|
+
--reset-on-close Delete all bucket data when the server closes
|
|
26
|
+
--configure-bucket <name[,config,...]>
|
|
27
|
+
Create a bucket at startup; optional paths to
|
|
28
|
+
CORS/website/tagging XML files (repeatable)
|
|
29
|
+
-s, --silent Suppress log output
|
|
30
|
+
-v, --version Print the version and exit
|
|
31
|
+
-h, --help Show this help
|
|
32
|
+
|
|
33
|
+
Example:
|
|
34
|
+
s3-test-server -d ./s3-data -p 9000 \\
|
|
35
|
+
--configure-bucket "website,./cors.xml,./website.xml"
|
|
36
|
+
`;
|
|
37
|
+
|
|
38
|
+
function parseArgs(argv) {
|
|
39
|
+
const options = { configureBuckets: [] };
|
|
40
|
+
for (let i = 0; i < argv.length; i++) {
|
|
41
|
+
const arg = argv[i];
|
|
42
|
+
const next = () => {
|
|
43
|
+
i += 1;
|
|
44
|
+
if (i >= argv.length) {
|
|
45
|
+
console.error(`Missing value for ${arg}`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
return argv[i];
|
|
49
|
+
};
|
|
50
|
+
switch (arg) {
|
|
51
|
+
case '-a':
|
|
52
|
+
case '--address':
|
|
53
|
+
options.address = next();
|
|
54
|
+
break;
|
|
55
|
+
case '-p':
|
|
56
|
+
case '--port':
|
|
57
|
+
options.port = parseInt(next(), 10);
|
|
58
|
+
break;
|
|
59
|
+
case '-d':
|
|
60
|
+
case '--directory':
|
|
61
|
+
options.directory = path.resolve(next());
|
|
62
|
+
break;
|
|
63
|
+
case '--access-key-id':
|
|
64
|
+
options.accessKeyId = next();
|
|
65
|
+
break;
|
|
66
|
+
case '--secret-access-key':
|
|
67
|
+
options.secretAccessKey = next();
|
|
68
|
+
break;
|
|
69
|
+
case '--region':
|
|
70
|
+
options.region = next();
|
|
71
|
+
break;
|
|
72
|
+
case '--key':
|
|
73
|
+
options.key = fs.readFileSync(next());
|
|
74
|
+
break;
|
|
75
|
+
case '--cert':
|
|
76
|
+
options.cert = fs.readFileSync(next());
|
|
77
|
+
break;
|
|
78
|
+
case '--service-endpoint':
|
|
79
|
+
options.serviceEndpoint = next();
|
|
80
|
+
break;
|
|
81
|
+
case '--no-vhost-buckets':
|
|
82
|
+
options.vhostBuckets = false;
|
|
83
|
+
break;
|
|
84
|
+
case '--allow-mismatched-signatures':
|
|
85
|
+
options.allowMismatchedSignatures = true;
|
|
86
|
+
break;
|
|
87
|
+
case '--reset-on-start':
|
|
88
|
+
options.resetOnStart = true;
|
|
89
|
+
break;
|
|
90
|
+
case '--reset-on-close':
|
|
91
|
+
options.resetOnClose = true;
|
|
92
|
+
break;
|
|
93
|
+
case '--configure-bucket': {
|
|
94
|
+
const [name, ...configPaths] = next().split(',');
|
|
95
|
+
options.configureBuckets.push({
|
|
96
|
+
name: name.trim(),
|
|
97
|
+
configs: configPaths.map((configPath) =>
|
|
98
|
+
fs.readFileSync(path.resolve(configPath.trim()))
|
|
99
|
+
),
|
|
100
|
+
});
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case '-s':
|
|
104
|
+
case '--silent':
|
|
105
|
+
options.silent = true;
|
|
106
|
+
break;
|
|
107
|
+
case '-v':
|
|
108
|
+
case '--version':
|
|
109
|
+
console.log(require('../package.json').version);
|
|
110
|
+
process.exit(0);
|
|
111
|
+
break;
|
|
112
|
+
case '-h':
|
|
113
|
+
case '--help':
|
|
114
|
+
console.log(HELP);
|
|
115
|
+
process.exit(0);
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
console.error(`Unknown option: ${arg}\n`);
|
|
119
|
+
console.error(HELP);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return options;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function main() {
|
|
127
|
+
const options = parseArgs(process.argv.slice(2));
|
|
128
|
+
const server = new S3TestServer(options);
|
|
129
|
+
const shutdown = () => {
|
|
130
|
+
server.close().finally(() => process.exit(0));
|
|
131
|
+
};
|
|
132
|
+
process.on('SIGINT', shutdown);
|
|
133
|
+
process.on('SIGTERM', shutdown);
|
|
134
|
+
try {
|
|
135
|
+
await server.run();
|
|
136
|
+
} catch (err) {
|
|
137
|
+
console.error(err.message);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
module.exports = { main };
|