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) {
|
||||
res = close(s.fileDescriptor);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
|
@ -230,20 +230,20 @@ namespace triagens {
|
|||
LOG_DEBUG("trying to establish secure connection");
|
||||
|
||||
// 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());
|
||||
TRI_CLOSE_SOCKET(socket);
|
||||
return;
|
||||
}
|
||||
|
||||
// build a new connection
|
||||
SSL * ssl = SSL_new(ctx);
|
||||
SSL* ssl = SSL_new(ctx);
|
||||
|
||||
info.sslContext = ssl;
|
||||
|
||||
if (ssl == 0) {
|
||||
if (ssl == nullptr) {
|
||||
BIO_free_all(sbio);
|
||||
LOG_WARNING("cannot build new SSL connection: %s", triagens::basics::lastSSLError().c_str());
|
||||
TRI_CLOSE_SOCKET(socket);
|
||||
|
@ -290,7 +290,7 @@ namespace triagens {
|
|||
/// @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");
|
||||
|
||||
if (!TRI_isvalidsocket(_listenSocket)) {
|
||||
if (! TRI_isvalidsocket(_listenSocket)) {
|
||||
LOG_ERROR("In ListenTask::setup could not convert socket handle to socket descriptor -- invalid socket handle");
|
||||
return false;
|
||||
}
|
||||
|
@ -178,7 +178,7 @@ bool ListenTask::handleEvent (EventToken token, EventType revents) {
|
|||
TRI_socket_t connectionSocket;
|
||||
connectionSocket = TRI_accept(_listenSocket, (sockaddr*) &addr, &len);
|
||||
|
||||
if (!TRI_isvalidsocket(connectionSocket)) {
|
||||
if (! TRI_isvalidsocket(connectionSocket)) {
|
||||
++acceptFailures;
|
||||
|
||||
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);
|
||||
|
||||
if (res != 0) {
|
||||
if (res != TRI_ERROR_NO_ERROR) {
|
||||
TRI_CLOSE_SOCKET(connectionSocket);
|
||||
|
||||
LOG_WARNING("getsockname failed with %d (%s)", errno, strerror(errno));
|
||||
|
|
|
@ -134,6 +134,14 @@ namespace triagens {
|
|||
_numConnectRetries = 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the number of configured connect retries
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline size_t connectRetries () const {
|
||||
return _connectRetries;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief connect
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -113,6 +113,8 @@ namespace triagens {
|
|||
|
||||
TRI_ASSERT(_state == IN_CONNECT || _state == IN_WRITE);
|
||||
|
||||
size_t const maxConnects = _connection->connectRetries();
|
||||
size_t connects = 0;
|
||||
|
||||
double endTime = now() + _requestTimeout;
|
||||
double remainingTime = _requestTimeout;
|
||||
|
@ -120,6 +122,15 @@ namespace triagens {
|
|||
while (isWorking() && remainingTime > 0.0) {
|
||||
switch (_state) {
|
||||
case (IN_CONNECT): {
|
||||
if (++connects > maxConnects) {
|
||||
// too many connects
|
||||
SimpleHttpResult* result = getResult();
|
||||
|
||||
_result = nullptr;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
handleConnect();
|
||||
break;
|
||||
}
|
||||
|
@ -191,7 +202,7 @@ namespace triagens {
|
|||
remainingTime = endTime - now();
|
||||
}
|
||||
|
||||
if (isWorking() && _errorMessage == "" ) {
|
||||
if (isWorking() && _errorMessage.empty()) {
|
||||
setErrorMessage("Request timeout reached");
|
||||
}
|
||||
|
||||
|
@ -248,29 +259,33 @@ namespace triagens {
|
|||
_pathToBasicAuth.push_back(make_pair(prefix, value));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief return the result
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SimpleHttpResult* SimpleHttpClient::getResult () {
|
||||
switch (_state) {
|
||||
case (IN_CONNECT):
|
||||
_result->setResultType(SimpleHttpResult::COULD_NOT_CONNECT);
|
||||
break;
|
||||
|
||||
case (IN_WRITE):
|
||||
case IN_WRITE:
|
||||
_result->setResultType(SimpleHttpResult::WRITE_ERROR);
|
||||
break;
|
||||
|
||||
case (IN_READ_HEADER):
|
||||
case (IN_READ_BODY):
|
||||
case (IN_READ_CHUNKED_HEADER):
|
||||
case (IN_READ_CHUNKED_BODY):
|
||||
case IN_READ_HEADER:
|
||||
case IN_READ_BODY:
|
||||
case IN_READ_CHUNKED_HEADER:
|
||||
case IN_READ_CHUNKED_BODY:
|
||||
_result->setResultType(SimpleHttpResult::READ_ERROR);
|
||||
break;
|
||||
|
||||
case (FINISHED):
|
||||
case FINISHED:
|
||||
_result->setResultType(SimpleHttpResult::COMPLETE);
|
||||
break;
|
||||
|
||||
default :
|
||||
case IN_CONNECT:
|
||||
default: {
|
||||
_result->setResultType(SimpleHttpResult::COULD_NOT_CONNECT);
|
||||
setErrorMessage("Could not connect");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return _result;
|
||||
|
|
Loading…
Reference in New Issue