From 871bc2c3f6fe95d48bc5a6e39e26f5760e0e4904 Mon Sep 17 00:00:00 2001 From: Youcef Mammar Date: Thu, 23 Aug 2018 07:23:13 +0200 Subject: [PATCH] GSC Datastore: Add support for contentType property close #57 --- lib/stores/DataStore.js | 21 +++++++++++++++++++ lib/stores/GCSDataStore.js | 4 ++++ lib/stores/S3Store.js | 21 ------------------- test/Test-DataStore.js | 41 +++++++++++++++++++++++++++++++++----- 4 files changed, 61 insertions(+), 26 deletions(-) diff --git a/lib/stores/DataStore.js b/lib/stores/DataStore.js index 834c336c..7119f62a 100644 --- a/lib/stores/DataStore.js +++ b/lib/stores/DataStore.js @@ -107,6 +107,27 @@ class DataStore extends EventEmitter { return resolve({ size: 0, upload_length: 1 }); }); } + + /** + * Parses the Base64 encoded metadata received from the client. + * + * @param {String} metadata_string tus' standard upload metadata + * @return {Object} metadata as key-value pair + */ + _parseMetadataString(metadata_string) { + const kv_pair_list = metadata_string.split(','); + + return kv_pair_list.reduce((metadata, kv_pair) => { + const [key, base64_value] = kv_pair.split(' '); + + metadata[key] = { + encoded: base64_value, + decoded: Buffer.from(base64_value, 'base64').toString('ascii'), + }; + + return metadata; + }, {}); + } } module.exports = DataStore; diff --git a/lib/stores/GCSDataStore.js b/lib/stores/GCSDataStore.js index 7265d429..6008221b 100644 --- a/lib/stores/GCSDataStore.js +++ b/lib/stores/GCSDataStore.js @@ -92,7 +92,9 @@ class GCSDataStore extends DataStore { const file = new File(file_id, upload_length, upload_defer_length, upload_metadata); const gcs_file = this.bucket.file(file.id); + const parsedMetadata = this._parseMetadataString(upload_metadata); const options = { + contentType: parsedMetadata.type.decoded, metadata: { metadata: { upload_length: file.upload_length, @@ -131,9 +133,11 @@ class GCSDataStore extends DataStore { return new Promise((resolve, reject) => { const file = this.bucket.file(file_id); + const parsedMetadata = this._parseMetadataString(data.upload_metadata); const options = { offset, metadata: { + contentType: parsedMetadata.type.decoded, metadata: { upload_length: data.upload_length, tus_version: TUS_RESUMABLE, diff --git a/lib/stores/S3Store.js b/lib/stores/S3Store.js index e2c268c2..9dfc1668 100644 --- a/lib/stores/S3Store.js +++ b/lib/stores/S3Store.js @@ -233,27 +233,6 @@ class S3Store extends DataStore { }); } - /** - * Parses the Base64 encoded metadata received from the client. - * - * @param {String} metadata_string tus' standard upload metadata - * @return {Object} metadata as key-value pair - */ - _parseMetadataString(metadata_string) { - const kv_pair_list = metadata_string.split(','); - - return kv_pair_list.reduce((metadata, kv_pair) => { - const [key, base64_value] = kv_pair.split(' '); - - metadata[key] = { - encoded: base64_value, - decoded: Buffer.from(base64_value, 'base64').toString('ascii'), - }; - - return metadata; - }, {}); - } - /** * Uploads a part/chunk to S3 from a temporary part file. * diff --git a/test/Test-DataStore.js b/test/Test-DataStore.js index d139ffcf..a376faad 100644 --- a/test/Test-DataStore.js +++ b/test/Test-DataStore.js @@ -41,10 +41,16 @@ describe('DataStore', () => { done(); }); - it('must have a create method', (done) => { + it('must have a create method', () => { datastore.should.have.property('create'); - datastore.create(); - done(); + const req = { + headers: { + 'upload-length': 42, + 'upload-defer-length': 0, + 'upload-metadata': 'type YXBwbGljYXRpb24vcGRm,name bXktZmlsZS5wZGY=,filetype YXBwbGljYXRpb24vcGRm,filename bXktZmlsZS5wZGY=' + } + }; + return datastore.create(req); }); it('must have a write method', (done) => { @@ -53,9 +59,34 @@ describe('DataStore', () => { done(); }); - it('must have a getOffset method', (done) => { + it('must have a getOffset method', () => { datastore.should.have.property('getOffset'); - datastore.getOffset(); + const id = 42; + return datastore.getOffset(id); + }); + + it('must have a _parseMetadataString method', (done) => { + datastore.should.have.property('_parseMetadataString'); + const uploadMetadata = 'type YXBwbGljYXRpb24vcGRm,name bXktZmlsZS5wZGY=,filetype YXBwbGljYXRpb24vcGRm,filename bXktZmlsZS5wZGY=' + const parsed = datastore._parseMetadataString(uploadMetadata); + parsed.should.deepEqual({ + "filename": { + "decoded": "my-file.pdf", + "encoded": "bXktZmlsZS5wZGY=" + }, + "filetype": { + "decoded": "application/pdf", + "encoded": "YXBwbGljYXRpb24vcGRm" + }, + "name": { + "decoded": "my-file.pdf", + "encoded": "bXktZmlsZS5wZGY=" + }, + "type": { + "decoded": "application/pdf", + "encoded": "YXBwbGljYXRpb24vcGRm" + } + }) done(); }); });