Skip to content

Commit

Permalink
feat: putBucketWebsite support new parameter (#736)
Browse files Browse the repository at this point in the history
  • Loading branch information
weiyie committed Mar 24, 2020
1 parent 02d59da commit e1cb438
Show file tree
Hide file tree
Showing 10 changed files with 214 additions and 106 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,9 @@ parameters:
- config {Object} website config, contains blow properties:
- index {String} default page, e.g.: `index.html`
- [error] {String} error page, e.g.: 'error.html'
- [supportSubDir] {String} default vaule false
- [type] {String} default value 0
- [routingRules] {Array} RoutingRules
- [options] {Object} optional parameters
- [timeout] {Number} the operation timeout

Expand Down Expand Up @@ -672,6 +675,9 @@ Success will return:

- index {String} index page
- error {String} error page, maybe `null`
- supportSubDir {String}
- type {String}
- routingRules {Array}
- res {Object} response info, including
- status {Number} response status
- headers {Object} response headers
Expand Down
43 changes: 0 additions & 43 deletions lib/browser/bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,49 +159,6 @@ proto.deleteBucketLogging = async function deleteBucketLogging(name, options) {
};
};

// website

proto.putBucketWebsite = async function putBucketWebsite(name, config, options) {
// config: index, [error]
const params = this._bucketRequestParams('PUT', name, 'website', options);
config = config || {};
config.index = config.index || 'index.html';
let xml = `${'<?xml version="1.0" encoding="UTF-8"?>\n<WebsiteConfiguration>\n' +
' <IndexDocument><Suffix>'}${config.index}</Suffix></IndexDocument>\n`;
if (config.error) {
xml += `<ErrorDocument><Key>${config.error}</Key></ErrorDocument>\n`;
}
xml += '</WebsiteConfiguration>';
params.content = xml;
params.mime = 'xml';
params.successStatuses = [200];
const result = await this.request(params);
return {
res: result.res
};
};

proto.getBucketWebsite = async function getBucketWebsite(name, options) {
const params = this._bucketRequestParams('GET', name, 'website', options);
params.successStatuses = [200];
params.xmlResponse = true;
const result = await this.request(params);
return {
index: result.data.IndexDocument.Suffix,
error: (result.data.ErrorDocument && result.data.ErrorDocument.Key) || null,
res: result.res
};
};

proto.deleteBucketWebsite = async function deleteBucketWebsite(name, options) {
const params = this._bucketRequestParams('DELETE', name, 'website', options);
params.successStatuses = [204];
const result = await this.request(params);
return {
res: result.res
};
};

// lifecycle

proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) {
Expand Down
9 changes: 6 additions & 3 deletions lib/browser/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,12 @@ proto.debug = debug;
* Object operations
*/
merge(proto, require('./object'));
// /**
// * Bucket operations
// */
/**
* Bucket operations
*/
merge(proto, require('../common/bucket/getBucketWebsite'));
merge(proto, require('../common/bucket/putBucketWebsite'));
merge(proto, require('../common/bucket/deleteBucketWebsite'));

// merge(proto, require('./bucket'));

Expand Down
52 changes: 1 addition & 51 deletions lib/bucket.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@


const assert = require('assert');
const isArray = require('./common/utils/isArray');

const proto = exports;


function isArray(arr) {
if (Array.isArray) return Array.isArray(arr);
return Object.prototype.toString.call(arr) === '[object Array]';
}

function toArray(obj) {
if (!obj) return [];
if (isArray(obj)) return obj;
Expand Down Expand Up @@ -190,52 +186,6 @@ proto.deleteBucketLogging = async function deleteBucketLogging(name, options) {
};
};

// website

proto.putBucketWebsite = async function putBucketWebsite(name, config, options) {
this._checkBucketName(name);
// config: index, [error]
const params = this._bucketRequestParams('PUT', name, 'website', options);
config = config || {};
config.index = config.index || 'index.html';
let xml = `${'<?xml version="1.0" encoding="UTF-8"?>\n<WebsiteConfiguration>\n' +
' <IndexDocument><Suffix>'}${config.index}</Suffix></IndexDocument>\n`;
if (config.error) {
xml += `<ErrorDocument><Key>${config.error}</Key></ErrorDocument>\n`;
}
xml += '</WebsiteConfiguration>';
params.content = xml;
params.mime = 'xml';
params.successStatuses = [200];
const result = await this.request(params);
return {
res: result.res
};
};

proto.getBucketWebsite = async function getBucketWebsite(name, options) {
this._checkBucketName(name);
const params = this._bucketRequestParams('GET', name, 'website', options);
params.successStatuses = [200];
params.xmlResponse = true;
const result = await this.request(params);
return {
index: result.data.IndexDocument.Suffix,
error: (result.data.ErrorDocument && result.data.ErrorDocument.Key) || null,
res: result.res
};
};

proto.deleteBucketWebsite = async function deleteBucketWebsite(name, options) {
this._checkBucketName(name);
const params = this._bucketRequestParams('DELETE', name, 'website', options);
params.successStatuses = [204];
const result = await this.request(params);
return {
res: result.res
};
};

// lifecycle

proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) {
Expand Down
11 changes: 11 additions & 0 deletions lib/common/bucket/deleteBucketWebsite.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const proto = exports;

proto.deleteBucketWebsite = async function deleteBucketWebsite(name, options) {
this._checkBucketName(name);
const params = this._bucketRequestParams('DELETE', name, 'website', options);
params.successStatuses = [204];
const result = await this.request(params);
return {
res: result.res
};
};
27 changes: 27 additions & 0 deletions lib/common/bucket/getBucketWebsite.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const isObject = require('../utils/isObject');

const proto = exports;

proto.getBucketWebsite = async function getBucketWebsite(name, options) {
this._checkBucketName(name);
const params = this._bucketRequestParams('GET', name, 'website', options);
params.successStatuses = [200];
params.xmlResponse = true;
const result = await this.request(params);
let routingRules = [];
if (result.data.RoutingRules && result.data.RoutingRules.RoutingRule) {
if (isObject(result.data.RoutingRules.RoutingRule)) {
routingRules = [result.data.RoutingRules.RoutingRule];
} else {
routingRules = result.data.RoutingRules.RoutingRule;
}
}
return {
index: (result.data.IndexDocument && result.data.IndexDocument.Suffix) || '',
supportSubDir: (result.data.IndexDocument && result.data.IndexDocument.SupportSubDir) || 'false',
type: (result.data.IndexDocument && result.data.IndexDocument.Type),
routingRules,
error: (result.data.ErrorDocument && result.data.ErrorDocument.Key) || null,
res: result.res
};
};
3 changes: 3 additions & 0 deletions lib/common/bucket/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ merge(proto, require('./putBucketTags'));
merge(proto, require('./deleteBucketTags'));
merge(proto, require('./putBucket'));
merge(proto, require('./_checkBucketName'));
merge(proto, require('./getBucketWebsite'));
merge(proto, require('./putBucketWebsite'));
merge(proto, require('./deleteBucketWebsite'));
49 changes: 49 additions & 0 deletions lib/common/bucket/putBucketWebsite.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const obj2xml = require('../utils/obj2xml');
const isArray = require('../utils/isArray');

const proto = exports;
proto.putBucketWebsite = async function putBucketWebsite(name, config = {}, options) {
this._checkBucketName(name);
const params = this._bucketRequestParams('PUT', name, 'website', options);
const IndexDocument = {
Suffix: config.index || 'index.html'
};
const WebsiteConfiguration = {
IndexDocument
};
let website = {
WebsiteConfiguration
};

if (config.supportSubDir) {
IndexDocument.SupportSubDir = config.supportSubDir;
}

if (config.type) {
IndexDocument.Type = config.type;
}

if (config.error) {
WebsiteConfiguration.ErrorDocument = {
Key: config.error
};
}

if (config.routingRules !== undefined) {
if (!isArray(config.routingRules)) {
throw new Error('RoutingRules must be Array');
}
WebsiteConfiguration.RoutingRules = {
RoutingRule: config.routingRules
};
}

website = obj2xml(website);
params.content = website;
params.mime = 'xml';
params.successStatuses = [200];
const result = await this.request(params);
return {
res: result.res
};
};
3 changes: 3 additions & 0 deletions lib/common/utils/isArray.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
};
117 changes: 108 additions & 9 deletions test/node/bucket.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -251,17 +251,10 @@ describe('test/bucket.test.js', () => {
});

