mirror of https://gitee.com/bigwinds/arangodb
prevent endless connection attempts by arangosh
This commit is contained in:
parent
804099aa1a
commit
98a0ef0ded
|
@ -93,7 +93,7 @@ int TRI_closesocket (TRI_socket_t s) {
|
||||||
if (s.fileDescriptor != TRI_INVALID_SOCKET) {
|
if (s.fileDescriptor != TRI_INVALID_SOCKET) {
|
||||||
res = close(s.fileDescriptor);
|
res = close(s.fileDescriptor);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -230,20 +230,20 @@ namespace triagens {
|
||||||
LOG_DEBUG("trying to establish secure connection");
|
LOG_DEBUG("trying to establish secure connection");
|
||||||
|
|
||||||
// convert in a SSL BIO structure
|
// convert in a SSL BIO structure
|
||||||
BIO * sbio = BIO_new_socket((int) TRI_get_fd_or_handle_of_socket(socket), BIO_NOCLOSE);
|
BIO* sbio = BIO_new_socket((int) TRI_get_fd_or_handle_of_socket(socket), BIO_NOCLOSE);
|
||||||
|
|
||||||
if (sbio == 0) {
|
if (sbio == nullptr) {
|
||||||
LOG_WARNING("cannot build new SSL BIO: %s", triagens::basics::lastSSLError().c_str());
|
LOG_WARNING("cannot build new SSL BIO: %s", triagens::basics::lastSSLError().c_str());
|
||||||
TRI_CLOSE_SOCKET(socket);
|
TRI_CLOSE_SOCKET(socket);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// build a new connection
|
// build a new connection
|
||||||
SSL * ssl = SSL_new(ctx);
|
SSL* ssl = SSL_new(ctx);
|
||||||
|
|
||||||
info.sslContext = ssl;
|
info.sslContext = ssl;
|
||||||
|
|
||||||
if (ssl == 0) {
|
if (ssl == nullptr) {
|
||||||
BIO_free_all(sbio);
|
BIO_free_all(sbio);
|
||||||
LOG_WARNING("cannot build new SSL connection: %s", triagens::basics::lastSSLError().c_str());
|
LOG_WARNING("cannot build new SSL connection: %s", triagens::basics::lastSSLError().c_str());
|
||||||
TRI_CLOSE_SOCKET(socket);
|
TRI_CLOSE_SOCKET(socket);
|
||||||
|
@ -290,7 +290,7 @@ namespace triagens {
|
||||||
/// @brief verification callback
|
/// @brief verification callback
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
int (*verificationCallback)(int, X509_STORE_CTX *);
|
int (*verificationCallback)(int, X509_STORE_CTX*);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,7 +109,7 @@ bool ListenTask::setup (Scheduler* scheduler, EventLoop loop) {
|
||||||
// ..........................................................................
|
// ..........................................................................
|
||||||
LOG_TRACE("attempting to convert socket handle to socket descriptor");
|
LOG_TRACE("attempting to convert socket handle to socket descriptor");
|
||||||
|
|
||||||
if (!TRI_isvalidsocket(_listenSocket)) {
|
if (! TRI_isvalidsocket(_listenSocket)) {
|
||||||
LOG_ERROR("In ListenTask::setup could not convert socket handle to socket descriptor -- invalid socket handle");
|
LOG_ERROR("In ListenTask::setup could not convert socket handle to socket descriptor -- invalid socket handle");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ bool ListenTask::handleEvent (EventToken token, EventType revents) {
|
||||||
TRI_socket_t connectionSocket;
|
TRI_socket_t connectionSocket;
|
||||||
connectionSocket = TRI_accept(_listenSocket, (sockaddr*) &addr, &len);
|
connectionSocket = TRI_accept(_listenSocket, (sockaddr*) &addr, &len);
|
||||||
|
|
||||||
if (!TRI_isvalidsocket(connectionSocket)) {
|
if (! TRI_isvalidsocket(connectionSocket)) {
|
||||||
++acceptFailures;
|
++acceptFailures;
|
||||||
|
|
||||||
if (acceptFailures < MAX_ACCEPT_ERRORS) {
|
if (acceptFailures < MAX_ACCEPT_ERRORS) {
|
||||||
|
@ -200,7 +200,7 @@ bool ListenTask::handleEvent (EventToken token, EventType revents) {
|
||||||
|
|
||||||
int res = TRI_getsockname(connectionSocket, (sockaddr*) &addr_out, &len_out);
|
int res = TRI_getsockname(connectionSocket, (sockaddr*) &addr_out, &len_out);
|
||||||
|
|
||||||
if (res != 0) {
|
if (res != TRI_ERROR_NO_ERROR) {
|
||||||
TRI_CLOSE_SOCKET(connectionSocket);
|
TRI_CLOSE_SOCKET(connectionSocket);
|
||||||
|
|
||||||
LOG_WARNING("getsockname failed with %d (%s)", errno, strerror(errno));
|
LOG_WARNING("getsockname failed with %d (%s)", errno, strerror(errno));
|
||||||
|
|
|
@ -134,6 +134,14 @@ namespace triagens {
|
||||||
_numConnectRetries = 0;
|
_numConnectRetries = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief returns the number of configured connect retries
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline size_t connectRetries () const {
|
||||||
|
return _connectRetries;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief connect
|
/// @brief connect
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -113,6 +113,8 @@ namespace triagens {
|
||||||
|
|
||||||
TRI_ASSERT(_state == IN_CONNECT || _state == IN_WRITE);
|
TRI_ASSERT(_state == IN_CONNECT || _state == IN_WRITE);
|
||||||
|
|
||||||
|
size_t const maxConnects = _connection->connectRetries();
|
||||||
|
size_t connects = 0;
|
||||||
|
|
||||||
double endTime = now() + _requestTimeout;
|
double endTime = now() + _requestTimeout;
|
||||||
double remainingTime = _requestTimeout;
|
double remainingTime = _requestTimeout;
|
||||||
|
@ -120,6 +122,15 @@ namespace triagens {
|
||||||
while (isWorking() && remainingTime > 0.0) {
|
while (isWorking() && remainingTime > 0.0) {
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
case (IN_CONNECT): {
|
case (IN_CONNECT): {
|
||||||
|
if (++connects > maxConnects) {
|
||||||
|
// too many connects
|
||||||
|
SimpleHttpResult* result = getResult();
|
||||||
|
|
||||||
|
_result = nullptr;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
handleConnect();
|
handleConnect();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -191,7 +202,7 @@ namespace triagens {
|
||||||
remainingTime = endTime - now();
|
remainingTime = endTime - now();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isWorking() && _errorMessage == "" ) {
|
if (isWorking() && _errorMessage.empty()) {
|
||||||
setErrorMessage("Request timeout reached");
|
setErrorMessage("Request timeout reached");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,29 +259,33 @@ namespace triagens {
|
||||||
_pathToBasicAuth.push_back(make_pair(prefix, value));
|
_pathToBasicAuth.push_back(make_pair(prefix, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief return the result
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
SimpleHttpResult* SimpleHttpClient::getResult () {
|
SimpleHttpResult* SimpleHttpClient::getResult () {
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
case (IN_CONNECT):
|
case IN_WRITE:
|
||||||
_result->setResultType(SimpleHttpResult::COULD_NOT_CONNECT);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case (IN_WRITE):
|
|
||||||
_result->setResultType(SimpleHttpResult::WRITE_ERROR);
|
_result->setResultType(SimpleHttpResult::WRITE_ERROR);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (IN_READ_HEADER):
|
case IN_READ_HEADER:
|
||||||
case (IN_READ_BODY):
|
case IN_READ_BODY:
|
||||||
case (IN_READ_CHUNKED_HEADER):
|
case IN_READ_CHUNKED_HEADER:
|
||||||
case (IN_READ_CHUNKED_BODY):
|
case IN_READ_CHUNKED_BODY:
|
||||||
_result->setResultType(SimpleHttpResult::READ_ERROR);
|
_result->setResultType(SimpleHttpResult::READ_ERROR);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (FINISHED):
|
case FINISHED:
|
||||||
_result->setResultType(SimpleHttpResult::COMPLETE);
|
_result->setResultType(SimpleHttpResult::COMPLETE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default :
|
case IN_CONNECT:
|
||||||
|
default: {
|
||||||
_result->setResultType(SimpleHttpResult::COULD_NOT_CONNECT);
|
_result->setResultType(SimpleHttpResult::COULD_NOT_CONNECT);
|
||||||
|
setErrorMessage("Could not connect");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return _result;
|
return _result;
|
||||||
|
|
Loading…
Reference in New Issue