forked from gmoon/s3proxy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexpress-s3proxy.js
More file actions
89 lines (75 loc) · 2.46 KB
/
express-s3proxy.js
File metadata and controls
89 lines (75 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* eslint-disable import/no-extraneous-dependencies, no-console, import/no-unresolved */
/*
S3Proxy Express Framework Example
Passes HTTP GET requests to s3proxy
Start: PORT=3000 node express
Test: mocha test.js
Author: George Moon <george.moon@gmail.com>
*/
const helmet = require('helmet');
const express = require('express');
const debug = require('debug')('s3proxy');
const bodyParser = require('body-parser');
const morgan = require('morgan');
const addRequestId = require('express-request-id')({ headerName: 'x-request-id' });
const S3Proxy = require('s3proxy');
const port = process.env.PORT;
const bucket = process.env.BUCKET;
const app = express();
app.set('view engine', 'pug');
app.use(addRequestId);
app.use(bodyParser.json());
app.use(helmet());
function handleError(req, res, err) {
// sending xml because the AWS SDK sets content-type: application/xml for non-200 responses
res.end(`<?xml version="1.0"?>\n<error time="${err.time}" code="${err.code}" statusCode="${err.statusCode}" url="${req.url}" method="${req.method}">${err.message}</error>
`);
}
// Use morgan for request logging except during test execution
if (process.env.NODE_ENV !== 'test') {
app.use(morgan(
'request :remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] '
+ '":referrer" ":user-agent" ":response-time ms" :res[x-request-id] :res[x-amz-request-id]',
));
}
// initialize the s3proxy
const proxy = new S3Proxy({ bucket, logger: console });
proxy.init();
proxy.on('error', (err) => {
console.log(`error initializing s3proxy for bucket ${bucket}: ${err.statusCode} ${err.code}`);
});
// basic health check
app.get('/health', (req, res) => {
res.writeHead(200);
res.end();
});
// health check s3
app.get('/health/s3', (req, res) => {
proxy.healthCheckStream(res).on('error', () => {
// just end the request and let the HTTP status code convey the error
res.end();
}).pipe(res);
});
// route all get requests to s3proxy
app.get('/', (req, res) => {
res.redirect('/index.html');
});
app.route('/*')
.head(async (req, res) => {
await proxy.head(req, res);
res.end();
})
.get((req, res) => {
proxy.get(req, res).on('error', (err) => {
handleError(req, res, err);
}).pipe(res);
});
proxy.on('init', () => {
if (port > 0) {
app.listen(port, () => {
debug(`listening on port ${port}`);
process.send('ready'); // for pm2-runtime wait_ready option
});
}
});
module.exports = app;