Skip to content

Commit 48d9546

Browse files
PeterRaoluozhang002
authored andcommitted
fix: put stream content empty when date is skew (#679)
1 parent 84cf170 commit 48d9546

File tree

4 files changed

+44
-8
lines changed

4 files changed

+44
-8
lines changed

lib/browser/client.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ proto.request = async function request(params) {
242242
}
243243
let result;
244244
let reqErr;
245+
const useStream = !!params.stream;
245246
try {
246247
result = await this.urllib.request(reqParams.url, reqParams.params);
247248
this.debug('response %s %s, got %s, headers: %j', params.method, reqParams.url, result.status, result.headers, 'info');
@@ -251,7 +252,8 @@ proto.request = async function request(params) {
251252
let err;
252253
if (result && params.successStatuses && params.successStatuses.indexOf(result.status) === -1) {
253254
err = await this.requestError(result);
254-
if (err.code === 'RequestTimeTooSkewed') {
255+
// not use stream
256+
if (err.code === 'RequestTimeTooSkewed' && !useStream) {
255257
this.options.amendTimeSkewed = +new Date(err.serverTime) - new Date();
256258
return await this.request(params);
257259
}

lib/browser/object.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,15 @@ proto.put = async function put(name, file, options) {
7474

7575
const stream = this._createStream(file, 0, file.size);
7676
options.contentLength = await this._getFileSize(file);
77-
const result = await this.putStream(name, stream, options);
78-
return result;
77+
try {
78+
const result = await this.putStream(name, stream, options);
79+
return result;
80+
} catch (err) {
81+
if (err.code === 'RequestTimeTooSkewed') {
82+
this.options.amendTimeSkewed = +new Date(err.serverTime) - new Date();
83+
return await this.put(name, file, options);
84+
}
85+
}
7986
} else {
8087
throw new TypeError('Must provide Buffer/Blob for put.');
8188
}

test/browser/browser.test.js

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,11 +1151,8 @@ describe('browser', () => {
11511151
});
11521152

11531153
describe('request time is skew', () => {
1154-
let store;
1155-
before(() => {
1156-
store = oss(ossConfig);
1157-
});
11581154
it('When the client\'s date is skew, the request will calibration time and retry', async () => {
1155+
const store = oss(ossConfig);
11591156
const name = `${prefix}put/skew_date`;
11601157
const body = new Buffer('body');
11611158
const requestSpy = sinon.spy(store, 'request');
@@ -1178,6 +1175,37 @@ describe('browser', () => {
11781175

11791176
const resultDel = await store.delete(name);
11801177
assert.equal(resultDel.res.status, 204);
1178+
1179+
timemachine.reset();
1180+
});
1181+
1182+
1183+
it('date is skew, put file will retry', async () => {
1184+
const store = oss(ossConfig);
1185+
const name = `${prefix}put/skew_date_file`;
1186+
const requestSpy = sinon.spy(store, 'request');
1187+
const requestErrorSpy = sinon.spy(store, 'requestError');
1188+
const fileContent = Array(1024 * 1024).fill('a').join('');
1189+
const file = new File([fileContent], 'skew_date_file');
1190+
1191+
timemachine.config({
1192+
dateString: 'December 25, 1991 13:12:59',
1193+
tick: true
1194+
});
1195+
const resultPut = await store.put(name, file);
1196+
assert.equal(resultPut.res.status, 200);
1197+
1198+
assert.equal(requestSpy.callCount, 2);
1199+
assert.equal(requestErrorSpy.callCount, 1);
1200+
1201+
const resultGet = await store.get(name);
1202+
assert.equal(resultGet.res.status, 200);
1203+
1204+
assert.equal(resultGet.content.toString(), fileContent);
1205+
1206+
const resultDel = await store.delete(name);
1207+
assert.equal(resultDel.res.status, 204);
1208+
11811209
timemachine.reset();
11821210
});
11831211
});

test/node/object.test.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,6 @@ describe('test/object.test.js', () => {
564564

565565
it('should return Etag and Content-Length', async () => {
566566
const info = await store.getObjectMeta(name);
567-
console.log(resHeaders, info);
568567
assert.equal(info.status, 200);
569568
assert.equal(info.res.headers.etag, resHeaders.etag);
570569
assert.equal(info.res.headers['content-length'], fileSize);

0 commit comments

Comments
 (0)