mirror of https://gitee.com/bigwinds/arangodb
renamed RestServerFeature to GeneralServerFeature
This commit is contained in:
parent
c370e9e6fe
commit
a92add0a9f
|
@ -184,18 +184,19 @@ add_executable(${BIN_ARANGOD}
|
|||
FulltextIndex/fulltext-list.cpp
|
||||
FulltextIndex/fulltext-query.cpp
|
||||
FulltextIndex/fulltext-result.cpp
|
||||
GeoIndex/GeoIndex.cpp
|
||||
GeneralServer/AsyncJobManager.cpp
|
||||
GeneralServer/HttpCommTask.cpp
|
||||
GeneralServer/HttpServerJob.cpp
|
||||
GeneralServer/GeneralCommTask.cpp
|
||||
GeneralServer/HttpCommTask.cpp
|
||||
GeneralServer/HttpsCommTask.cpp
|
||||
GeneralServer/GeneralListenTask.cpp
|
||||
GeneralServer/GeneralServer.cpp
|
||||
GeneralServer/GeneralServerFeature.cpp
|
||||
GeneralServer/HttpCommTask.cpp
|
||||
GeneralServer/HttpCommTask.cpp
|
||||
GeneralServer/HttpServerJob.cpp
|
||||
GeneralServer/HttpsCommTask.cpp
|
||||
GeneralServer/PathHandler.cpp
|
||||
GeneralServer/RestHandler.cpp
|
||||
GeneralServer/RestHandlerFactory.cpp
|
||||
GeneralServer/PathHandler.cpp
|
||||
GeoIndex/GeoIndex.cpp
|
||||
Indexes/EdgeIndex.cpp
|
||||
Indexes/FulltextIndex.cpp
|
||||
Indexes/GeoIndex2.cpp
|
||||
|
@ -245,7 +246,6 @@ add_executable(${BIN_ARANGOD}
|
|||
RestServer/FrontendFeature.cpp
|
||||
RestServer/InitDatabaseFeature.cpp
|
||||
RestServer/QueryRegistryFeature.cpp
|
||||
RestServer/RestServerFeature.cpp
|
||||
RestServer/ScriptFeature.cpp
|
||||
RestServer/ServerFeature.cpp
|
||||
RestServer/UnitTestsFeature.cpp
|
||||
|
|
|
@ -35,30 +35,31 @@
|
|||
#include "Basics/json.h"
|
||||
#include "Cluster/ServerState.h"
|
||||
#include "Endpoint/Endpoint.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "Random/RandomGenerator.h"
|
||||
#include "Rest/HttpRequest.h"
|
||||
#include "Rest/HttpResponse.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "SimpleHttpClient/GeneralClientConnection.h"
|
||||
#include "SimpleHttpClient/SimpleHttpClient.h"
|
||||
#include "SimpleHttpClient/SimpleHttpResult.h"
|
||||
|
||||
|
||||
using namespace arangodb;
|
||||
using namespace arangodb::application_features;
|
||||
using namespace basics::StringUtils;
|
||||
|
||||
static void addEmptyVPackObject(std::string const& name, VPackBuilder& builder) {
|
||||
static void addEmptyVPackObject(std::string const& name,
|
||||
VPackBuilder& builder) {
|
||||
builder.add(VPackValue(name));
|
||||
VPackObjectBuilder c(&builder);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief constructs an operation
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AgencyOperation::AgencyOperation(std::string const& key, AgencySimpleOperationType opType)
|
||||
AgencyOperation::AgencyOperation(std::string const& key,
|
||||
AgencySimpleOperationType opType)
|
||||
: _key(AgencyComm::prefixPath() + key), _opType() {
|
||||
_opType.type = AgencyOperationType::SIMPLE;
|
||||
_opType.simple = opType;
|
||||
|
@ -68,13 +69,14 @@ AgencyOperation::AgencyOperation(std::string const& key, AgencySimpleOperationTy
|
|||
/// @brief constructs an operation
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AgencyOperation::AgencyOperation(std::string const& key, AgencyValueOperationType opType,
|
||||
VPackSlice value)
|
||||
AgencyOperation::AgencyOperation(std::string const& key,
|
||||
AgencyValueOperationType opType,
|
||||
VPackSlice value)
|
||||
: _key(AgencyComm::prefixPath() + key), _opType(), _value(value) {
|
||||
_opType.type = AgencyOperationType::VALUE;
|
||||
_opType.value = opType;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief adds the operation formatted as an attribute in a vpack object
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -85,8 +87,8 @@ void AgencyOperation::toVelocyPack(VPackBuilder& builder) const {
|
|||
VPackObjectBuilder valueOperation(&builder);
|
||||
builder.add("op", VPackValue(_opType.toString()));
|
||||
if (_opType.type == AgencyOperationType::VALUE) {
|
||||
if (_opType.value == AgencyValueOperationType::OBSERVE
|
||||
|| _opType.value == AgencyValueOperationType::UNOBSERVE) {
|
||||
if (_opType.value == AgencyValueOperationType::OBSERVE ||
|
||||
_opType.value == AgencyValueOperationType::UNOBSERVE) {
|
||||
builder.add("url", _value);
|
||||
} else {
|
||||
builder.add("new", _value);
|
||||
|
@ -103,8 +105,7 @@ void AgencyOperation::toVelocyPack(VPackBuilder& builder) const {
|
|||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AgencyPrecondition::AgencyPrecondition(std::string const& key, Type t, bool e)
|
||||
: key(AgencyComm::prefixPath() + key), type(t), empty(e) {
|
||||
}
|
||||
: key(AgencyComm::prefixPath() + key), type(t), empty(e) {}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief constructs a precondition
|
||||
|
@ -112,8 +113,7 @@ AgencyPrecondition::AgencyPrecondition(std::string const& key, Type t, bool e)
|
|||
|
||||
AgencyPrecondition::AgencyPrecondition(std::string const& key, Type t,
|
||||
VPackSlice s)
|
||||
: key(AgencyComm::prefixPath() + key), type(t), empty(false), value(s) {
|
||||
}
|
||||
: key(AgencyComm::prefixPath() + key), type(t), empty(false), value(s) {}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief adds the precondition formatted as an attribute in a vpack obj
|
||||
|
@ -124,7 +124,7 @@ void AgencyPrecondition::toVelocyPack(VPackBuilder& builder) const {
|
|||
builder.add(VPackValue(key));
|
||||
{
|
||||
VPackObjectBuilder preconditionDefinition(&builder);
|
||||
switch(type) {
|
||||
switch (type) {
|
||||
case AgencyPrecondition::EMPTY:
|
||||
builder.add("oldEmpty", VPackValue(empty));
|
||||
break;
|
||||
|
@ -157,13 +157,13 @@ void AgencyWriteTransaction::toVelocyPack(VPackBuilder& builder) const {
|
|||
VPackArrayBuilder guard(&builder);
|
||||
{
|
||||
VPackObjectBuilder guard2(&builder);
|
||||
for (AgencyOperation const& operation: operations) {
|
||||
for (AgencyOperation const& operation : operations) {
|
||||
operation.toVelocyPack(builder);
|
||||
}
|
||||
}
|
||||
if (preconditions.size() > 0) {
|
||||
VPackObjectBuilder guard3(&builder);
|
||||
for (AgencyPrecondition const& precondition: preconditions) {
|
||||
for (AgencyPrecondition const& precondition : preconditions) {
|
||||
precondition.toVelocyPack(builder);
|
||||
}
|
||||
}
|
||||
|
@ -185,7 +185,7 @@ std::string AgencyReadTransaction::toJson() const {
|
|||
|
||||
void AgencyReadTransaction::toVelocyPack(VPackBuilder& builder) const {
|
||||
VPackArrayBuilder guard2(&builder);
|
||||
for (std::string const& key: keys) {
|
||||
for (std::string const& key : keys) {
|
||||
builder.add(VPackValue(key));
|
||||
}
|
||||
}
|
||||
|
@ -287,8 +287,8 @@ std::string AgencyCommResult::errorMessage() const {
|
|||
return arangodb::basics::VelocyPackHelper::getStringValue(body, "message",
|
||||
"");
|
||||
} catch (VPackException const& e) {
|
||||
std::string message("VPackException parsing body ("+ _body + "): "
|
||||
+ e.what());
|
||||
std::string message("VPackException parsing body (" + _body + "): " +
|
||||
e.what());
|
||||
return std::string(message);
|
||||
}
|
||||
}
|
||||
|
@ -326,9 +326,7 @@ void AgencyCommResult::clear() {
|
|||
/// get results of query as slice
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
VPackSlice AgencyCommResult::slice() {
|
||||
return _vpack->slice();
|
||||
}
|
||||
VPackSlice AgencyCommResult::slice() { return _vpack->slice(); }
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief the static global URL prefix
|
||||
|
@ -415,7 +413,7 @@ bool AgencyComm::tryConnect() {
|
|||
|
||||
// mop: not sure if a timeout makes sense here
|
||||
while (true) {
|
||||
LOG_TOPIC(DEBUG, Logger::AGENCYCOMM)
|
||||
LOG_TOPIC(DEBUG, Logger::AGENCYCOMM)
|
||||
<< "Trying to find an active agency. Checking " << endpointsStr;
|
||||
std::list<AgencyEndpoint*>::iterator it = _globalEndpoints.begin();
|
||||
|
||||
|
@ -463,7 +461,7 @@ bool AgencyComm::initialize() {
|
|||
/// @brief will try to initialize a new agency
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool AgencyComm::tryInitializeStructure(std::string const& jwtSecret) {
|
||||
bool AgencyComm::tryInitializeStructure(std::string const& jwtSecret) {
|
||||
VPackBuilder builder;
|
||||
try {
|
||||
VPackObjectBuilder b(&builder);
|
||||
|
@ -544,9 +542,7 @@ bool AgencyComm::tryInitializeStructure(std::string const& jwtSecret) {
|
|||
builder.add("NumberOfCoordinators", VPackSlice::nullSlice());
|
||||
builder.add("NumberOfDBServers", VPackSlice::nullSlice());
|
||||
builder.add(VPackValue("CleanedServers"));
|
||||
{
|
||||
VPackArrayBuilder dd(&builder);
|
||||
}
|
||||
{ VPackArrayBuilder dd(&builder); }
|
||||
builder.add("Lock", VPackValue("UNLOCKED"));
|
||||
addEmptyVPackObject("MapLocalToID", builder);
|
||||
addEmptyVPackObject("Failed", builder);
|
||||
|
@ -565,7 +561,8 @@ bool AgencyComm::tryInitializeStructure(std::string const& jwtSecret) {
|
|||
builder.add("InitDone", VPackValue(true));
|
||||
builder.add("Secret", VPackValue(encodeHex(jwtSecret)));
|
||||
} catch (std::exception const& e) {
|
||||
LOG_TOPIC(ERR, Logger::STARTUP) << "Couldn't create initializing structure " << e.what();
|
||||
LOG_TOPIC(ERR, Logger::STARTUP) << "Couldn't create initializing structure "
|
||||
<< e.what();
|
||||
return false;
|
||||
} catch (...) {
|
||||
LOG_TOPIC(ERR, Logger::STARTUP) << "Couldn't create initializing structure";
|
||||
|
@ -573,16 +570,17 @@ bool AgencyComm::tryInitializeStructure(std::string const& jwtSecret) {
|
|||
}
|
||||
|
||||
try {
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP)
|
||||
<< "Initializing agency with " << builder.toJson();
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP) << "Initializing agency with "
|
||||
<< builder.toJson();
|
||||
|
||||
AgencyOperation initOperation("", AgencyValueOperationType::SET, builder.slice());
|
||||
AgencyOperation initOperation("", AgencyValueOperationType::SET,
|
||||
builder.slice());
|
||||
|
||||
AgencyWriteTransaction initTransaction;
|
||||
initTransaction.operations.push_back(initOperation);
|
||||
|
||||
|
||||
auto result = sendTransactionWithFailover(initTransaction);
|
||||
|
||||
|
||||
return result.successful();
|
||||
} catch (std::exception const& e) {
|
||||
LOG(FATAL) << "Fatal error initializing agency " << e.what();
|
||||
|
@ -604,14 +602,14 @@ bool AgencyComm::shouldInitializeStructure() {
|
|||
double timeout = _globalConnectionOptions._requestTimeout;
|
||||
// "InitDone" key should not previously exist
|
||||
auto result = casValue("InitDone", builder.slice(), false, 60.0, timeout);
|
||||
|
||||
|
||||
if (!result.successful()) {
|
||||
// somebody else has or is initializing the agency
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP)
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP)
|
||||
<< "someone else is initializing the agency";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -621,48 +619,49 @@ bool AgencyComm::shouldInitializeStructure() {
|
|||
|
||||
bool AgencyComm::ensureStructureInitialized() {
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP) << "Checking if agency is initialized";
|
||||
|
||||
RestServerFeature* restServer =
|
||||
application_features::ApplicationServer::getFeature<RestServerFeature>("RestServer");
|
||||
|
||||
GeneralServerFeature* restServer =
|
||||
application_features::ApplicationServer::getFeature<GeneralServerFeature>(
|
||||
"GeneralServer");
|
||||
|
||||
while (true) {
|
||||
while (shouldInitializeStructure()) {
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP)
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP)
|
||||
<< "Agency is fresh. Needs initial structure.";
|
||||
// mop: we initialized it .. great success
|
||||
if (tryInitializeStructure(restServer->jwtSecret())) {
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP) << "Successfully initialized agency";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_TOPIC(WARN, Logger::STARTUP)
|
||||
LOG_TOPIC(WARN, Logger::STARTUP)
|
||||
<< "Initializing agency failed. We'll try again soon";
|
||||
// We should really have exclusive access, here, this is strange!
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
|
||||
AgencyCommResult result = getValues("InitDone");
|
||||
|
||||
|
||||
if (result.successful()) {
|
||||
VPackSlice value = result.slice()[0].get(std::vector<std::string>(
|
||||
{prefix(), "InitDone"}));
|
||||
VPackSlice value = result.slice()[0].get(
|
||||
std::vector<std::string>({prefix(), "InitDone"}));
|
||||
if (value.isBoolean() && value.getBoolean()) {
|
||||
// expecting a value of "true"
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP) << "Found an initialized agency";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP)
|
||||
|
||||
LOG_TOPIC(TRACE, Logger::STARTUP)
|
||||
<< "Waiting for agency to get initialized";
|
||||
|
||||
sleep(1);
|
||||
} // next attempt
|
||||
|
||||
} // next attempt
|
||||
|
||||
AgencyCommResult secretResult = getValues("Secret");
|
||||
VPackSlice secretValue = secretResult.slice()[0].get(std::vector<std::string>(
|
||||
{prefix(), "Secret"}));
|
||||
|
||||
VPackSlice secretValue = secretResult.slice()[0].get(
|
||||
std::vector<std::string>({prefix(), "Secret"}));
|
||||
|
||||
if (!secretValue.isString()) {
|
||||
LOG(ERR) << "Couldn't find secret in agency!";
|
||||
return false;
|
||||
|
@ -701,8 +700,8 @@ void AgencyComm::disconnect() {
|
|||
|
||||
bool AgencyComm::addEndpoint(std::string const& endpointSpecification,
|
||||
bool toFront) {
|
||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM)
|
||||
<< "adding global agency-endpoint '" << endpointSpecification << "'";
|
||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM) << "adding global agency-endpoint '"
|
||||
<< endpointSpecification << "'";
|
||||
|
||||
{
|
||||
WRITE_LOCKER(writeLocker, AgencyComm::_globalLock);
|
||||
|
@ -757,7 +756,7 @@ bool AgencyComm::hasEndpoint(std::string const& endpointSpecification) {
|
|||
|
||||
while (it != _globalEndpoints.end()) {
|
||||
AgencyEndpoint const* agencyEndpoint = (*it);
|
||||
|
||||
|
||||
if (agencyEndpoint->_endpoint->specification() == endpointSpecification) {
|
||||
return true;
|
||||
}
|
||||
|
@ -871,7 +870,6 @@ std::string AgencyComm::getEndpointsString() {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool AgencyComm::setPrefix(std::string const&) {
|
||||
|
||||
// agency prefix must not be changed
|
||||
_globalPrefix = "/arango/";
|
||||
_globalPrefixStripped = "arango";
|
||||
|
@ -963,10 +961,9 @@ AgencyCommResult AgencyComm::sendServerState(double ttl) {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::string AgencyComm::getVersion() {
|
||||
AgencyCommResult result
|
||||
= sendWithFailover(arangodb::GeneralRequest::RequestType::GET,
|
||||
_globalConnectionOptions._requestTimeout, "version",
|
||||
"", false);
|
||||
AgencyCommResult result = sendWithFailover(
|
||||
arangodb::GeneralRequest::RequestType::GET,
|
||||
_globalConnectionOptions._requestTimeout, "version", "", false);
|
||||
|
||||
if (result.successful()) {
|
||||
return result._body;
|
||||
|
@ -981,11 +978,10 @@ std::string AgencyComm::getVersion() {
|
|||
|
||||
AgencyCommResult AgencyComm::createDirectory(std::string const& key) {
|
||||
VPackBuilder builder;
|
||||
{
|
||||
VPackObjectBuilder dir(&builder);
|
||||
}
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET, builder.slice());
|
||||
{ VPackObjectBuilder dir(&builder); }
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET,
|
||||
builder.slice());
|
||||
AgencyWriteTransaction transaction(operation);
|
||||
|
||||
return sendTransactionWithFailover(transaction);
|
||||
|
@ -996,12 +992,12 @@ AgencyCommResult AgencyComm::createDirectory(std::string const& key) {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AgencyCommResult AgencyComm::setValue(std::string const& key,
|
||||
std::string const& value,
|
||||
double ttl) {
|
||||
std::string const& value, double ttl) {
|
||||
VPackBuilder builder;
|
||||
builder.add(VPackValue(value));
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET, builder.slice());
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET,
|
||||
builder.slice());
|
||||
operation._ttl = static_cast<uint32_t>(ttl);
|
||||
AgencyWriteTransaction transaction(operation);
|
||||
|
||||
|
@ -1015,7 +1011,6 @@ AgencyCommResult AgencyComm::setValue(std::string const& key,
|
|||
AgencyCommResult AgencyComm::setValue(std::string const& key,
|
||||
arangodb::velocypack::Slice const& slice,
|
||||
double ttl) {
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET, slice);
|
||||
operation._ttl = static_cast<uint32_t>(ttl);
|
||||
AgencyWriteTransaction transaction(operation);
|
||||
|
@ -1046,10 +1041,8 @@ bool AgencyComm::exists(std::string const& key) {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AgencyCommResult AgencyComm::increment(std::string const& key) {
|
||||
|
||||
AgencyWriteTransaction transaction(
|
||||
AgencyOperation(key, AgencySimpleOperationType::INCREMENT_OP)
|
||||
);
|
||||
AgencyOperation(key, AgencySimpleOperationType::INCREMENT_OP));
|
||||
|
||||
return sendTransactionWithFailover(transaction);
|
||||
}
|
||||
|
@ -1060,7 +1053,7 @@ AgencyCommResult AgencyComm::increment(std::string const& key) {
|
|||
|
||||
AgencyCommResult AgencyComm::getValues(std::string const& key) {
|
||||
std::string url(buildUrl());
|
||||
|
||||
|
||||
url += "/read";
|
||||
VPackBuilder builder;
|
||||
{
|
||||
|
@ -1071,17 +1064,15 @@ AgencyCommResult AgencyComm::getValues(std::string const& key) {
|
|||
}
|
||||
}
|
||||
|
||||
AgencyCommResult result
|
||||
= sendWithFailover(arangodb::GeneralRequest::RequestType::POST,
|
||||
_globalConnectionOptions._requestTimeout, url,
|
||||
builder.toJson(), false);
|
||||
AgencyCommResult result = sendWithFailover(
|
||||
arangodb::GeneralRequest::RequestType::POST,
|
||||
_globalConnectionOptions._requestTimeout, url, builder.toJson(), false);
|
||||
|
||||
if (!result.successful()) {
|
||||
return result;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
try {
|
||||
result.setVPack(VPackParser::fromJson(result.body().c_str()));
|
||||
|
||||
if (!result.slice().isArray()) {
|
||||
|
@ -1093,16 +1084,16 @@ AgencyCommResult AgencyComm::getValues(std::string const& key) {
|
|||
result._statusCode = 500;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
result._body.clear();
|
||||
result._statusCode = 200;
|
||||
|
||||
} catch(std::exception &e) {
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM)
|
||||
<< "Error transforming result. " << e.what();
|
||||
|
||||
} catch (std::exception& e) {
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM) << "Error transforming result. "
|
||||
<< e.what();
|
||||
result.clear();
|
||||
} catch(...) {
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM)
|
||||
} catch (...) {
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM)
|
||||
<< "Error transforming result. Out of memory";
|
||||
result.clear();
|
||||
}
|
||||
|
@ -1118,8 +1109,7 @@ AgencyCommResult AgencyComm::removeValues(std::string const& key,
|
|||
bool recursive) {
|
||||
AgencyWriteTransaction transaction(
|
||||
AgencyOperation(key, AgencySimpleOperationType::DELETE_OP),
|
||||
AgencyPrecondition(key, AgencyPrecondition::EMPTY, false)
|
||||
);
|
||||
AgencyPrecondition(key, AgencyPrecondition::EMPTY, false));
|
||||
|
||||
return sendTransactionWithFailover(transaction);
|
||||
}
|
||||
|
@ -1133,16 +1123,16 @@ AgencyCommResult AgencyComm::casValue(std::string const& key,
|
|||
arangodb::velocypack::Slice const& json,
|
||||
bool prevExist, double ttl,
|
||||
double timeout) {
|
||||
|
||||
VPackBuilder newBuilder;
|
||||
newBuilder.add(json);
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET, newBuilder.slice());
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET,
|
||||
newBuilder.slice());
|
||||
AgencyPrecondition precondition(key, AgencyPrecondition::EMPTY, !prevExist);
|
||||
if (ttl >= 0.0) {
|
||||
operation._ttl = static_cast<uint32_t>(ttl);
|
||||
}
|
||||
|
||||
|
||||
VPackBuilder preBuilder;
|
||||
precondition.toVelocyPack(preBuilder);
|
||||
|
||||
|
@ -1162,17 +1152,18 @@ AgencyCommResult AgencyComm::casValue(std::string const& key,
|
|||
double timeout) {
|
||||
VPackBuilder newBuilder;
|
||||
newBuilder.add(newJson);
|
||||
|
||||
|
||||
VPackBuilder oldBuilder;
|
||||
oldBuilder.add(oldJson);
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET, newBuilder.slice());
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::SET,
|
||||
newBuilder.slice());
|
||||
AgencyPrecondition precondition(key, AgencyPrecondition::VALUE,
|
||||
oldBuilder.slice());
|
||||
if (ttl >= 0.0) {
|
||||
operation._ttl = static_cast<uint32_t>(ttl);
|
||||
}
|
||||
|
||||
|
||||
AgencyWriteTransaction transaction(operation, precondition);
|
||||
return sendTransactionWithFailover(transaction, timeout);
|
||||
}
|
||||
|
@ -1181,13 +1172,15 @@ AgencyCommResult AgencyComm::casValue(std::string const& key,
|
|||
/// @brief registers a callback on a key
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool AgencyComm::registerCallback(std::string const& key, std::string const& endpoint) {
|
||||
bool AgencyComm::registerCallback(std::string const& key,
|
||||
std::string const& endpoint) {
|
||||
VPackBuilder builder;
|
||||
builder.add(VPackValue(endpoint));
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::OBSERVE, builder.slice());
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::OBSERVE,
|
||||
builder.slice());
|
||||
AgencyWriteTransaction transaction(operation);
|
||||
|
||||
|
||||
auto result = sendTransactionWithFailover(transaction);
|
||||
return result.successful();
|
||||
}
|
||||
|
@ -1200,10 +1193,11 @@ bool AgencyComm::unregisterCallback(std::string const& key,
|
|||
std::string const& endpoint) {
|
||||
VPackBuilder builder;
|
||||
builder.add(VPackValue(endpoint));
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::UNOBSERVE, builder.slice());
|
||||
|
||||
AgencyOperation operation(key, AgencyValueOperationType::UNOBSERVE,
|
||||
builder.slice());
|
||||
AgencyWriteTransaction transaction(operation);
|
||||
|
||||
|
||||
auto result = sendTransactionWithFailover(transaction);
|
||||
return result.successful();
|
||||
}
|
||||
|
@ -1285,11 +1279,11 @@ uint64_t AgencyComm::uniqid(uint64_t count, double timeout) {
|
|||
continue;
|
||||
}
|
||||
|
||||
VPackSlice oldSlice = result.slice()[0].get(std::vector<std::string>(
|
||||
{prefix(), "Sync", "LatestID"}));
|
||||
VPackSlice oldSlice = result.slice()[0].get(
|
||||
std::vector<std::string>({prefix(), "Sync", "LatestID"}));
|
||||
|
||||
if (!(oldSlice.isSmallInt() || oldSlice.isUInt())) {
|
||||
LOG_TOPIC(WARN, Logger::AGENCYCOMM)
|
||||
LOG_TOPIC(WARN, Logger::AGENCYCOMM)
|
||||
<< "Sync/LatestID in agency is not an unsigned integer, fixing...";
|
||||
try {
|
||||
VPackBuilder builder;
|
||||
|
@ -1309,8 +1303,7 @@ uint64_t AgencyComm::uniqid(uint64_t count, double timeout) {
|
|||
oldValue = 0;
|
||||
try {
|
||||
oldValue = oldSlice.getUInt();
|
||||
}
|
||||
catch (...) {
|
||||
} catch (...) {
|
||||
}
|
||||
uint64_t const newValue = oldValue + count;
|
||||
|
||||
|
@ -1322,8 +1315,8 @@ uint64_t AgencyComm::uniqid(uint64_t count, double timeout) {
|
|||
continue;
|
||||
}
|
||||
|
||||
result = casValue("Sync/LatestID", oldSlice, newBuilder.slice(),
|
||||
0.0, timeout);
|
||||
result =
|
||||
casValue("Sync/LatestID", oldSlice, newBuilder.slice(), 0.0, timeout);
|
||||
|
||||
if (result.successful()) {
|
||||
break;
|
||||
|
@ -1527,14 +1520,13 @@ void AgencyComm::requeueEndpoint(AgencyEndpoint* agencyEndpoint,
|
|||
std::string AgencyComm::buildUrl() const {
|
||||
return AgencyComm::AGENCY_URL_PREFIX;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief sends a write HTTP request to the agency, handling failover
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AgencyCommResult AgencyComm::sendTransactionWithFailover(
|
||||
AgencyTransaction const& transaction, double timeout) {
|
||||
|
||||
std::string url(buildUrl());
|
||||
|
||||
url += transaction.isWriteTransaction() ? "/write" : "/read";
|
||||
|
@ -1553,12 +1545,12 @@ AgencyCommResult AgencyComm::sendTransactionWithFailover(
|
|||
if (!result.successful()) {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
result.setVPack(VPackParser::fromJson(result.body().c_str()));
|
||||
|
||||
if (transaction.isWriteTransaction()) {
|
||||
if (!result.slice().isObject() ||
|
||||
if (!result.slice().isObject() ||
|
||||
!result.slice().get("results").isArray()) {
|
||||
result._statusCode = 500;
|
||||
return result;
|
||||
|
@ -1579,19 +1571,19 @@ AgencyCommResult AgencyComm::sendTransactionWithFailover(
|
|||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
result._body.clear();
|
||||
|
||||
} catch(std::exception &e) {
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM)
|
||||
<< "Error transforming result. " << e.what();
|
||||
|
||||
} catch (std::exception& e) {
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM) << "Error transforming result. "
|
||||
<< e.what();
|
||||
result.clear();
|
||||
} catch(...) {
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM)
|
||||
} catch (...) {
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM)
|
||||
<< "Error transforming result. Out of memory";
|
||||
result.clear();
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -1600,11 +1592,8 @@ AgencyCommResult AgencyComm::sendTransactionWithFailover(
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AgencyCommResult AgencyComm::sendWithFailover(
|
||||
arangodb::GeneralRequest::RequestType method,
|
||||
double const timeout,
|
||||
std::string const& url,
|
||||
std::string const& body, bool isWatch) {
|
||||
|
||||
arangodb::GeneralRequest::RequestType method, double const timeout,
|
||||
std::string const& url, std::string const& body, bool isWatch) {
|
||||
size_t numEndpoints;
|
||||
|
||||
{
|
||||
|
@ -1633,7 +1622,8 @@ AgencyCommResult AgencyComm::sendWithFailover(
|
|||
TRI_ASSERT(agencyEndpoint != nullptr);
|
||||
|
||||
try {
|
||||
result = send(agencyEndpoint->_connection, method, timeout, realUrl, body);
|
||||
result =
|
||||
send(agencyEndpoint->_connection, method, timeout, realUrl, body);
|
||||
} catch (...) {
|
||||
result._connected = false;
|
||||
result._statusCode = 0;
|
||||
|
@ -1645,8 +1635,8 @@ AgencyCommResult AgencyComm::sendWithFailover(
|
|||
break;
|
||||
}
|
||||
|
||||
// LOG(WARN) << result._statusCode;
|
||||
|
||||
// LOG(WARN) << result._statusCode;
|
||||
|
||||
if (result._statusCode ==
|
||||
(int)arangodb::GeneralResponse::ResponseCode::TEMPORARY_REDIRECT) {
|
||||
// sometimes the agency will return a 307 (temporary redirect)
|
||||
|
@ -1686,8 +1676,8 @@ AgencyCommResult AgencyComm::sendWithFailover(
|
|||
if (!AgencyComm::hasEndpoint(endpoint)) {
|
||||
AgencyComm::addEndpoint(endpoint, true);
|
||||
|
||||
LOG_TOPIC(DEBUG, Logger::AGENCYCOMM)
|
||||
<< "adding agency-endpoint '" << endpoint << "'";
|
||||
LOG_TOPIC(DEBUG, Logger::AGENCYCOMM) << "adding agency-endpoint '"
|
||||
<< endpoint << "'";
|
||||
|
||||
// re-check the new endpoint
|
||||
if (AgencyComm::hasEndpoint(endpoint)) {
|
||||
|
@ -1695,7 +1685,7 @@ AgencyCommResult AgencyComm::sendWithFailover(
|
|||
continue;
|
||||
}
|
||||
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM)
|
||||
LOG_TOPIC(ERR, Logger::AGENCYCOMM)
|
||||
<< "found redirection to unknown endpoint '" << endpoint
|
||||
<< "'. Will not follow!";
|
||||
|
||||
|
@ -1736,9 +1726,9 @@ AgencyCommResult AgencyComm::sendWithFailover(
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AgencyCommResult AgencyComm::send(
|
||||
arangodb::httpclient::GeneralClientConnection* connection,
|
||||
arangodb::GeneralRequest::RequestType method,
|
||||
double timeout, std::string const& url, std::string const& body) {
|
||||
arangodb::httpclient::GeneralClientConnection* connection,
|
||||
arangodb::GeneralRequest::RequestType method, double timeout,
|
||||
std::string const& url, std::string const& body) {
|
||||
TRI_ASSERT(connection != nullptr);
|
||||
|
||||
if (method == arangodb::GeneralRequest::RequestType::GET ||
|
||||
|
@ -1753,7 +1743,7 @@ AgencyCommResult AgencyComm::send(
|
|||
result._connected = false;
|
||||
result._statusCode = 0;
|
||||
|
||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM)
|
||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM)
|
||||
<< "sending " << arangodb::HttpRequest::translateMethod(method)
|
||||
<< " request to agency at endpoint '"
|
||||
<< connection->getEndpoint()->specification() << "', url '" << url
|
||||
|
@ -1791,7 +1781,7 @@ AgencyCommResult AgencyComm::send(
|
|||
}
|
||||
|
||||
result._connected = true;
|
||||
|
||||
|
||||
if (response->getHttpReturnCode() ==
|
||||
(int)arangodb::GeneralResponse::ResponseCode::TEMPORARY_REDIRECT) {
|
||||
// temporary redirect. now save location header
|
||||
|
@ -1799,8 +1789,8 @@ AgencyCommResult AgencyComm::send(
|
|||
bool found = false;
|
||||
result._location = response->getHeaderField(StaticStrings::Location, found);
|
||||
|
||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM)
|
||||
<< "redirecting to location: '" << result._location << "'";
|
||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM) << "redirecting to location: '"
|
||||
<< result._location << "'";
|
||||
|
||||
if (!found) {
|
||||
// a 307 without a location header does not make any sense
|
||||
|
@ -1816,10 +1806,10 @@ AgencyCommResult AgencyComm::send(
|
|||
result._body = std::string(sb.c_str(), sb.length());
|
||||
result._statusCode = response->getHttpReturnCode();
|
||||
|
||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM)
|
||||
LOG_TOPIC(TRACE, Logger::AGENCYCOMM)
|
||||
<< "request to agency returned status code " << result._statusCode
|
||||
<< ", message: '" << result._message << "', body: '"
|
||||
<< result._body << "'";
|
||||
<< ", message: '" << result._message << "', body: '" << result._body
|
||||
<< "'";
|
||||
|
||||
if (result.successful()) {
|
||||
return result;
|
||||
|
|
|
@ -39,9 +39,9 @@
|
|||
#include "Dispatcher/Dispatcher.h"
|
||||
#include "Dispatcher/DispatcherFeature.h"
|
||||
#include "Dispatcher/Job.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "GeneralServer/RestHandlerFactory.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "V8/v8-globals.h"
|
||||
#include "VocBase/AuthInfo.h"
|
||||
#include "VocBase/server.h"
|
||||
|
@ -375,7 +375,7 @@ void HeartbeatThread::runCoordinator() {
|
|||
|
||||
if (userVersion > 0 && userVersion != oldUserVersion) {
|
||||
oldUserVersion = userVersion;
|
||||
RestServerFeature::AUTH_INFO.outdate();
|
||||
GeneralServerFeature::AUTH_INFO.outdate();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,10 +29,10 @@
|
|||
#include "Basics/StaticStrings.h"
|
||||
#include "Basics/StringBuffer.h"
|
||||
#include "GeneralServer/GeneralServer.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "GeneralServer/RestHandler.h"
|
||||
#include "GeneralServer/RestHandlerFactory.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "Scheduler/Scheduler.h"
|
||||
#include "Scheduler/SchedulerFeature.h"
|
||||
#include "VocBase/server.h"
|
||||
|
|
|
@ -32,10 +32,10 @@
|
|||
#include "GeneralServer/AsyncJobManager.h"
|
||||
#include "GeneralServer/GeneralCommTask.h"
|
||||
#include "GeneralServer/GeneralListenTask.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "GeneralServer/HttpServerJob.h"
|
||||
#include "GeneralServer/RestHandler.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "Scheduler/ListenTask.h"
|
||||
#include "Scheduler/Scheduler.h"
|
||||
#include "Scheduler/SchedulerFeature.h"
|
||||
|
@ -78,6 +78,7 @@ GeneralServer::GeneralServer(
|
|||
_verificationMode(SSL_VERIFY_NONE),
|
||||
_verificationCallback(nullptr),
|
||||
_sslAllowed(ctx != nullptr) {}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief destructs a general server
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -233,7 +234,7 @@ bool GeneralServer::handleRequestAsync(GeneralCommTask* task,
|
|||
|
||||
// register the job with the job manager
|
||||
if (jobId != nullptr) {
|
||||
RestServerFeature::JOB_MANAGER->initAsyncJob(
|
||||
GeneralServerFeature::JOB_MANAGER->initAsyncJob(
|
||||
static_cast<HttpServerJob*>(job.get()), hdr);
|
||||
*jobId = job->jobId();
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
/// @author Dr. Frank Celler
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "RestServerFeature.h"
|
||||
#include "GeneralServerFeature.h"
|
||||
|
||||
#include "Agency/AgencyFeature.h"
|
||||
#include "Agency/RestAgencyHandler.h"
|
||||
|
@ -79,14 +79,14 @@ using namespace arangodb;
|
|||
using namespace arangodb::rest;
|
||||
using namespace arangodb::options;
|
||||
|
||||
rest::RestHandlerFactory* RestServerFeature::HANDLER_FACTORY = nullptr;
|
||||
rest::AsyncJobManager* RestServerFeature::JOB_MANAGER = nullptr;
|
||||
RestServerFeature* RestServerFeature::REST_SERVER = nullptr;
|
||||
AuthInfo RestServerFeature::AUTH_INFO;
|
||||
rest::RestHandlerFactory* GeneralServerFeature::HANDLER_FACTORY = nullptr;
|
||||
rest::AsyncJobManager* GeneralServerFeature::JOB_MANAGER = nullptr;
|
||||
GeneralServerFeature* GeneralServerFeature::GENERAL_SERVER = nullptr;
|
||||
AuthInfo GeneralServerFeature::AUTH_INFO;
|
||||
|
||||
RestServerFeature::RestServerFeature(
|
||||
GeneralServerFeature::GeneralServerFeature(
|
||||
application_features::ApplicationServer* server)
|
||||
: ApplicationFeature(server, "RestServer"),
|
||||
: ApplicationFeature(server, "GeneralServer"),
|
||||
_keepAliveTimeout(300.0),
|
||||
_allowMethodOverride(false),
|
||||
_authentication(true),
|
||||
|
@ -111,7 +111,7 @@ RestServerFeature::RestServerFeature(
|
|||
startsAfter("Upgrade");
|
||||
}
|
||||
|
||||
void RestServerFeature::collectOptions(
|
||||
void GeneralServerFeature::collectOptions(
|
||||
std::shared_ptr<ProgramOptions> options) {
|
||||
options->addSection("server", "Server features");
|
||||
|
||||
|
@ -180,7 +180,7 @@ void RestServerFeature::collectOptions(
|
|||
new VectorParameter<StringParameter>(&_trustedProxies));
|
||||
}
|
||||
|
||||
void RestServerFeature::validateOptions(std::shared_ptr<ProgramOptions>) {
|
||||
void GeneralServerFeature::validateOptions(std::shared_ptr<ProgramOptions>) {
|
||||
if (!_accessControlAllowOrigins.empty()) {
|
||||
// trim trailing slash from all members
|
||||
for (auto& it : _accessControlAllowOrigins) {
|
||||
|
@ -210,9 +210,9 @@ void RestServerFeature::validateOptions(std::shared_ptr<ProgramOptions>) {
|
|||
}
|
||||
|
||||
if (!_jwtSecret.empty()) {
|
||||
if (_jwtSecret.length() > RestServerFeature::_maxSecretLength) {
|
||||
if (_jwtSecret.length() > GeneralServerFeature::_maxSecretLength) {
|
||||
LOG(ERR) << "Given JWT secret too long. Max length is "
|
||||
<< RestServerFeature::_maxSecretLength;
|
||||
<< GeneralServerFeature::_maxSecretLength;
|
||||
FATAL_ERROR_EXIT();
|
||||
}
|
||||
}
|
||||
|
@ -256,32 +256,32 @@ static bool SetRequestContext(GeneralRequest* request, void* data) {
|
|||
}
|
||||
|
||||
VocbaseContext* ctx = new arangodb::VocbaseContext(
|
||||
request, vocbase, RestServerFeature::getJwtSecret());
|
||||
request, vocbase, GeneralServerFeature::getJwtSecret());
|
||||
request->setRequestContext(ctx, true);
|
||||
|
||||
// the "true" means the request is the owner of the context
|
||||
return true;
|
||||
}
|
||||
|
||||
void RestServerFeature::generateNewJwtSecret() {
|
||||
void GeneralServerFeature::generateNewJwtSecret() {
|
||||
_jwtSecret = "";
|
||||
uint16_t m = 254;
|
||||
|
||||
for (size_t i = 0; i < RestServerFeature::_maxSecretLength; i++) {
|
||||
for (size_t i = 0; i < GeneralServerFeature::_maxSecretLength; i++) {
|
||||
_jwtSecret += (1 + RandomGenerator::interval(m));
|
||||
}
|
||||
}
|
||||
|
||||
void RestServerFeature::prepare() {
|
||||
void GeneralServerFeature::prepare() {
|
||||
if (_jwtSecret.empty()) {
|
||||
generateNewJwtSecret();
|
||||
}
|
||||
|
||||
RestHandlerFactory::setMaintenance(true);
|
||||
REST_SERVER = this;
|
||||
GENERAL_SERVER = this;
|
||||
}
|
||||
|
||||
void RestServerFeature::start() {
|
||||
void GeneralServerFeature::start() {
|
||||
_jobManager.reset(new AsyncJobManager(ClusterCommRestCallback));
|
||||
|
||||
JOB_MANAGER = _jobManager.get();
|
||||
|
@ -313,10 +313,10 @@ void RestServerFeature::start() {
|
|||
|
||||
// populate the authentication cache. otherwise no one can access the new
|
||||
// database
|
||||
RestServerFeature::AUTH_INFO.outdate();
|
||||
GeneralServerFeature::AUTH_INFO.outdate();
|
||||
}
|
||||
|
||||
void RestServerFeature::stop() {
|
||||
void GeneralServerFeature::stop() {
|
||||
for (auto& server : _servers) {
|
||||
server->stopListening();
|
||||
}
|
||||
|
@ -326,17 +326,17 @@ void RestServerFeature::stop() {
|
|||
}
|
||||
}
|
||||
|
||||
void RestServerFeature::unprepare() {
|
||||
void GeneralServerFeature::unprepare() {
|
||||
for (auto& server : _servers) {
|
||||
delete server;
|
||||
}
|
||||
|
||||
REST_SERVER = nullptr;
|
||||
GENERAL_SERVER = nullptr;
|
||||
JOB_MANAGER = nullptr;
|
||||
HANDLER_FACTORY = nullptr;
|
||||
}
|
||||
|
||||
void RestServerFeature::buildServers() {
|
||||
void GeneralServerFeature::buildServers() {
|
||||
TRI_ASSERT(_jobManager != nullptr);
|
||||
|
||||
EndpointFeature* endpoint =
|
||||
|
@ -367,7 +367,7 @@ void RestServerFeature::buildServers() {
|
|||
_servers.push_back(server);
|
||||
}
|
||||
|
||||
void RestServerFeature::defineHandlers() {
|
||||
void GeneralServerFeature::defineHandlers() {
|
||||
TRI_ASSERT(_jobManager != nullptr);
|
||||
|
||||
AgencyFeature* agency =
|
|
@ -20,8 +20,8 @@
|
|||
/// @author Dr. Frank Celler
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef APPLICATION_FEATURES_REST_SERVER_FEATURE_H
|
||||
#define APPLICATION_FEATURES_REST_SERVER_FEATURE_H 1
|
||||
#ifndef APPLICATION_FEATURES_GENERAL_SERVER_FEATURE_H
|
||||
#define APPLICATION_FEATURES_GENERAL_SERVER_FEATURE_H 1
|
||||
|
||||
#include "ApplicationFeatures/ApplicationFeature.h"
|
||||
|
||||
|
@ -37,7 +37,7 @@ class GeneralServer;
|
|||
|
||||
class RestServerThread;
|
||||
|
||||
class RestServerFeature final
|
||||
class GeneralServerFeature final
|
||||
: public application_features::ApplicationFeature {
|
||||
public:
|
||||
static rest::RestHandlerFactory* HANDLER_FACTORY;
|
||||
|
@ -46,33 +46,33 @@ class RestServerFeature final
|
|||
|
||||
public:
|
||||
static bool authenticationEnabled() {
|
||||
return REST_SERVER != nullptr && REST_SERVER->authentication();
|
||||
return GENERAL_SERVER != nullptr && GENERAL_SERVER->authentication();
|
||||
}
|
||||
|
||||
static bool hasProxyCheck() {
|
||||
return REST_SERVER != nullptr && REST_SERVER->proxyCheck();
|
||||
return GENERAL_SERVER != nullptr && GENERAL_SERVER->proxyCheck();
|
||||
}
|
||||
|
||||
static std::vector<std::string> getTrustedProxies() {
|
||||
if (REST_SERVER == nullptr) {
|
||||
if (GENERAL_SERVER == nullptr) {
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
return REST_SERVER->trustedProxies();
|
||||
return GENERAL_SERVER->trustedProxies();
|
||||
}
|
||||
|
||||
static std::string getJwtSecret() {
|
||||
if (REST_SERVER == nullptr) {
|
||||
if (GENERAL_SERVER == nullptr) {
|
||||
return std::string();
|
||||
}
|
||||
return REST_SERVER->jwtSecret();
|
||||
return GENERAL_SERVER->jwtSecret();
|
||||
}
|
||||
|
||||
private:
|
||||
static RestServerFeature* REST_SERVER;
|
||||
static GeneralServerFeature* GENERAL_SERVER;
|
||||
static const size_t _maxSecretLength = 64;
|
||||
|
||||
public:
|
||||
explicit RestServerFeature(application_features::ApplicationServer*);
|
||||
explicit GeneralServerFeature(application_features::ApplicationServer*);
|
||||
|
||||
public:
|
||||
void collectOptions(std::shared_ptr<options::ProgramOptions>) override final;
|
|
@ -1,13 +1,38 @@
|
|||
#include "GeneralServer/HttpCommTask.h"
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// DISCLAIMER
|
||||
///
|
||||
/// Copyright 2014-2016 ArangoDB GmbH, Cologne, Germany
|
||||
/// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany
|
||||
///
|
||||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
/// you may not use this file except in compliance with the License.
|
||||
/// You may obtain a copy of the License at
|
||||
///
|
||||
/// http://www.apache.org/licenses/LICENSE-2.0
|
||||
///
|
||||
/// Unless required by applicable law or agreed to in writing, software
|
||||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
/// See the License for the specific language governing permissions and
|
||||
/// limitations under the License.
|
||||
///
|
||||
/// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
///
|
||||
/// @author Dr. Frank Celler
|
||||
/// @author Achim Brandt
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "HttpCommTask.h"
|
||||
|
||||
#include "Basics/HybridLogicalClock.h"
|
||||
#include "GeneralServer/GeneralServer.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "GeneralServer/RestHandler.h"
|
||||
#include "GeneralServer/RestHandlerFactory.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "Scheduler/Scheduler.h"
|
||||
#include "Scheduler/SchedulerFeature.h"
|
||||
#include "Basics/HybridLogicalClock.h"
|
||||
#include "VocBase/server.h" //clock
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief reads data from the socket
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -243,7 +268,7 @@ bool HttpCommTask::processRead() {
|
|||
return false;
|
||||
}
|
||||
|
||||
RestServerFeature::HANDLER_FACTORY->setRequestContext(_request);
|
||||
GeneralServerFeature::HANDLER_FACTORY->setRequestContext(_request);
|
||||
_request->setClientTaskId(_taskId);
|
||||
|
||||
// check HTTP protocol version
|
||||
|
@ -586,8 +611,8 @@ void HttpCommTask::processRequest() {
|
|||
|
||||
// execute response
|
||||
WorkItem::uptr<RestHandler> handler(
|
||||
RestServerFeature::HANDLER_FACTORY->createHandler(_request,
|
||||
response.get()));
|
||||
GeneralServerFeature::HANDLER_FACTORY->createHandler(_request,
|
||||
response.get()));
|
||||
|
||||
// ab hier generell
|
||||
if (handler == nullptr) {
|
||||
|
@ -915,7 +940,7 @@ GeneralResponse::ResponseCode HttpCommTask::authenticateRequest() {
|
|||
auto context = (_request == nullptr) ? nullptr : _request->requestContext();
|
||||
|
||||
if (context == nullptr && _request != nullptr) {
|
||||
bool res = RestServerFeature::HANDLER_FACTORY->setRequestContext(_request);
|
||||
bool res = GeneralServerFeature::HANDLER_FACTORY->setRequestContext(_request);
|
||||
|
||||
if (!res) {
|
||||
return GeneralResponse::ResponseCode::NOT_FOUND;
|
||||
|
|
|
@ -29,9 +29,9 @@
|
|||
#include "GeneralServer/AsyncJobManager.h"
|
||||
#include "GeneralServer/GeneralCommTask.h"
|
||||
#include "GeneralServer/GeneralServer.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "GeneralServer/RestHandler.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "Scheduler/Scheduler.h"
|
||||
#include "Scheduler/SchedulerFeature.h"
|
||||
|
||||
|
@ -81,8 +81,8 @@ void HttpServerJob::work() {
|
|||
|
||||
if (_isAsync) {
|
||||
_handler->RequestStatisticsAgent::release();
|
||||
RestServerFeature::JOB_MANAGER->finishAsyncJob(_jobId,
|
||||
_handler->stealResponse());
|
||||
GeneralServerFeature::JOB_MANAGER->finishAsyncJob(
|
||||
_jobId, _handler->stealResponse());
|
||||
} else {
|
||||
auto data = std::make_unique<TaskData>();
|
||||
|
||||
|
|
|
@ -27,9 +27,9 @@
|
|||
#include <velocypack/velocypack-aliases.h>
|
||||
|
||||
#include "Basics/StringUtils.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "Rest/HttpRequest.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "Ssl/SslInterface.h"
|
||||
#include "VocBase/AuthInfo.h"
|
||||
|
||||
|
@ -111,7 +111,7 @@ RestHandler::status RestAuthHandler::execute() {
|
|||
std::string const password = passwordSlice.copyString();
|
||||
|
||||
AuthResult auth =
|
||||
RestServerFeature::AUTH_INFO.checkPassword(username, password);
|
||||
GeneralServerFeature::AUTH_INFO.checkPassword(username, password);
|
||||
|
||||
if (auth._authorized) {
|
||||
VPackBuilder resultBuilder;
|
||||
|
|
|
@ -25,11 +25,11 @@
|
|||
|
||||
#include "Basics/StaticStrings.h"
|
||||
#include "Basics/StringUtils.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "GeneralServer/GeneralServer.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "GeneralServer/RestHandlerFactory.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "Rest/HttpRequest.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
|
||||
using namespace arangodb;
|
||||
using namespace arangodb::basics;
|
||||
|
@ -176,7 +176,7 @@ RestHandler::status RestBatchHandler::execute() {
|
|||
{
|
||||
std::unique_ptr<HttpResponse> response(
|
||||
new HttpResponse(GeneralResponse::ResponseCode::SERVER_ERROR));
|
||||
handler = RestServerFeature::HANDLER_FACTORY->createHandler(
|
||||
handler = GeneralServerFeature::HANDLER_FACTORY->createHandler(
|
||||
request, response.get());
|
||||
|
||||
if (handler == nullptr) {
|
||||
|
|
|
@ -53,7 +53,7 @@ BootstrapFeature::BootstrapFeature(
|
|||
startsAfter("Upgrade");
|
||||
startsAfter("CheckVersion");
|
||||
startsAfter("FoxxQueues");
|
||||
startsAfter("RestServer");
|
||||
startsAfter("GeneralServer");
|
||||
}
|
||||
|
||||
void BootstrapFeature::collectOptions(std::shared_ptr<ProgramOptions> options) {
|
||||
|
|
|
@ -38,7 +38,7 @@ ConsoleFeature::ConsoleFeature(application_features::ApplicationServer* server)
|
|||
_operationMode(OperationMode::MODE_SERVER),
|
||||
_consoleThread(nullptr) {
|
||||
startsAfter("Server");
|
||||
startsAfter("RestServer");
|
||||
startsAfter("GeneralServer");
|
||||
startsAfter("Bootstrap");
|
||||
}
|
||||
|
||||
|
|
|
@ -25,13 +25,13 @@
|
|||
#include "Basics/StringUtils.h"
|
||||
#include "Cluster/ServerState.h"
|
||||
#include "Cluster/v8-cluster.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "ProgramOptions/ProgramOptions.h"
|
||||
#include "ProgramOptions/Section.h"
|
||||
#include "Rest/Version.h"
|
||||
#include "RestServer/DatabaseServerFeature.h"
|
||||
#include "RestServer/QueryRegistryFeature.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "V8Server/V8DealerFeature.h"
|
||||
#include "V8Server/v8-query.h"
|
||||
#include "V8Server/v8-vocbase.h"
|
||||
|
@ -245,8 +245,8 @@ void DatabaseFeature::openDatabases() {
|
|||
defaults.forceSyncProperties = _forceSyncProperties;
|
||||
|
||||
// get authentication (if available)
|
||||
RestServerFeature* rest =
|
||||
ApplicationServer::getFeature<RestServerFeature>("RestServer");
|
||||
GeneralServerFeature* rest =
|
||||
ApplicationServer::getFeature<GeneralServerFeature>("GeneralServer");
|
||||
|
||||
defaults.requireAuthentication = rest->authentication();
|
||||
defaults.requireAuthenticationUnixSockets = rest->authenticationUnixSockets();
|
||||
|
|
|
@ -43,7 +43,7 @@ ScriptFeature::ScriptFeature(application_features::ApplicationServer* server, in
|
|||
_result(result) {
|
||||
startsAfter("Nonce");
|
||||
startsAfter("Server");
|
||||
startsAfter("RestServer");
|
||||
startsAfter("GeneralServer");
|
||||
}
|
||||
|
||||
void ScriptFeature::collectOptions(std::shared_ptr<ProgramOptions> options) {
|
||||
|
|
|
@ -84,7 +84,6 @@ void ServerFeature::collectOptions(std::shared_ptr<ProgramOptions> options) {
|
|||
|
||||
options->addOption("--javascript.script", "run scripts and exit",
|
||||
new VectorParameter<StringParameter>(&_scripts));
|
||||
|
||||
}
|
||||
|
||||
void ServerFeature::validateOptions(std::shared_ptr<ProgramOptions>) {
|
||||
|
@ -119,19 +118,19 @@ void ServerFeature::validateOptions(std::shared_ptr<ProgramOptions>) {
|
|||
|
||||
if (!_restServer) {
|
||||
ApplicationServer::disableFeatures({"Daemon", "Dispatcher", "Endpoint",
|
||||
"RestServer", "Scheduler", "SslServer",
|
||||
"Supervisor"});
|
||||
"GeneralServer", "Scheduler",
|
||||
"SslServer", "Supervisor"});
|
||||
|
||||
DatabaseFeature* database =
|
||||
DatabaseFeature* database =
|
||||
ApplicationServer::getFeature<DatabaseFeature>("Database");
|
||||
database->disableReplicationApplier();
|
||||
|
||||
StatisticsFeature* statistics =
|
||||
StatisticsFeature* statistics =
|
||||
ApplicationServer::getFeature<StatisticsFeature>("Statistics");
|
||||
statistics->disableStatistics();
|
||||
}
|
||||
|
||||
V8DealerFeature* v8dealer =
|
||||
V8DealerFeature* v8dealer =
|
||||
ApplicationServer::getFeature<V8DealerFeature>("V8Dealer");
|
||||
|
||||
if (_operationMode == OperationMode::MODE_SCRIPT ||
|
||||
|
@ -154,7 +153,7 @@ void ServerFeature::validateOptions(std::shared_ptr<ProgramOptions>) {
|
|||
|
||||
void ServerFeature::start() {
|
||||
if (_operationMode != OperationMode::MODE_CONSOLE && _restServer) {
|
||||
auto scheduler =
|
||||
auto scheduler =
|
||||
ApplicationServer::getFeature<SchedulerFeature>("Scheduler");
|
||||
|
||||
scheduler->buildControlCHandler();
|
||||
|
@ -166,9 +165,9 @@ void ServerFeature::start() {
|
|||
|
||||
// flush all log output before we go on... this is sensible because any
|
||||
// of the following options may print or prompt, and pending log entries
|
||||
// might overwrite that
|
||||
// might overwrite that
|
||||
Logger::flush();
|
||||
|
||||
|
||||
switch (_operationMode) {
|
||||
case OperationMode::MODE_UNITTESTS:
|
||||
case OperationMode::MODE_SCRIPT:
|
||||
|
@ -200,18 +199,18 @@ void ServerFeature::waitForHeartbeat() {
|
|||
usleep(100 * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string ServerFeature::operationModeString(OperationMode mode) {
|
||||
switch (mode) {
|
||||
case OperationMode::MODE_CONSOLE:
|
||||
case OperationMode::MODE_CONSOLE:
|
||||
return "console";
|
||||
case OperationMode::MODE_UNITTESTS:
|
||||
case OperationMode::MODE_UNITTESTS:
|
||||
return "unittests";
|
||||
case OperationMode::MODE_SCRIPT:
|
||||
case OperationMode::MODE_SCRIPT:
|
||||
return "script";
|
||||
case OperationMode::MODE_SERVER:
|
||||
case OperationMode::MODE_SERVER:
|
||||
return "server";
|
||||
default:
|
||||
default:
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ UnitTestsFeature::UnitTestsFeature(application_features::ApplicationServer* serv
|
|||
_result(result) {
|
||||
startsAfter("Nonce");
|
||||
startsAfter("Server");
|
||||
startsAfter("RestServer");
|
||||
startsAfter("GeneralServer");
|
||||
startsAfter("Bootstrap");
|
||||
}
|
||||
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
#include "Basics/tri-strings.h"
|
||||
#include "Cluster/ServerState.h"
|
||||
#include "Endpoint/ConnectionInfo.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "Ssl/SslInterface.h"
|
||||
#include "VocBase/AuthInfo.h"
|
||||
#include "VocBase/server.h"
|
||||
|
@ -113,7 +113,7 @@ GeneralResponse::ResponseCode VocbaseContext::authenticate() {
|
|||
|
||||
if (!username.empty() || !dbname.empty()) {
|
||||
AuthLevel level =
|
||||
RestServerFeature::AUTH_INFO.canUseDatabase(username, dbname);
|
||||
GeneralServerFeature::AUTH_INFO.canUseDatabase(username, dbname);
|
||||
|
||||
if (level != AuthLevel::RW) {
|
||||
result = GeneralResponse::ResponseCode::UNAUTHORIZED;
|
||||
|
@ -221,7 +221,7 @@ GeneralResponse::ResponseCode VocbaseContext::basicAuthentication(
|
|||
return GeneralResponse::ResponseCode::OK;
|
||||
}
|
||||
|
||||
AuthResult result = RestServerFeature::AUTH_INFO.checkAuthentication(
|
||||
AuthResult result = GeneralServerFeature::AUTH_INFO.checkAuthentication(
|
||||
AuthInfo::AuthType::BASIC, auth);
|
||||
|
||||
if (!result._authorized) {
|
||||
|
@ -250,7 +250,7 @@ GeneralResponse::ResponseCode VocbaseContext::basicAuthentication(
|
|||
|
||||
GeneralResponse::ResponseCode VocbaseContext::jwtAuthentication(
|
||||
std::string const& auth) {
|
||||
AuthResult result = RestServerFeature::AUTH_INFO.checkAuthentication(
|
||||
AuthResult result = GeneralServerFeature::AUTH_INFO.checkAuthentication(
|
||||
AuthInfo::AuthType::JWT, auth);
|
||||
|
||||
if (!result._authorized) {
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include "Basics/ArangoGlobalContext.h"
|
||||
#include "Cluster/ClusterFeature.h"
|
||||
#include "Dispatcher/DispatcherFeature.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "Logger/LoggerBufferFeature.h"
|
||||
#include "Logger/LoggerFeature.h"
|
||||
#include "ProgramOptions/ProgramOptions.h"
|
||||
|
@ -58,7 +59,6 @@
|
|||
#include "RestServer/FrontendFeature.h"
|
||||
#include "RestServer/InitDatabaseFeature.h"
|
||||
#include "RestServer/QueryRegistryFeature.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "RestServer/ScriptFeature.h"
|
||||
#include "RestServer/ServerFeature.h"
|
||||
#include "RestServer/UnitTestsFeature.h"
|
||||
|
@ -92,18 +92,21 @@ static int runServer(int argc, char** argv) {
|
|||
application_features::ApplicationServer server(options);
|
||||
|
||||
std::vector<std::string> nonServerFeatures = {
|
||||
"Action", "Affinity", "Agency",
|
||||
"Cluster", "Daemon", "Dispatcher",
|
||||
"Endpoint", "FoxxQueues", "LoggerBufferFeature",
|
||||
"RestServer", "Server", "Scheduler",
|
||||
"SslServer", "Statistics", "Supervisor"};
|
||||
"Action", "Affinity",
|
||||
"Agency", "Cluster",
|
||||
"Daemon", "Dispatcher",
|
||||
"Endpoint", "FoxxQueues",
|
||||
"GeneralServer", "LoggerBufferFeature",
|
||||
"Server", "Scheduler",
|
||||
"SslServer", "Statistics",
|
||||
"Supervisor"};
|
||||
|
||||
int ret = EXIT_FAILURE;
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
server.addFeature(new WindowsServiceFeature(&server));
|
||||
#endif
|
||||
|
||||
|
||||
server.addFeature(new ActionFeature(&server));
|
||||
server.addFeature(new AffinityFeature(&server));
|
||||
server.addFeature(new AgencyFeature(&server));
|
||||
|
@ -119,6 +122,7 @@ static int runServer(int argc, char** argv) {
|
|||
server.addFeature(new FileDescriptorsFeature(&server));
|
||||
server.addFeature(new FoxxQueuesFeature(&server));
|
||||
server.addFeature(new FrontendFeature(&server));
|
||||
server.addFeature(new GeneralServerFeature(&server));
|
||||
server.addFeature(new InitDatabaseFeature(&server, nonServerFeatures));
|
||||
server.addFeature(new LanguageFeature(&server));
|
||||
server.addFeature(new LogfileManager(&server));
|
||||
|
@ -129,7 +133,6 @@ static int runServer(int argc, char** argv) {
|
|||
server.addFeature(new QueryRegistryFeature(&server));
|
||||
server.addFeature(new RandomFeature(&server));
|
||||
server.addFeature(new RecoveryFeature(&server));
|
||||
server.addFeature(new RestServerFeature(&server));
|
||||
server.addFeature(new SchedulerFeature(&server));
|
||||
server.addFeature(new ScriptFeature(&server, &ret));
|
||||
server.addFeature(new ServerFeature(&server, &ret));
|
||||
|
@ -179,12 +182,13 @@ static int runServer(int argc, char** argv) {
|
|||
static int ARGC;
|
||||
static char** ARGV;
|
||||
|
||||
static void WINAPI ServiceMain (DWORD dwArgc, LPSTR *lpszArgv) {
|
||||
static void WINAPI ServiceMain(DWORD dwArgc, LPSTR* lpszArgv) {
|
||||
if (!TRI_InitWindowsEventLog()) {
|
||||
return;
|
||||
}
|
||||
// register the service ctrl handler, lpszArgv[0] contains service name
|
||||
ServiceStatus = RegisterServiceCtrlHandlerA(lpszArgv[0], (LPHANDLER_FUNCTION) ServiceCtrl);
|
||||
ServiceStatus =
|
||||
RegisterServiceCtrlHandlerA(lpszArgv[0], (LPHANDLER_FUNCTION)ServiceCtrl);
|
||||
|
||||
// set start pending
|
||||
SetServiceStatus(SERVICE_START_PENDING, 0, 1, 10000);
|
||||
|
@ -203,17 +207,16 @@ int main(int argc, char* argv[]) {
|
|||
if (argc > 1 && TRI_EqualString("--start-service", argv[1])) {
|
||||
ARGC = argc;
|
||||
ARGV = argv;
|
||||
|
||||
SERVICE_TABLE_ENTRY ste[] = {{TEXT(""), (LPSERVICE_MAIN_FUNCTION)ServiceMain},
|
||||
{nullptr, nullptr}};
|
||||
|
||||
|
||||
SERVICE_TABLE_ENTRY ste[] = {
|
||||
{TEXT(""), (LPSERVICE_MAIN_FUNCTION)ServiceMain}, {nullptr, nullptr}};
|
||||
|
||||
if (!StartServiceCtrlDispatcher(ste)) {
|
||||
std::cerr << "FATAL: StartServiceCtrlDispatcher has failed with "
|
||||
<< GetLastError() << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
#endif
|
||||
return runServer(argc, argv);
|
||||
}
|
||||
|
|
|
@ -23,9 +23,9 @@
|
|||
|
||||
#include "v8-vocbaseprivate.h"
|
||||
|
||||
#include <unicode/timezone.h>
|
||||
#include <unicode/smpdtfmt.h>
|
||||
#include <unicode/dtfmtsym.h>
|
||||
#include <unicode/smpdtfmt.h>
|
||||
#include <unicode/timezone.h>
|
||||
|
||||
#include <velocypack/Iterator.h>
|
||||
#include <velocypack/Slice.h>
|
||||
|
@ -50,9 +50,9 @@
|
|||
#include "Cluster/ClusterInfo.h"
|
||||
#include "Cluster/ClusterMethods.h"
|
||||
#include "Cluster/ServerState.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "Rest/Version.h"
|
||||
#include "RestServer/ConsoleThread.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "RestServer/VocbaseContext.h"
|
||||
#include "Statistics/StatisticsFeature.h"
|
||||
#include "Utils/ExplicitTransaction.h"
|
||||
|
@ -555,8 +555,7 @@ static void JS_WaitCollectorWal(
|
|||
|
||||
std::string const name = TRI_ObjectToString(args[0]);
|
||||
|
||||
TRI_vocbase_col_t* col =
|
||||
TRI_LookupCollectionByNameVocBase(vocbase, name);
|
||||
TRI_vocbase_col_t* col = TRI_LookupCollectionByNameVocBase(vocbase, name);
|
||||
|
||||
if (col == nullptr) {
|
||||
TRI_V8_THROW_EXCEPTION(TRI_ERROR_ARANGO_COLLECTION_NOT_FOUND);
|
||||
|
@ -942,7 +941,7 @@ static void JS_ReloadAuth(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
|||
TRI_V8_THROW_EXCEPTION_USAGE("RELOAD_AUTH()");
|
||||
}
|
||||
|
||||
RestServerFeature::AUTH_INFO.outdate();
|
||||
GeneralServerFeature::AUTH_INFO.outdate();
|
||||
|
||||
TRI_V8_RETURN_TRUE();
|
||||
TRI_V8_TRY_CATCH_END
|
||||
|
@ -1196,7 +1195,7 @@ static void JS_ExecuteAqlJson(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
|||
TRI_V8_THROW_EXCEPTION(res);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TRI_GET_GLOBALS();
|
||||
arangodb::aql::Query query(true, vocbase, queryBuilder, options,
|
||||
arangodb::aql::PART_MAIN);
|
||||
|
@ -2639,31 +2638,34 @@ static void JS_GetTimers(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
|||
|
||||
static void JS_TrustedProxies(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
||||
TRI_V8_TRY_CATCH_BEGIN(isolate);
|
||||
|
||||
if (RestServerFeature::hasProxyCheck()) {
|
||||
|
||||
if (GeneralServerFeature::hasProxyCheck()) {
|
||||
v8::Handle<v8::Array> result = v8::Array::New(isolate);
|
||||
|
||||
uint32_t i = 0;
|
||||
for (auto const& proxyDef: RestServerFeature::getTrustedProxies()) {
|
||||
for (auto const& proxyDef : GeneralServerFeature::getTrustedProxies()) {
|
||||
result->Set(i++, TRI_V8_STD_STRING(proxyDef));
|
||||
}
|
||||
TRI_V8_RETURN(result);
|
||||
} else {
|
||||
TRI_V8_RETURN(v8::Null(isolate));
|
||||
}
|
||||
|
||||
|
||||
TRI_V8_TRY_CATCH_END
|
||||
}
|
||||
|
||||
static void JS_AuthenticationEnabled(v8::FunctionCallbackInfo<v8::Value> const& args) {
|
||||
// mop: one could argue that this is a function because this might be changable on the fly
|
||||
// at some time but the sad truth is server startup order :S v8 is initialized after RestServerFeature
|
||||
// :weglaecheln:
|
||||
static void JS_AuthenticationEnabled(
|
||||
v8::FunctionCallbackInfo<v8::Value> const& args) {
|
||||
// mop: one could argue that this is a function because this might be
|
||||
// changable on the fly at some time but the sad truth is server startup
|
||||
// order
|
||||
// v8 is initialized after GeneralServerFeature
|
||||
TRI_V8_TRY_CATCH_BEGIN(isolate);
|
||||
v8::HandleScope scope(isolate);
|
||||
|
||||
v8::Handle<v8::Boolean> result = v8::Boolean::New(isolate, RestServerFeature::authenticationEnabled());
|
||||
|
||||
v8::Handle<v8::Boolean> result =
|
||||
v8::Boolean::New(isolate, GeneralServerFeature::authenticationEnabled());
|
||||
|
||||
TRI_V8_RETURN(result);
|
||||
TRI_V8_TRY_CATCH_END
|
||||
}
|
||||
|
@ -2860,7 +2862,7 @@ void TRI_InitV8VocBridge(v8::Isolate* isolate, v8::Handle<v8::Context> context,
|
|||
TRI_AddGlobalFunctionVocbase(
|
||||
isolate, context, TRI_V8_ASCII_STRING("AQL_QUERY_CACHE_INVALIDATE"),
|
||||
JS_QueryCacheInvalidateAql, true);
|
||||
|
||||
|
||||
TRI_AddGlobalFunctionVocbase(isolate, context,
|
||||
TRI_V8_ASCII_STRING("OBJECT_HASH"),
|
||||
JS_ObjectHash, true);
|
||||
|
@ -2888,9 +2890,8 @@ void TRI_InitV8VocBridge(v8::Isolate* isolate, v8::Handle<v8::Context> context,
|
|||
TRI_V8_ASCII_STRING("PARSE_DATETIME"),
|
||||
JS_ParseDatetime);
|
||||
|
||||
TRI_AddGlobalFunctionVocbase(isolate, context,
|
||||
TRI_V8_ASCII_STRING("ENDPOINTS"),
|
||||
JS_Endpoints, true);
|
||||
TRI_AddGlobalFunctionVocbase(
|
||||
isolate, context, TRI_V8_ASCII_STRING("ENDPOINTS"), JS_Endpoints, true);
|
||||
TRI_AddGlobalFunctionVocbase(isolate, context,
|
||||
TRI_V8_ASCII_STRING("RELOAD_AUTH"),
|
||||
JS_ReloadAuth, true);
|
||||
|
@ -2923,11 +2924,13 @@ void TRI_InitV8VocBridge(v8::Isolate* isolate, v8::Handle<v8::Context> context,
|
|||
TRI_AddGlobalFunctionVocbase(
|
||||
isolate, context, TRI_V8_ASCII_STRING("GET_TIMERS"), JS_GetTimers, true);
|
||||
|
||||
TRI_AddGlobalFunctionVocbase(
|
||||
isolate, context, TRI_V8_ASCII_STRING("AUTHENTICATION_ENABLED"), JS_AuthenticationEnabled, true);
|
||||
|
||||
TRI_AddGlobalFunctionVocbase(
|
||||
isolate, context, TRI_V8_ASCII_STRING("TRUSTED_PROXIES"), JS_TrustedProxies, true);
|
||||
TRI_AddGlobalFunctionVocbase(isolate, context,
|
||||
TRI_V8_ASCII_STRING("AUTHENTICATION_ENABLED"),
|
||||
JS_AuthenticationEnabled, true);
|
||||
|
||||
TRI_AddGlobalFunctionVocbase(isolate, context,
|
||||
TRI_V8_ASCII_STRING("TRUSTED_PROXIES"),
|
||||
JS_TrustedProxies, true);
|
||||
// .............................................................................
|
||||
// create global variables
|
||||
// .............................................................................
|
||||
|
@ -2948,7 +2951,7 @@ void TRI_InitV8VocBridge(v8::Isolate* isolate, v8::Handle<v8::Context> context,
|
|||
context->Global()->ForceSet(TRI_V8_ASCII_STRING("THREAD_NUMBER"),
|
||||
v8::Number::New(isolate, (double)threadNumber),
|
||||
v8::ReadOnly);
|
||||
|
||||
|
||||
// whether or not statistics are enabled
|
||||
context->Global()->ForceSet(
|
||||
TRI_V8_ASCII_STRING("ENABLE_STATISTICS"),
|
||||
|
|
|
@ -33,9 +33,9 @@
|
|||
#include "Basics/VelocyPackHelper.h"
|
||||
#include "Basics/WriteLocker.h"
|
||||
#include "Basics/tri-strings.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "RestServer/DatabaseFeature.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "Ssl/SslInterface.h"
|
||||
#include "Utils/SingleCollectionTransaction.h"
|
||||
#include "Utils/StandaloneTransactionContext.h"
|
||||
|
@ -544,7 +544,7 @@ bool AuthInfo::validateJwtHMAC256Signature(std::string const& message,
|
|||
std::string const& signature) {
|
||||
std::string decodedSignature = StringUtils::decodeBase64U(signature);
|
||||
|
||||
std::string const& jwtSecret = RestServerFeature::getJwtSecret();
|
||||
std::string const& jwtSecret = GeneralServerFeature::getJwtSecret();
|
||||
return verifyHMAC(jwtSecret.c_str(), jwtSecret.length(), message.c_str(),
|
||||
message.length(), decodedSignature.c_str(),
|
||||
decodedSignature.length(),
|
||||
|
|
|
@ -41,9 +41,9 @@
|
|||
#include "Basics/memory-map.h"
|
||||
#include "Basics/tri-strings.h"
|
||||
#include "Cluster/ServerState.h"
|
||||
#include "GeneralServer/GeneralServerFeature.h"
|
||||
#include "Logger/Logger.h"
|
||||
#include "Random/RandomGenerator.h"
|
||||
#include "RestServer/RestServerFeature.h"
|
||||
#include "Utils/CursorRepository.h"
|
||||
#include "V8Server/V8DealerFeature.h"
|
||||
#include "VocBase/replication-applier.h"
|
||||
|
@ -425,7 +425,7 @@ static int OpenDatabases(TRI_server_t* server, bool isUpgrade) {
|
|||
|
||||
if (!TRI_ExistsFile(parametersFile.c_str())) {
|
||||
// no parameter.json file
|
||||
|
||||
|
||||
if (TRI_FilesDirectory(databaseDirectory.c_str()).empty()) {
|
||||
// directory is otherwise empty, continue!
|
||||
LOG(WARN) << "ignoring empty database directory '" << databaseDirectory
|
||||
|
@ -1998,7 +1998,8 @@ int TRI_GetUserDatabasesServer(TRI_server_t* server, char const* username,
|
|||
char const* dbName = p.second->_name;
|
||||
TRI_ASSERT(dbName != nullptr);
|
||||
|
||||
auto level = RestServerFeature::AUTH_INFO.canUseDatabase(username, dbName);
|
||||
auto level =
|
||||
GeneralServerFeature::AUTH_INFO.canUseDatabase(username, dbName);
|
||||
|
||||
if (level == AuthLevel::NONE) {
|
||||
continue;
|
||||
|
|
Loading…
Reference in New Issue