diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index eab67818c4..cb1666536f 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -169,7 +169,9 @@ void Agent::run() { } QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply *reply = networkAccessManager.get(QNetworkRequest(scriptURL)); + QNetworkRequest networkRequest = QNetworkRequest(scriptURL); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); QNetworkDiskCache* cache = new QNetworkDiskCache(); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 3686be0f00..7cfeed3331 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1713,6 +1713,7 @@ bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &u .arg(authorizationCode, oauthRedirectURL().toString(), _oauthClientID, _oauthClientSecret); QNetworkRequest tokenRequest(tokenRequestUrl); + tokenRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); tokenRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkReply* tokenReply = NetworkAccessManager::getInstance().post(tokenRequest, tokenPostBody.toLocal8Bit()); @@ -1902,7 +1903,9 @@ QNetworkReply* DomainServer::profileRequestGivenTokenReply(QNetworkReply* tokenR profileURL.setPath("/api/v1/user/profile"); profileURL.setQuery(QString("%1=%2").arg(OAUTH_JSON_ACCESS_TOKEN_KEY, accessToken)); - return NetworkAccessManager::getInstance().get(QNetworkRequest(profileURL)); + QNetworkRequest profileRequest(profileURL); + profileRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + return NetworkAccessManager::getInstance().get(profileRequest); } const QString DS_SETTINGS_SESSIONS_GROUP = "web-sessions"; diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 7817b9f520..9c506fdc11 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -83,12 +83,18 @@ if (APPLE) set(MACOSX_BUNDLE_BUNDLE_NAME Interface) set(MACOSX_BUNDLE_GUI_IDENTIFIER io.highfidelity.Interface) - + + if (${CMAKE_BUILD_TYPE} MATCHES "RELEASE") + set(ICON_FILENAME "interface.icns") + else () + set(ICON_FILENAME "interface-beta.icns") + endif () + # set how the icon shows up in the Info.plist file - SET(MACOSX_BUNDLE_ICON_FILE interface.icns) + SET(MACOSX_BUNDLE_ICON_FILE "${ICON_FILENAME}") # set where in the bundle to put the resources file - SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/interface.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/icon/${ICON_FILENAME} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) # grab the directories in resources and put them in the right spot in Resources file(GLOB RESOURCE_SUBDIRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/resources" "${CMAKE_CURRENT_SOURCE_DIR}/resources/*") @@ -101,7 +107,7 @@ if (APPLE) endif() endforeach() - SET(INTERFACE_SRCS ${INTERFACE_SRCS} "${CMAKE_CURRENT_SOURCE_DIR}/interface.icns") + SET(INTERFACE_SRCS ${INTERFACE_SRCS} "${CMAKE_CURRENT_SOURCE_DIR}/icon/${ICON_FILENAME}") endif() # create the executable, make it a bundle on OS X diff --git a/interface/icon/interface-beta.icns b/interface/icon/interface-beta.icns new file mode 100644 index 0000000000..af4f7cf499 Binary files /dev/null and b/interface/icon/interface-beta.icns differ diff --git a/interface/icon/interface-beta.ico b/interface/icon/interface-beta.ico new file mode 100644 index 0000000000..4d59dab12e Binary files /dev/null and b/interface/icon/interface-beta.ico differ diff --git a/interface/icon/interface.icns b/interface/icon/interface.icns new file mode 100644 index 0000000000..bc2eff31e5 Binary files /dev/null and b/interface/icon/interface.icns differ diff --git a/interface/icon/interface.ico b/interface/icon/interface.ico new file mode 100644 index 0000000000..4799dc7c0d Binary files /dev/null and b/interface/icon/interface.ico differ diff --git a/interface/interface.icns b/interface/interface.icns deleted file mode 100644 index 6e7a748d4d..0000000000 Binary files a/interface/interface.icns and /dev/null differ diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f182e14c80..8f31872437 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3785,6 +3785,7 @@ void Application::initAvatarAndViewFrustum() { void Application::checkVersion() { QNetworkRequest latestVersionRequest((QUrl(CHECK_VERSION_URL))); + latestVersionRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); latestVersionRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); QNetworkReply* reply = NetworkAccessManager::getInstance().get(latestVersionRequest); connect(reply, SIGNAL(finished()), SLOT(parseVersionXml())); diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index c7e6cccf51..a3e9a0a281 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -494,6 +494,7 @@ void ModelUploader::uploadFailed(QNetworkReply& errorReply) { void ModelUploader::checkS3() { qDebug() << "Checking S3 for " << _url; QNetworkRequest request(_url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = NetworkAccessManager::getInstance().head(request); connect(reply, SIGNAL(finished()), SLOT(processCheck())); } diff --git a/interface/src/ScriptsModel.cpp b/interface/src/ScriptsModel.cpp index cec42eef7d..99b4111f0c 100644 --- a/interface/src/ScriptsModel.cpp +++ b/interface/src/ScriptsModel.cpp @@ -166,6 +166,7 @@ void ScriptsModel::requestRemoteFiles(QString marker) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.get(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); } diff --git a/interface/src/ui/ModelsBrowser.cpp b/interface/src/ui/ModelsBrowser.cpp index 8c1d90d8b5..e22294876d 100644 --- a/interface/src/ui/ModelsBrowser.cpp +++ b/interface/src/ui/ModelsBrowser.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "ModelsBrowser.h" @@ -226,6 +227,7 @@ void ModelHandler::update() { QUrl url(_model.item(i,0)->data(Qt::UserRole).toString()); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.head(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); } @@ -277,6 +279,7 @@ void ModelHandler::queryNewFiles(QString marker) { url.setQuery(query); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.get(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 37afa35d5b..6d66e04bc6 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -153,7 +153,9 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); qDebug() << "Downloading included script at" << scriptPath; QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 47914e0a12..3053c3ee0a 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -11,6 +11,7 @@ #include "SnapshotShareDialog.h" #include "AccountManager.h" +#include "SharedUtil.h" #include #include @@ -112,6 +113,7 @@ void SnapshotShareDialog::uploadSnapshot() { QUrl url(FORUM_UPLOADS_URL); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = NetworkAccessManager::getInstance().post(request, multiPart); connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished); @@ -124,6 +126,7 @@ void SnapshotShareDialog::uploadSnapshot() { void SnapshotShareDialog::sendForumPost(QString snapshotPath) { // post to Discourse forum QNetworkRequest request; + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QUrl forumUrl(FORUM_POST_URL); QUrlQuery query; diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index 03decf046c..162ae6da77 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -196,7 +196,9 @@ void BillboardOverlay::setBillboardURL(const QString& url) { _billboard.clear(); _newTextureNeeded = true; - QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(actualURL)); + QNetworkRequest request(actualURL); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(request); connect(reply, &QNetworkReply::finished, this, &BillboardOverlay::replyFinished); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 21bbdefc80..c8f6ca18ec 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1021,6 +1021,7 @@ void AvatarData::setBillboardFromURL(const QString &billboardURL) { qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); QNetworkRequest billboardRequest; + billboardRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); billboardRequest.setUrl(QUrl(billboardURL)); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); @@ -1089,7 +1090,9 @@ void AvatarData::updateJointMappings() { if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* networkReply = networkAccessManager.get(QNetworkRequest(_skeletonModelURL)); + QNetworkRequest networkRequest = QNetworkRequest(_skeletonModelURL); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* networkReply = networkAccessManager.get(networkRequest); connect(networkReply, SIGNAL(finished()), this, SLOT(setJointMappingsFromNetworkReply())); } } diff --git a/libraries/avatars/src/Recording.cpp b/libraries/avatars/src/Recording.cpp index a258247f13..7fa8b79bda 100644 --- a/libraries/avatars/src/Recording.cpp +++ b/libraries/avatars/src/Recording.cpp @@ -370,7 +370,9 @@ RecordingPointer readRecordingFromFile(RecordingPointer recording, const QString // Download file if necessary qDebug() << "Downloading recording at" << url; QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); // wait for file diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index adb119cb9b..975d0f515d 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -135,7 +135,9 @@ QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorTe } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); qDebug() << "Downloading script at" << url; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 48b30868d0..ef6853c43a 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -148,7 +148,8 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } glm::quat rotation = getRotation(); - if (needsToCallUpdate() && _model->isActive()) { + bool movingOrAnimating = isMoving() || isAnimatingSomething(); + if ((movingOrAnimating || _needsInitialSimulation) && _model->isActive()) { _model->setScaleToFit(true, dimensions); _model->setSnapModelToRegistrationPoint(true, getRegistrationPoint()); _model->setRotation(rotation); @@ -168,7 +169,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("model->render"); // filter out if not needed to render if (args && (args->_renderMode == RenderArgs::SHADOW_RENDER_MODE)) { - if (isMoving() || isAnimatingSomething()) { + if (movingOrAnimating) { _model->renderInScene(alpha, args); } } else { diff --git a/libraries/entities/src/ModelEntityItem.cpp b/libraries/entities/src/ModelEntityItem.cpp index 2c3dcd0600..bfab8871a5 100644 --- a/libraries/entities/src/ModelEntityItem.cpp +++ b/libraries/entities/src/ModelEntityItem.cpp @@ -245,6 +245,21 @@ bool ModelEntityItem::needsToCallUpdate() const { return isAnimatingSomething() ? true : EntityItem::needsToCallUpdate(); } +void ModelEntityItem::computeShapeInfo(ShapeInfo& info) const { + // HACK: Default first first approximation is to boxify the entity... but only if it is small enough. + // The limit here is chosen to something that most avatars could not comfortably fit inside + // to prevent houses from getting boxified... we don't want the things inside houses to + // collide with a house as if it were a giant solid block. + const float MAX_SIZE_FOR_BOXIFICATION_HACK = 3.0f; + float diagonal = glm::length(getDimensionsInMeters()); + if (diagonal < MAX_SIZE_FOR_BOXIFICATION_HACK) { + glm::vec3 halfExtents = 0.5f * getDimensionsInMeters(); + info.setBox(halfExtents); + } else { + info.clear(); + } +} + void ModelEntityItem::update(const quint64& now) { // only advance the frame index if we're playing if (getAnimationIsPlaying()) { diff --git a/libraries/entities/src/ModelEntityItem.h b/libraries/entities/src/ModelEntityItem.h index a607745475..3db2a40db0 100644 --- a/libraries/entities/src/ModelEntityItem.h +++ b/libraries/entities/src/ModelEntityItem.h @@ -46,6 +46,7 @@ public: virtual void update(const quint64& now); virtual bool needsToCallUpdate() const; + void computeShapeInfo(ShapeInfo& info) const; virtual void debugDump() const; diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 7e52e76f27..ee741b8890 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -26,6 +26,7 @@ #include "NodeList.h" #include "PacketHeaders.h" #include "RSAKeypairGenerator.h" +#include "SharedUtil.h" #include "AccountManager.h" @@ -197,7 +198,8 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest; - + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QUrl requestURL = _authURL; if (path.startsWith("/")) { @@ -386,6 +388,7 @@ void AccountManager::requestAccessToken(const QString& login, const QString& pas QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request; + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QUrl grantURL = _authURL; grantURL.setPath("/oauth/token"); @@ -455,6 +458,7 @@ void AccountManager::requestProfile() { profileURL.setPath("/api/v1/user/profile"); QNetworkRequest profileRequest(profileURL); + profileRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); profileRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue()); QNetworkReply* profileReply = networkAccessManager.get(profileRequest); diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 67cf81a73a..fe50647c20 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -17,6 +17,7 @@ #include "HifiSockAddr.h" #include "NodeList.h" #include "PacketHeaders.h" +#include "SharedUtil.h" #include "UserActivityLogger.h" #include "DomainHandler.h" @@ -203,7 +204,9 @@ void DomainHandler::requestDomainSettings() { qDebug() << "Requesting domain-server settings at" << settingsJSONURL.toString(); - QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(settingsJSONURL)); + QNetworkRequest settingsRequest(settingsJSONURL); + settingsRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(settingsRequest); connect(reply, &QNetworkReply::finished, this, &DomainHandler::settingsRequestFinished); } } diff --git a/libraries/networking/src/OAuthNetworkAccessManager.cpp b/libraries/networking/src/OAuthNetworkAccessManager.cpp index 493398230a..1a52dc4ce7 100644 --- a/libraries/networking/src/OAuthNetworkAccessManager.cpp +++ b/libraries/networking/src/OAuthNetworkAccessManager.cpp @@ -14,6 +14,7 @@ #include #include "AccountManager.h" +#include "SharedUtil.h" #include "OAuthNetworkAccessManager.h" @@ -33,6 +34,7 @@ QNetworkReply* OAuthNetworkAccessManager::createRequest(QNetworkAccessManager::O if (accountManager.hasValidAccessToken()) { QNetworkRequest authenticatedRequest(req); + authenticatedRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); authenticatedRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, accountManager.getAccountInfo().getAccessToken().authorizationHeaderValue()); diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 5a95bd6028..9d61129d78 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -16,8 +16,9 @@ #include #include -#include "NetworkAccessManager.h" +#include +#include "NetworkAccessManager.h" #include "ResourceCache.h" #define clamp(x, min, max) (((x) < (min)) ? (min) :\ @@ -158,6 +159,7 @@ Resource::Resource(const QUrl& url, bool delayLoad) : init(); + _request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); _request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); // start loading immediately unless instructed otherwise diff --git a/libraries/script-engine/src/BatchLoader.cpp b/libraries/script-engine/src/BatchLoader.cpp index e2c345ce16..c455ca91ec 100644 --- a/libraries/script-engine/src/BatchLoader.cpp +++ b/libraries/script-engine/src/BatchLoader.cpp @@ -15,6 +15,7 @@ #include #include "BatchLoader.h" #include +#include BatchLoader::BatchLoader(const QList& urls) : QObject(), @@ -33,7 +34,9 @@ void BatchLoader::start() { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); for (QUrl url : _urls) { if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest request = QNetworkRequest(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(request); qDebug() << "Downloading file at" << url; diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index a002950d46..08b364b28d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -179,7 +179,9 @@ void ScriptEngine::loadURL(const QUrl& scriptURL) { } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); connect(reply, &QNetworkReply::finished, this, &ScriptEngine::handleScriptDownload); } } diff --git a/libraries/script-engine/src/XMLHttpRequestClass.cpp b/libraries/script-engine/src/XMLHttpRequestClass.cpp index 92c9c1856c..cd2e2f3732 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.cpp +++ b/libraries/script-engine/src/XMLHttpRequestClass.cpp @@ -107,6 +107,7 @@ void XMLHttpRequestClass::abort() { } void XMLHttpRequestClass::setRequestHeader(const QString& name, const QString& value) { + _request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); _request.setRawHeader(QByteArray(name.toLatin1()), QByteArray(value.toLatin1())); } diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 01dcd7ff02..f09ff9bd72 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -65,7 +65,10 @@ static const quint64 USECS_PER_MSEC = 1000; static const quint64 MSECS_PER_SECOND = 1000; static const quint64 USECS_PER_SECOND = USECS_PER_MSEC * MSECS_PER_SECOND; -const int BITS_IN_BYTE = 8; +const int BITS_IN_BYTE = 8; + +// Use a custom User-Agent to avoid ModSecurity filtering, e.g. by hosting providers. +const QByteArray HIGH_FIDELITY_USER_AGENT = "Mozilla/5.0 (HighFidelity)"; quint64 usecTimestampNow(bool wantDebug = false); void usecTimestampNowForceClockSkew(int clockSkew);