mirror of https://github.com/Icinga/icinga2.git
parent
0484706324
commit
e2fe1c8a6b
|
@ -92,20 +92,19 @@ void TlsStream::Handshake(void)
|
||||||
{
|
{
|
||||||
ASSERT(!OwnsLock());
|
ASSERT(!OwnsLock());
|
||||||
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int rc;
|
int rc, err;
|
||||||
|
|
||||||
{
|
{
|
||||||
ObjectLock olock(this);
|
ObjectLock olock(this);
|
||||||
rc = SSL_do_handshake(m_SSL.get());
|
rc = SSL_do_handshake(m_SSL.get());
|
||||||
|
|
||||||
|
if (rc > 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
err = SSL_get_error(m_SSL.get(), rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc > 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
int err = SSL_get_error(m_SSL.get(), rc);
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case SSL_ERROR_WANT_READ:
|
case SSL_ERROR_WANT_READ:
|
||||||
m_Socket->Poll(true, false);
|
m_Socket->Poll(true, false);
|
||||||
|
@ -134,15 +133,17 @@ size_t TlsStream::Read(void *buffer, size_t count)
|
||||||
size_t left = count;
|
size_t left = count;
|
||||||
|
|
||||||
while (left > 0) {
|
while (left > 0) {
|
||||||
int rc;
|
int rc, err;
|
||||||
|
|
||||||
{
|
{
|
||||||
ObjectLock olock(this);
|
ObjectLock olock(this);
|
||||||
rc = SSL_read(m_SSL.get(), ((char *)buffer) + (count - left), left);
|
rc = SSL_read(m_SSL.get(), ((char *)buffer) + (count - left), left);
|
||||||
|
|
||||||
|
if (rc <= 0)
|
||||||
|
err = SSL_get_error(m_SSL.get(), rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc <= 0) {
|
if (rc <= 0) {
|
||||||
int err = SSL_get_error(m_SSL.get(), rc);
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case SSL_ERROR_WANT_READ:
|
case SSL_ERROR_WANT_READ:
|
||||||
m_Socket->Poll(true, false);
|
m_Socket->Poll(true, false);
|
||||||
|
@ -173,15 +174,17 @@ void TlsStream::Write(const void *buffer, size_t count)
|
||||||
size_t left = count;
|
size_t left = count;
|
||||||
|
|
||||||
while (left > 0) {
|
while (left > 0) {
|
||||||
int rc;
|
int rc, err;
|
||||||
|
|
||||||
{
|
{
|
||||||
ObjectLock olock(this);
|
ObjectLock olock(this);
|
||||||
rc = SSL_write(m_SSL.get(), ((const char *)buffer) + (count - left), left);
|
rc = SSL_write(m_SSL.get(), ((const char *)buffer) + (count - left), left);
|
||||||
|
|
||||||
|
if (rc <= 0)
|
||||||
|
err = SSL_get_error(m_SSL.get(), rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc <= 0) {
|
if (rc <= 0) {
|
||||||
int err = SSL_get_error(m_SSL.get(), rc);
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case SSL_ERROR_WANT_READ:
|
case SSL_ERROR_WANT_READ:
|
||||||
m_Socket->Poll(true, false);
|
m_Socket->Poll(true, false);
|
||||||
|
@ -208,6 +211,37 @@ void TlsStream::Write(const void *buffer, size_t count)
|
||||||
*/
|
*/
|
||||||
void TlsStream::Close(void)
|
void TlsStream::Close(void)
|
||||||
{
|
{
|
||||||
|
ASSERT(!OwnsLock());
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
int rc, err;
|
||||||
|
|
||||||
|
{
|
||||||
|
ObjectLock olock(this);
|
||||||
|
|
||||||
|
do {
|
||||||
|
rc = SSL_shutdown(m_SSL.get());
|
||||||
|
} while (rc == 0);
|
||||||
|
|
||||||
|
if (rc > 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
err = SSL_get_error(m_SSL.get(), rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (err) {
|
||||||
|
case SSL_ERROR_WANT_READ:
|
||||||
|
m_Socket->Poll(true, false);
|
||||||
|
continue;
|
||||||
|
case SSL_ERROR_WANT_WRITE:
|
||||||
|
m_Socket->Poll(false, true);
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
goto close_socket;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close_socket:
|
||||||
m_Socket->Close();
|
m_Socket->Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ Dictionary::Ptr JsonRpc::ReadMessage(const Stream::Ptr& stream)
|
||||||
{
|
{
|
||||||
String jsonString;
|
String jsonString;
|
||||||
if (!NetString::ReadStringFromStream(stream, &jsonString))
|
if (!NetString::ReadStringFromStream(stream, &jsonString))
|
||||||
BOOST_THROW_EXCEPTION(std::runtime_error("ReadStringFromStream signalled EOF."));
|
return Dictionary::Ptr();
|
||||||
|
|
||||||
//std::cerr << "<< " << jsonString << std::endl;
|
//std::cerr << "<< " << jsonString << std::endl;
|
||||||
Value value = JsonDeserialize(jsonString);
|
Value value = JsonDeserialize(jsonString);
|
||||||
|
|
Loading…
Reference in New Issue