diff --git a/ixwebsocket/IXSocket.h b/ixwebsocket/IXSocket.h index 88aca63c..8f33ee41 100644 --- a/ixwebsocket/IXSocket.h +++ b/ixwebsocket/IXSocket.h @@ -73,7 +73,7 @@ namespace ix virtual void close(); virtual ssize_t send(char* buffer, size_t length); - virtual ssize_t send(const std::string& buffer); + ssize_t send(const std::string& buffer); virtual ssize_t recv(void* buffer, size_t length); // Blocking and cancellable versions, working with socket that can be set diff --git a/ixwebsocket/IXSocketAppleSSL.cpp b/ixwebsocket/IXSocketAppleSSL.cpp index 13aa9022..ad557583 100644 --- a/ixwebsocket/IXSocketAppleSSL.cpp +++ b/ixwebsocket/IXSocketAppleSSL.cpp @@ -112,45 +112,10 @@ namespace ix OSStatus SocketAppleSSL::writeToSocket(SSLConnectionRef connection, const void* data, - size_t* dataLength) + size_t* len) { -#if 1 - int sock = (int) (long) connection; - if (sock < 0) return errSSLInternal; - - size_t bytesSent = 0; - - ssize_t length; - size_t dataLen = *dataLength; - const UInt8 *dataPtr = (UInt8 *)data; - OSStatus ortn; - int theErr; - - *dataLength = 0; - - do { - length = write(sock, - (char *)dataPtr + bytesSent, - dataLen - bytesSent); - } while((length > 0) && - ( (bytesSent += length) < dataLen) ); - - if(length <= 0) { - theErr = errno; - if(theErr == EAGAIN) { - ortn = errSSLWouldBlock; - } - else { - ortn = errSecIO; - } - } - else { - ortn = noErr; - } - *dataLength = bytesSent; - return ortn; - -#else + int fd = (int) (long) connection; + if (fd < 0) return errSSLInternal; assert(data != nullptr); assert(len != nullptr); @@ -190,7 +155,6 @@ namespace ix default: return errSecIO; } } -#endif } @@ -274,29 +238,31 @@ namespace ix ssize_t SocketAppleSSL::send(char* buf, size_t nbyte) { - std::lock_guard lock(_mutex); - - size_t processed = 0; - OSStatus status = SSLWrite(_sslContext, buf, nbyte, &processed); - - if (status == noErr) + OSStatus status = errSSLWouldBlock; + while (status == errSSLWouldBlock) { - return processed; - } - else if (status == errSSLWouldBlock) - { - errno = EWOULDBLOCK; - return -1; - } - else - { - return -1; - } - } + size_t processed = 0; + std::lock_guard lock(_mutex); + status = SSLWrite(_sslContext, buf, nbyte, &processed); - ssize_t SocketAppleSSL::send(const std::string& buffer) - { - return send((char*) &buffer[0], buffer.size()); + if (processed > 0) return (ssize_t) processed; + + // The connection was reset, inform the caller that this + // Socket should close + if (status == errSSLClosedGraceful || status == errSSLClosedNoNotify || + status == errSSLClosedAbort) + { + errno = ECONNRESET; + return -1; + } + + if (status == errSSLWouldBlock) + { + errno = EWOULDBLOCK; + return -1; + } + } + return -1; } // No wait support diff --git a/ixwebsocket/IXSocketAppleSSL.h b/ixwebsocket/IXSocketAppleSSL.h index 1dc91938..ef81b09a 100644 --- a/ixwebsocket/IXSocketAppleSSL.h +++ b/ixwebsocket/IXSocketAppleSSL.h @@ -30,7 +30,6 @@ namespace ix virtual void close() final; virtual ssize_t send(char* buffer, size_t length) final; - virtual ssize_t send(const std::string& buffer) final; virtual ssize_t recv(void* buffer, size_t length) final; private: diff --git a/ixwebsocket/IXSocketMbedTLS.cpp b/ixwebsocket/IXSocketMbedTLS.cpp index 4303943e..0077dba7 100644 --- a/ixwebsocket/IXSocketMbedTLS.cpp +++ b/ixwebsocket/IXSocketMbedTLS.cpp @@ -249,11 +249,6 @@ namespace ix } } - ssize_t SocketMbedTLS::send(const std::string& buffer) - { - return send((char*) &buffer[0], buffer.size()); - } - ssize_t SocketMbedTLS::recv(void* buf, size_t nbyte) { while (true) diff --git a/ixwebsocket/IXSocketMbedTLS.h b/ixwebsocket/IXSocketMbedTLS.h index 2bcadac1..ec761f63 100644 --- a/ixwebsocket/IXSocketMbedTLS.h +++ b/ixwebsocket/IXSocketMbedTLS.h @@ -35,7 +35,6 @@ namespace ix virtual void close() final; virtual ssize_t send(char* buffer, size_t length) final; - virtual ssize_t send(const std::string& buffer) final; virtual ssize_t recv(void* buffer, size_t length) final; private: diff --git a/ixwebsocket/IXSocketOpenSSL.cpp b/ixwebsocket/IXSocketOpenSSL.cpp index 5048a289..d73bc5d3 100644 --- a/ixwebsocket/IXSocketOpenSSL.cpp +++ b/ixwebsocket/IXSocketOpenSSL.cpp @@ -629,11 +629,6 @@ namespace ix } } - ssize_t SocketOpenSSL::send(const std::string& buffer) - { - return send((char*) &buffer[0], buffer.size()); - } - ssize_t SocketOpenSSL::recv(void* buf, size_t nbyte) { while (true) diff --git a/ixwebsocket/IXSocketOpenSSL.h b/ixwebsocket/IXSocketOpenSSL.h index dec75cd6..905a5a90 100644 --- a/ixwebsocket/IXSocketOpenSSL.h +++ b/ixwebsocket/IXSocketOpenSSL.h @@ -33,7 +33,6 @@ namespace ix virtual void close() final; virtual ssize_t send(char* buffer, size_t length) final; - virtual ssize_t send(const std::string& buffer) final; virtual ssize_t recv(void* buffer, size_t length) final; private: