Merge pull request #1746 from cowboy-coders/socket_close_clean
Fix close procedure in the net module
This commit is contained in:
commit
a58b4cfda7
2 changed files with 40 additions and 13 deletions
|
|
@ -256,7 +256,21 @@ proc socketError*(socket: Socket, err: int = -1, async = false,
|
||||||
else: raiseSSLError("Not enough data on socket.")
|
else: raiseSSLError("Not enough data on socket.")
|
||||||
of SSL_ERROR_WANT_X509_LOOKUP:
|
of SSL_ERROR_WANT_X509_LOOKUP:
|
||||||
raiseSSLError("Function for x509 lookup has been called.")
|
raiseSSLError("Function for x509 lookup has been called.")
|
||||||
of SSL_ERROR_SYSCALL, SSL_ERROR_SSL:
|
of SSL_ERROR_SYSCALL:
|
||||||
|
var errStr = "IO error has occured "
|
||||||
|
let sslErr = ErrPeekLastError()
|
||||||
|
if sslErr == 0 and err == 0:
|
||||||
|
errStr.add "because an EOF was observed that violates the protocol"
|
||||||
|
elif sslErr == 0 and err == -1:
|
||||||
|
errStr.add "in the BIO layer"
|
||||||
|
else:
|
||||||
|
let errStr = $ErrErrorString(sslErr, nil)
|
||||||
|
raiseSSLError(errStr & ": " & errStr)
|
||||||
|
let osMsg = osErrorMsg osLastError()
|
||||||
|
if osMsg != "":
|
||||||
|
errStr.add ". The OS reports: " & osMsg
|
||||||
|
raise newException(OSError, errStr)
|
||||||
|
of SSL_ERROR_SSL:
|
||||||
raiseSSLError()
|
raiseSSLError()
|
||||||
else: raiseSSLError("Unknown Error")
|
else: raiseSSLError("Unknown Error")
|
||||||
|
|
||||||
|
|
@ -418,15 +432,21 @@ proc accept*(server: Socket, client: var Socket,
|
||||||
|
|
||||||
proc close*(socket: Socket) =
|
proc close*(socket: Socket) =
|
||||||
## Closes a socket.
|
## Closes a socket.
|
||||||
socket.fd.close()
|
try:
|
||||||
when defined(ssl):
|
when defined(ssl):
|
||||||
if socket.isSSL:
|
if socket.isSSL:
|
||||||
let res = SSLShutdown(socket.sslHandle)
|
ErrClearError()
|
||||||
if res == 0:
|
# As we are closing the underlying socket immediately afterwards,
|
||||||
if SSLShutdown(socket.sslHandle) != 1:
|
# it is valid, under the TLS standard, to perform a unidirectional
|
||||||
socketError(socket)
|
# shutdown i.e not wait for the peers "close notify" alert with a second
|
||||||
elif res != 1:
|
# call to SSLShutdown
|
||||||
socketError(socket)
|
let res = SSLShutdown(socket.sslHandle)
|
||||||
|
if res == 0:
|
||||||
|
discard
|
||||||
|
elif res != 1:
|
||||||
|
socketError(socket, res)
|
||||||
|
finally:
|
||||||
|
socket.fd.close()
|
||||||
|
|
||||||
proc toCInt*(opt: SOBool): cint =
|
proc toCInt*(opt: SOBool): cint =
|
||||||
## Converts a ``SOBool`` into its Socket Option cint representation.
|
## Converts a ``SOBool`` into its Socket Option cint representation.
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,8 @@ type
|
||||||
{.deprecated: [PSSL: SslPtr, PSSL_CTX: SslCtx, PBIO: BIO].}
|
{.deprecated: [PSSL: SslPtr, PSSL_CTX: SslCtx, PBIO: BIO].}
|
||||||
|
|
||||||
const
|
const
|
||||||
|
SSL_SENT_SHUTDOWN* = 1
|
||||||
|
SSL_RECEIVED_SHUTDOWN* = 2
|
||||||
EVP_MAX_MD_SIZE* = 16 + 20
|
EVP_MAX_MD_SIZE* = 16 + 20
|
||||||
SSL_ERROR_NONE* = 0
|
SSL_ERROR_NONE* = 0
|
||||||
SSL_ERROR_SSL* = 1
|
SSL_ERROR_SSL* = 1
|
||||||
|
|
@ -233,6 +235,8 @@ proc SSL_CTX_check_private_key*(ctx: SslCtx): cInt{.cdecl, dynlib: DLLSSLName,
|
||||||
proc SSL_set_fd*(ssl: SslPtr, fd: SocketHandle): cint{.cdecl, dynlib: DLLSSLName, importc.}
|
proc SSL_set_fd*(ssl: SslPtr, fd: SocketHandle): cint{.cdecl, dynlib: DLLSSLName, importc.}
|
||||||
|
|
||||||
proc SSL_shutdown*(ssl: SslPtr): cInt{.cdecl, dynlib: DLLSSLName, importc.}
|
proc SSL_shutdown*(ssl: SslPtr): cInt{.cdecl, dynlib: DLLSSLName, importc.}
|
||||||
|
proc SSL_set_shutdown*(ssl: SslPtr, mode: cint) {.cdecl, dynlib: DLLSSLName, importc: "SSL_set_shutdown".}
|
||||||
|
proc SSL_get_shutdown*(ssl: SslPtr): cint {.cdecl, dynlib: DLLSSLName, importc: "SSL_get_shutdown".}
|
||||||
proc SSL_connect*(ssl: SslPtr): cint{.cdecl, dynlib: DLLSSLName, importc.}
|
proc SSL_connect*(ssl: SslPtr): cint{.cdecl, dynlib: DLLSSLName, importc.}
|
||||||
proc SSL_read*(ssl: SslPtr, buf: pointer, num: int): cint{.cdecl, dynlib: DLLSSLName, importc.}
|
proc SSL_read*(ssl: SslPtr, buf: pointer, num: int): cint{.cdecl, dynlib: DLLSSLName, importc.}
|
||||||
proc SSL_write*(ssl: SslPtr, buf: cstring, num: int): cint{.cdecl, dynlib: DLLSSLName, importc.}
|
proc SSL_write*(ssl: SslPtr, buf: cstring, num: int): cint{.cdecl, dynlib: DLLSSLName, importc.}
|
||||||
|
|
@ -314,6 +318,11 @@ proc sslDoHandshake*(ssl: SslPtr): cint {.cdecl,
|
||||||
dynlib: DLLSSLName, importc: "SSL_do_handshake".}
|
dynlib: DLLSSLName, importc: "SSL_do_handshake".}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
proc ErrClearError*(){.cdecl, dynlib: DLLUtilName, importc: "ERR_clear_error".}
|
||||||
|
proc ErrFreeStrings*(){.cdecl, dynlib: DLLUtilName, importc: "ERR_free_strings".}
|
||||||
|
proc ErrRemoveState*(pid: cInt){.cdecl, dynlib: DLLUtilName, importc: "ERR_remove_state".}
|
||||||
|
|
||||||
when true:
|
when true:
|
||||||
discard
|
discard
|
||||||
else:
|
else:
|
||||||
|
|
@ -414,9 +423,7 @@ else:
|
||||||
# function ErrErrorString(e: cInt; buf: PChar): PChar;
|
# function ErrErrorString(e: cInt; buf: PChar): PChar;
|
||||||
proc SSLeayversion*(t: cInt): cstring{.cdecl, dynlib: DLLUtilName, importc.}
|
proc SSLeayversion*(t: cInt): cstring{.cdecl, dynlib: DLLUtilName, importc.}
|
||||||
|
|
||||||
proc ErrClearError*(){.cdecl, dynlib: DLLUtilName, importc.}
|
|
||||||
proc ErrFreeStrings*(){.cdecl, dynlib: DLLUtilName, importc.}
|
|
||||||
proc ErrRemoveState*(pid: cInt){.cdecl, dynlib: DLLUtilName, importc.}
|
|
||||||
proc OPENSSLaddallalgorithms*(){.cdecl, dynlib: DLLUtilName, importc.}
|
proc OPENSSLaddallalgorithms*(){.cdecl, dynlib: DLLUtilName, importc.}
|
||||||
proc CRYPTOcleanupAllExData*(){.cdecl, dynlib: DLLUtilName, importc.}
|
proc CRYPTOcleanupAllExData*(){.cdecl, dynlib: DLLUtilName, importc.}
|
||||||
proc RandScreen*(){.cdecl, dynlib: DLLUtilName, importc.}
|
proc RandScreen*(){.cdecl, dynlib: DLLUtilName, importc.}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue