Enable serverless domains via HTTP and HTTPS

This commit is contained in:
David Rowe 2020-02-01 12:46:28 +13:00
parent 486c7bde5b
commit 46173439ed
5 changed files with 44 additions and 25 deletions

View file

@ -4059,7 +4059,7 @@ void Application::setIsServerlessMode(bool serverlessDomain) {
}
}
std::map<QString, QString> Application::prepareServerlessDomainContents(QUrl domainURL) {
std::map<QString, QString> Application::prepareServerlessDomainContents(QUrl domainURL, QByteArray data) {
QUuid serverlessSessionID = QUuid::createUuid();
getMyAvatar()->setSessionUUID(serverlessSessionID);
auto nodeList = DependencyManager::get<NodeList>();
@ -4070,14 +4070,13 @@ std::map<QString, QString> Application::prepareServerlessDomainContents(QUrl dom
permissions.setAll(true);
nodeList->setPermissions(permissions);
// we can't import directly into the main tree because we would need to lock it, and
// Octree::readFromURL calls loop.exec which can run code which will also attempt to lock the tree.
// FIXME: Lock the main tree and import directly into it.
EntityTreePointer tmpTree(new EntityTree());
tmpTree->setIsServerlessMode(true);
tmpTree->createRootElement();
auto myAvatar = getMyAvatar();
tmpTree->setMyAvatar(myAvatar);
bool success = tmpTree->readFromURL(domainURL.toString());
bool success = tmpTree->readFromByteArray(domainURL.toString(), data);
if (success) {
tmpTree->reaverageOctreeElements();
tmpTree->sendEntities(&_entityEditSender, getEntities()->getTree(), 0, 0, 0);
@ -4100,12 +4099,26 @@ void Application::loadServerlessDomain(QUrl domainURL) {
return;
}
auto namedPaths = prepareServerlessDomainContents(domainURL);
auto nodeList = DependencyManager::get<NodeList>();
QString trimmedUrl = domainURL.toString().trimmed();
bool DEFAULT_IS_OBSERVABLE = true;
const qint64 DEFAULT_CALLER_ID = -1;
auto request = DependencyManager::get<ResourceManager>()->createResourceRequest(
this, trimmedUrl, DEFAULT_IS_OBSERVABLE, DEFAULT_CALLER_ID, "Application::loadServerlessDomain");
nodeList->getDomainHandler().connectedToServerless(namedPaths);
if (!request) {
return;
}
_fullSceneReceivedCounter++;
connect(request, &ResourceRequest::finished, this, [=]() {
if (request->getResult() == ResourceRequest::Success) {
auto namedPaths = prepareServerlessDomainContents(domainURL, request->getData());
auto nodeList = DependencyManager::get<NodeList>();
nodeList->getDomainHandler().connectedToServerless(namedPaths);
_fullSceneReceivedCounter++;
}
request->deleteLater();
});
request->send();
}
void Application::loadErrorDomain(QUrl domainURL) {
@ -4114,16 +4127,7 @@ void Application::loadErrorDomain(QUrl domainURL) {
return;
}
if (domainURL.isEmpty()) {
return;
}
auto namedPaths = prepareServerlessDomainContents(domainURL);
auto nodeList = DependencyManager::get<NodeList>();
nodeList->getDomainHandler().loadedErrorDomain(namedPaths);
_fullSceneReceivedCounter++;
loadServerlessDomain(domainURL);
}
bool Application::importImage(const QString& urlString) {

View file

@ -464,7 +464,7 @@ public slots:
void setPreferredCursor(const QString& cursor);
void setIsServerlessMode(bool serverlessDomain);
std::map<QString, QString> prepareServerlessDomainContents(QUrl domainURL);
std::map<QString, QString> prepareServerlessDomainContents(QUrl domainURL, QByteArray data);
void loadServerlessDomain(QUrl domainURL);
void loadErrorDomain(QUrl domainURL);

View file

@ -358,11 +358,8 @@ bool AddressManager::handleUrl(const QUrl& lookupUrlIn, LookupTrigger trigger) {
emit lookupResultsFinished();
return true;
} else if (lookupUrl.scheme() == HIFI_URL_SCHEME_FILE) {
// TODO -- once Octree::readFromURL no-longer takes over the main event-loop, serverless-domain urls can
// be loaded over http(s)
// lookupUrl.scheme() == URL_SCHEME_HTTP ||
// lookupUrl.scheme() == HIFI_URL_SCHEME_HTTPS ||
} else if (lookupUrl.scheme() == HIFI_URL_SCHEME_FILE || lookupUrl.scheme() == HIFI_URL_SCHEME_HTTPS
|| lookupUrl.scheme() == HIFI_URL_SCHEME_HTTP) {
// TODO once a file can return a connection refusal if there were to be some kind of load error, we'd
// need to store the previous domain tried in _lastVisitedURL. For now , do not store it.

View file

@ -738,7 +738,6 @@ bool Octree::readFromURL(
) {
QString trimmedUrl = urlString.trimmed();
QString marketplaceID = getMarketplaceID(trimmedUrl);
qDebug() << "!!!!! going to createResourceRequest " << callerId;
auto request = std::unique_ptr<ResourceRequest>(
DependencyManager::get<ResourceManager>()->createResourceRequest(
this, trimmedUrl, isObservable, callerId, "Octree::readFromURL"));
@ -770,6 +769,24 @@ bool Octree::readFromURL(
return readFromStream(data.size(), inputStream, marketplaceID);
}
bool Octree::readFromByteArray(
const QString& urlString,
const QByteArray& data
) {
QString trimmedUrl = urlString.trimmed();
QString marketplaceID = getMarketplaceID(trimmedUrl);
QByteArray uncompressedJsonData;
bool wasCompressed = gunzip(data, uncompressedJsonData);
if (wasCompressed) {
QDataStream inputStream(uncompressedJsonData);
return readFromStream(uncompressedJsonData.size(), inputStream, marketplaceID);
}
QDataStream inputStream(data);
return readFromStream(data.size(), inputStream, marketplaceID);
}
bool Octree::readFromStream(
uint64_t streamLength,

View file

@ -217,6 +217,7 @@ public:
// Octree importers
bool readFromFile(const char* filename);
bool readFromURL(const QString& url, const bool isObservable = true, const qint64 callerId = -1); // will support file urls as well...
bool readFromByteArray(const QString& url, const QByteArray& byteArray);
bool readFromStream(uint64_t streamLength, QDataStream& inputStream, const QString& marketplaceID="");
bool readSVOFromStream(uint64_t streamLength, QDataStream& inputStream);
bool readJSONFromStream(uint64_t streamLength, QDataStream& inputStream, const QString& marketplaceID="");