describe('putBucketWebsite(), getBucketWebsite(), deleteBucketWebsite()', () => {
it('should create, get and delete the website settings', async () => {
const result1 = await store.putBucketWebsite(bucket, {
it('should get and delete the website settings', async () => {
await store.putBucketWebsite(bucket, {
index: 'index.html'
});
assert.equal(result1.res.status, 200);
// put again will be fine
const result2 = await store.putBucketWebsite(bucket, {
index: 'index.htm',
error: 'error.htm'
});
assert.equal(result2.res.status, 200);

await utils.sleep(ms(metaSyncTime));

Expand All @@ -274,6 +267,112 @@ describe('test/bucket.test.js', () => {
const del = await store.deleteBucketWebsite(bucket);
assert.equal(del.res.status, 204);
});

it('should create when RoutingRules is Array or Object', async () => {
const routingRule1 = {
RuleNumber: '1',
Condition: {
KeyPrefixEquals: 'abc/',
HttpErrorCodeReturnedEquals: '404'
},
Redirect: {
RedirectType: 'Mirror',
MirrorUsingRole: 'false',
MirrorUserLastModified: 'false',
PassQueryString: 'true',
MirrorIsExpressTunnel: 'false',
MirrorPassOriginalSlashes: 'false',
MirrorAllowHeadObject: 'false',
MirrorURL: 'http://www.test.com/',
MirrorPassQueryString: 'true',
MirrorFollowRedirect: 'true',
MirrorCheckMd5: 'true',
MirrorHeaders: {
PassAll: 'true',
Pass: ['myheader-key1', 'myheader-key2'],
Remove: ['remove1', 'remove2'],
Set: {
Key: 'myheader-key5',
Value: 'myheader-value5'
}
}
}
};
const routingRules = [
{
RuleNumber: '2',
Condition: {
KeyPrefixEquals: 'a1bc/',
HttpErrorCodeReturnedEquals: '404'
},
Redirect: {
RedirectType: 'Mirror',
MirrorUsingRole: 'false',
MirrorUserLastModified: 'false',
MirrorAllowHeadObject: 'false',
MirrorIsExpressTunnel: 'false',
MirrorPassOriginalSlashes: 'false',
PassQueryString: 'true',
MirrorURL: 'http://www.test1.com/',
MirrorPassQueryString: 'true',
MirrorFollowRedirect: 'true',
MirrorCheckMd5: 'true',
MirrorHeaders: {
PassAll: 'true',
Pass: ['myheader-key12', 'myheader-key22'],
Remove: ['remove1', 'remove2'],
Set: {
Key: 'myheader-key5',
Value: 'myheader-value5'
}
}
}
}];
const website = {
index: 'index1.html',
supportSubDir: 'true',
type: '1',
error: 'error1.html',
routingRules
};

const result1 = await store.putBucketWebsite(bucket, website);
assert.strictEqual(result1.res.status, 200);
const rules1 = await store.getBucketWebsite(bucket);
assert.deepStrictEqual(rules1.routingRules, routingRules);
assert.strictEqual(rules1.supportSubDir, website.supportSubDir);
assert.strictEqual(rules1.type, website.type);

website.routingRules = [routingRule1];
const result2 = await store.putBucketWebsite(bucket, website);
assert.strictEqual(result2.res.status, 200);
const rules2 = await store.getBucketWebsite(bucket);
assert.deepStrictEqual(rules2.routingRules, website.routingRules);
});

it('should throw error when RoutingRules is not Array', async () => {
const website = {
index: 'index1.html',
supportSubDir: 'true',
type: '1',
error: 'error1.html',
routingRules: ''
};

try {
await store.putBucketWebsite(bucket, website);
assert(false);
} catch (error) {
assert.strictEqual(error.message, 'RoutingRules must be Array');
}
try {
website.RoutingRules = 0;
await store.putBucketWebsite(bucket, website);
assert(false);
} catch (error) {
assert.strictEqual(error.message, 'RoutingRules must be Array');
}
});
});

describe('putBucketLifecycle(), getBucketLifecycle(), deleteBucketLifecycle()', () => {
Expand Down

0 comments on commit e1cb438

Please sign in to comment.