{
ASSERT(!OwnsLock());
- int rc;
-
for (;;) {
- int rc;
+ int rc, err;
{
ObjectLock olock(this);
rc = SSL_do_handshake(m_SSL.get());
- }
- if (rc > 0)
- break;
+ if (rc > 0)
+ break;
+
+ err = SSL_get_error(m_SSL.get(), rc);
+ }
- int err = SSL_get_error(m_SSL.get(), rc);
switch (err) {
case SSL_ERROR_WANT_READ:
m_Socket->Poll(true, false);
size_t left = count;
while (left > 0) {
- int rc;
+ int rc, err;
{
ObjectLock olock(this);
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) {
- int err = SSL_get_error(m_SSL.get(), rc);
switch (err) {
case SSL_ERROR_WANT_READ:
m_Socket->Poll(true, false);
size_t left = count;
while (left > 0) {
- int rc;
+ int rc, err;
{
ObjectLock olock(this);
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) {
- int err = SSL_get_error(m_SSL.get(), rc);
switch (err) {
case SSL_ERROR_WANT_READ:
m_Socket->Poll(true, false);
*/
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();
}
{
String jsonString;
if (!NetString::ReadStringFromStream(stream, &jsonString))
- BOOST_THROW_EXCEPTION(std::runtime_error("ReadStringFromStream signalled EOF."));
+ return Dictionary::Ptr();
//std::cerr << "<< " << jsonString << std::endl;
Value value = JsonDeserialize(jsonString);