+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
var app = angular.module('Workbench', ['Arvados']);
app.controller('UploadToCollection', UploadToCollection);
app.directive('arvUuid', arvUuid);
////////////////////////////////
var keepProxy;
+ var defaultErrorMessage = 'A network error occurred: either the server was unreachable, or there is a server configuration problem. Please check your browser debug console for a more specific error message (browser security features prevent us from showing the details here).';
function SliceReader(_slice) {
var that = this;
// resolve(locator) when the block is accepted by the
// proxy.
_deferred = $.Deferred();
- goSend();
+ if (proxyUriBase().match(/^http:/) &&
+ window.location.origin.match(/^https:/)) {
+ // In this case, requests will fail, and no ajax
+ // success/fail handlers will be called (!), which
+ // will leave our status saying "uploading" and the
+ // user waiting for something to happen. Better to
+ // give up now.
+ _deferred.reject({
+ textStatus: 'error',
+ err: 'There is a server configuration problem. Proxy ' + proxyUriBase() + ' cannot be used from origin ' + window.location.origin + ' due to the browser\'s mixed-content (https/http) policy.'
+ });
+ } else {
+ goSend();
+ }
return _deferred.promise();
}
function stop() {
}
function setProgress(bytesDone) {
var kBps;
- that.progress = Math.min(100, 100 * bytesDone / that.file.size)
+ if (that.file.size == 0)
+ that.progress = 100;
+ else
+ that.progress = Math.min(100, 100 * bytesDone / that.file.size);
if (bytesDone > _startByte) {
kBps = (bytesDone - _startByte) /
(Date.now() - _startTime);
return;
}
+ that.state = 'Failed';
that.stateReason = (
(reason.textStatus || 'Error') +
(reason.xhr && reason.xhr.options
? (' (from ' + reason.xhr.options.url + ')')
: '') +
': ' +
- (reason.err || ''));
+ (reason.err || defaultErrorMessage));
if (reason.xhr && reason.xhr.responseText)
that.stateReason += ' -- ' + reason.xhr.responseText;
_deferred.reject(reason);
then(function(collection) {
var manifestText = '';
$.each(uploads, function(_, upload) {
+ var locators = upload.locators;
+ if (locators.length === 0) {
+ // Every stream must have at least one
+ // data locator, even if it is zero bytes
+ // long:
+ locators = ['d41d8cd98f00b204e9800998ecf8427e+0'];
+ }
filename = ArvadosClient.uniqueNameForManifest(
collection.manifest_text,
'.', upload.file.name);
collection.manifest_text += '. ' +
- upload.locators.join(' ') +
+ locators.join(' ') +
' 0:' + upload.file.size.toString() + ':' +
filename +
'\n';
}
}).
then(_deferredAppend.resolve,
- _deferredAppend.reject).
+ _deferredAppend.reject);
+ return _deferredAppend.promise().
always(function() {
_deferredAppend = null;
});
- return _deferredAppend.promise();
}
}
}