use new s3 url style

This commit is contained in:
AJ ONeal 2020-03-13 21:40:38 -06:00
parent 9a332a12d9
commit aee8c5f182
2 changed files with 88 additions and 23 deletions

51
bin/s3-download.js Normal file
View File

@ -0,0 +1,51 @@
'use strict';
require('dotenv').config();
var env = process.env;
var s3 = require('../index.js');
var accessKeyId = env.AWS_ACCESS_KEY;
var secretAccessKey = env.AWS_SECRET_ACCESS_KEY;
var region = env.AWS_REGION;
var bucket = env.AWS_BUCKET;
var prefix = env.AWS_BUCKET_PREFIX;
var key = process.argv[2];
var filepath = process.argv[3];
var fs = require('fs');
if (!key || !filepath) {
console.info('Usage: s3-download.js s3-key-name ./path/to/file.bin');
process.exit(1);
}
async function run() {
// GET STREAMED FILE
await s3
.get({
accessKeyId,
secretAccessKey,
region,
bucket,
prefix,
key
})
.then(function(resp) {
console.log(resp.url);
return fs.promises.writeFile(filepath, resp.body);
})
.catch(function(err) {
console.error('Error:');
console.error('GET Response:');
if (err.response) {
console.error(err.response.statusCode);
console.error(err.response.headers);
console.error(err.url);
} else {
console.error(err);
}
process.exit(1);
});
}
run();

View File

@ -7,6 +7,7 @@ var env = process.env;
module.exports = { module.exports = {
// HEAD // HEAD
head: function({ head: function({
host,
accessKeyId, accessKeyId,
secretAccessKey, secretAccessKey,
region, region,
@ -44,19 +45,20 @@ module.exports = {
} }
var signed = aws4.sign( var signed = aws4.sign(
{ {
// host: awsHost host: host || bucket + '.s3.amazonaws.com',
service: 's3', service: 's3',
region: region, region: region,
path: '/' + bucket + '/' + prefix + key, path: (host ? '/' + bucket : '') + '/' + prefix + key,
method: 'HEAD', method: 'HEAD',
signQuery: true signQuery: true
}, },
{ accessKeyId: accessKeyId, secretAccessKey: secretAccessKey } { accessKeyId: accessKeyId, secretAccessKey: secretAccessKey }
); );
var url = 'https://' + signed.hostname + signed.path; var url = 'https://' + signed.host + signed.path;
return request({ method: 'HEAD', url }).then(function(resp) { return request({ method: 'HEAD', url }).then(function(resp) {
if (200 === resp.statusCode) { if (200 === resp.statusCode) {
resp.url = url;
return resp; return resp;
} }
var err = new Error( var err = new Error(
@ -72,6 +74,7 @@ module.exports = {
// GET // GET
get: function({ get: function({
host,
accessKeyId, accessKeyId,
secretAccessKey, secretAccessKey,
region, region,
@ -86,40 +89,46 @@ module.exports = {
} }
var signed = aws4.sign( var signed = aws4.sign(
{ {
host: host || bucket + '.s3.amazonaws.com',
service: 's3', service: 's3',
region: region, region: region,
path: '/' + bucket + '/' + prefix + key, path: (host ? '/' + bucket : '') + '/' + prefix + key,
method: 'GET', method: 'GET',
signQuery: true signQuery: true
}, },
{ accessKeyId: accessKeyId, secretAccessKey: secretAccessKey } { accessKeyId: accessKeyId, secretAccessKey: secretAccessKey }
); );
var url = 'https://' + signed.hostname + signed.path; var url = 'https://' + signed.host + signed.path;
// stay binary by default // stay binary by default
var encoding = null; var encoding = null;
if (json) { if (json) {
encoding = undefined; encoding = undefined;
} }
return request({ method: 'GET', url, encoding: null, json: json }).then( return request({
function(resp) { method: 'GET',
if (200 === resp.statusCode) { url,
return resp; encoding: encoding,
} json: json
var err = new Error( }).then(function(resp) {
'expected status 200 but got ' + if (200 === resp.statusCode) {
resp.statusCode + resp.url = url;
'. See err.response for more info.' return resp;
);
err.url = url;
err.response = resp;
throw err;
} }
); var err = new Error(
'expected status 200 but got ' +
resp.statusCode +
'. See err.response for more info.'
);
err.url = url;
err.response = resp;
throw err;
});
}, },
// PUT // PUT
set: function({ set: function({
host,
accessKeyId, accessKeyId,
secretAccessKey, secretAccessKey,
region, region,
@ -135,15 +144,16 @@ module.exports = {
} }
var signed = aws4.sign( var signed = aws4.sign(
{ {
host: host || bucket + '.s3.amazonaws.com',
service: 's3', service: 's3',
region: region, region: region,
path: '/' + bucket + '/' + prefix + key, path: (host ? '/' + bucket : '') + '/' + prefix + key,
method: 'PUT', method: 'PUT',
signQuery: true signQuery: true
}, },
{ accessKeyId: accessKeyId, secretAccessKey: secretAccessKey } { accessKeyId: accessKeyId, secretAccessKey: secretAccessKey }
); );
var url = 'https://' + signed.hostname + signed.path; var url = 'https://' + signed.host + signed.path;
var headers = {}; var headers = {};
if ('undefined' !== typeof size) { if ('undefined' !== typeof size) {
headers['Content-Length'] = size; headers['Content-Length'] = size;
@ -153,6 +163,7 @@ module.exports = {
resp resp
) { ) {
if (200 === resp.statusCode) { if (200 === resp.statusCode) {
resp.url = url;
return resp; return resp;
} }
var err = new Error( var err = new Error(
@ -168,6 +179,7 @@ module.exports = {
// DELETE // DELETE
del: function({ del: function({
host,
accessKeyId, accessKeyId,
secretAccessKey, secretAccessKey,
region, region,
@ -181,18 +193,20 @@ module.exports = {
} }
var signed = aws4.sign( var signed = aws4.sign(
{ {
host: host || bucket + '.s3.amazonaws.com',
service: 's3', service: 's3',
region: region, region: region,
path: '/' + bucket + '/' + prefix + key, path: (host ? '/' + bucket : '') + '/' + prefix + key,
method: 'DELETE', method: 'DELETE',
signQuery: true signQuery: true
}, },
{ accessKeyId: accessKeyId, secretAccessKey: secretAccessKey } { accessKeyId: accessKeyId, secretAccessKey: secretAccessKey }
); );
var url = 'https://' + signed.hostname + signed.path; var url = 'https://' + signed.host + signed.path;
return request({ method: 'DELETE', url }).then(function(resp) { return request({ method: 'DELETE', url }).then(function(resp) {
if (204 === resp.statusCode) { if (204 === resp.statusCode) {
resp.url = url;
return resp; return resp;
} }
var err = new Error( var err = new Error(