From f7781f0fa078907012eaf0079102cb9971bfeda0 Mon Sep 17 00:00:00 2001 From: rylek Date: Tue, 22 Feb 2011 10:55:02 +0000 Subject: [PATCH] +Web: added extended three-parameter version of Socket::Data::SetSockError to facilitate error handling in SSL sockets; fixed end-of-file detection in SSLSocketData::Read git-svn-id: svn://ultimatepp.org/upp/trunk@3235 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Web/SSL/util.cpp | 43 ++++++++++++++++++++--------------------- uppsrc/Web/socket.cpp | 10 +++++++--- uppsrc/Web/socket.h | 5 +++-- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/uppsrc/Web/SSL/util.cpp b/uppsrc/Web/SSL/util.cpp index 9b8a70e49..085632587 100644 --- a/uppsrc/Web/SSL/util.cpp +++ b/uppsrc/Web/SSL/util.cpp @@ -373,7 +373,7 @@ void SSLSocketData::SetSSLError(const char *context) if(sock) { int code; String text = SSLGetLastError(code); - sock->SetSockError(socket, context, code, text); + SetSockError(context, code, text); } } @@ -382,25 +382,22 @@ void SSLSocketData::SetSSLResError(const char *context, int res) if(sock) { int code = SSL_get_error(ssl, res); String out; - switch(code) - { + switch(code) { #define SSLERR(c) case c: out = #c; break; - SSLERR(SSL_ERROR_NONE) - SSLERR(SSL_ERROR_SSL) - SSLERR(SSL_ERROR_WANT_READ) - SSLERR(SSL_ERROR_WANT_WRITE) - SSLERR(SSL_ERROR_WANT_X509_LOOKUP) - SSLERR(SSL_ERROR_SYSCALL) - SSLERR(SSL_ERROR_ZERO_RETURN) - SSLERR(SSL_ERROR_WANT_CONNECT) + SSLERR(SSL_ERROR_NONE) + SSLERR(SSL_ERROR_SSL) + SSLERR(SSL_ERROR_WANT_READ) + SSLERR(SSL_ERROR_WANT_WRITE) + SSLERR(SSL_ERROR_WANT_X509_LOOKUP) + SSLERR(SSL_ERROR_SYSCALL) + SSLERR(SSL_ERROR_ZERO_RETURN) + SSLERR(SSL_ERROR_WANT_CONNECT) #ifdef PLATFORM_WIN32 - SSLERR(SSL_ERROR_WANT_ACCEPT) + SSLERR(SSL_ERROR_WANT_ACCEPT) #endif - default: out = "unknown code"; break; + default: out = "unknown code"; break; } - out << " (" << code << ")"; - if(sock) - Socket::SetSockError(socket, context, code, out); + SetSockError(context, code, out); } } @@ -415,16 +412,18 @@ int SSLSocketData::Read(void *buf, int amount) { ASSERT(ssl); int res = SSL_read(ssl, (char *)buf, amount); + if(res == 0) { + is_eof = true; + if(SSL_get_shutdown(ssl) & SSL_RECEIVED_SHUTDOWN) + return 0; + } if(res <= 0) SetSSLResError("SSL_read", res); #ifndef NOFAKEERROR - if(fake_error && res > 0) - { - if((fake_error -= res) <= 0) - { + if(fake_error && res > 0) { + if((fake_error -= res) <= 0) { fake_error = 0; - if(sock) - sock->SetSockError(socket, "SSL_read", 1, "fake error"); + SetSockError("SSL_read", 0, "fake error"); return -1; } else diff --git a/uppsrc/Web/socket.cpp b/uppsrc/Web/socket.cpp index 00899da44..6e3782b3c 100644 --- a/uppsrc/Web/socket.cpp +++ b/uppsrc/Web/socket.cpp @@ -406,10 +406,14 @@ bool Socket::Data::Peek(int timeout_msec, bool write) return avail > 0; } -void Socket::Data::SetSockError(String context) +void Socket::Data::SetSockError(const String& context) +{ + int errorcode = Socket::GetErrorCode(); + SetSockError(context, errorcode, SocketErrorDesc(errorcode)); +} + +void Socket::Data::SetSockError(const String& context, int errorcode, const String& errordesc) { - int errorcode = Socket::GetErrorCode(); - String errordesc = SocketErrorDesc(Socket::GetErrorCode()); if(sock) sock->SetSockError(socket, context, errorcode, errordesc); } diff --git a/uppsrc/Web/socket.h b/uppsrc/Web/socket.h index 60712a37b..de63da6b5 100644 --- a/uppsrc/Web/socket.h +++ b/uppsrc/Web/socket.h @@ -55,9 +55,10 @@ public: protected: SOCKET AcceptRaw(dword *ipaddr, int timeout_msec); void Attach(SOCKET socket, bool nodelay, bool is_blocking); - void SetSockResError(String context); + void SetSockResError(const String& context); void AttachRaw(SOCKET s, bool blocking); - void SetSockError(String context); + void SetSockError(const String& context); + void SetSockError(const String& context, int code, const String& errortext); friend void AttachSocket(Socket& socket, SOCKET hsocket, bool blocking); };