Merge:
io.sockets.secure.windows: use non-blocking sockets to prevent SSL_connect from blocking On Windows, SSL_connect may hang forever if the server doesn't send any data. To counteract that we temporarily set the socket non-blocking and then call select in the wait-for-fd method. Conflicts: basis/io/sockets/secure/openssl/openssl-tests.factordb4
parent
4d8f3e8a78
commit
f8387a08ae
|
@ -3,13 +3,13 @@
|
|||
USING: accessors alien alien.c-types alien.data alien.strings
|
||||
alien.syntax arrays assocs classes.struct combinators
|
||||
combinators.short-circuit continuations destructors environment
|
||||
io io.backend io.binary io.buffers io.encodings.utf16n io.files
|
||||
fry io io.backend io.binary io.buffers io.encodings.utf16n io.files
|
||||
io.files.private io.files.types io.pathnames io.ports
|
||||
io.streams.c io.streams.null io.timeouts kernel libc literals
|
||||
locals make math math.bitwise namespaces sequences
|
||||
specialized-arrays system threads tr windows windows.errors
|
||||
windows.handles windows.kernel32 windows.shell32 windows.time
|
||||
windows.types fry ;
|
||||
windows.types windows.winsock ;
|
||||
SPECIALIZED-ARRAY: ushort
|
||||
IN: io.files.windows
|
||||
|
||||
|
@ -206,8 +206,17 @@ M: windows (wait-to-write) ( port -- )
|
|||
M: windows (wait-to-read) ( port -- )
|
||||
[ dup handle>> refill ] with-destructors drop ;
|
||||
|
||||
: make-fd-set ( socket -- fd_set )
|
||||
fd_set <struct> swap 1array void* >c-array >>fd_array 1 >>fd_count ;
|
||||
|
||||
: select-sets ( socket event -- read-fds write-fds except-fds )
|
||||
[ make-fd-set ] dip +input+ = [ f f ] [ f swap f ] if ;
|
||||
|
||||
CONSTANT: select-timeval S{ timeval { sec 0 } { usec 1000 } }
|
||||
|
||||
M: windows wait-for-fd ( handle event -- )
|
||||
2drop ;
|
||||
[ file>> handle>> 1 swap ] dip select-sets select-timeval
|
||||
select drop yield ;
|
||||
|
||||
: console-app? ( -- ? ) GetConsoleWindow >boolean ;
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ kernel openssl.libcrypto openssl.libssl sequences system tools.test urls
|
|||
unix.ffi ;
|
||||
IN: io.sockets.secure.openssl.tests
|
||||
|
||||
<< os windows? [ "windows.winsock" ] [ "unix.ffi" ] if use-vocab >>
|
||||
|
||||
: new-ssl ( -- ssl )
|
||||
SSLv23_client_method SSL_CTX_new SSL_new ;
|
||||
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
USING:
|
||||
accessors
|
||||
alien
|
||||
io.ports
|
||||
io.sockets.private io.sockets.secure io.sockets.secure.openssl
|
||||
kernel
|
||||
openssl openssl.libcrypto openssl.libssl ;
|
||||
USING: accessors alien io.ports io.sockets.private io.sockets.secure
|
||||
io.sockets.secure.openssl io.sockets.windows kernel locals openssl
|
||||
openssl.libcrypto openssl.libssl windows.winsock ;
|
||||
IN: io.sockets.secure.windows
|
||||
|
||||
M: openssl ssl-supported? t ;
|
||||
|
@ -24,8 +20,9 @@ M: secure (get-local-address) ( handle remote -- sockaddr )
|
|||
|
||||
M: secure parse-sockaddr addrspec>> parse-sockaddr <secure> ;
|
||||
|
||||
M: secure establish-connection ( client-out remote -- )
|
||||
[
|
||||
[ handle>> file>> <output-port> ] [ addrspec>> ] bi* establish-connection
|
||||
]
|
||||
[ secure-connection ] 2bi ;
|
||||
M:: secure establish-connection ( client-out addrspec -- )
|
||||
client-out handle>> file>> :> socket
|
||||
socket FIONBIO 1 set-ioctl-socket
|
||||
socket <output-port> addrspec addrspec>> establish-connection
|
||||
client-out addrspec secure-connection
|
||||
socket FIONBIO 0 set-ioctl-socket ;
|
||||
|
|
|
@ -159,7 +159,9 @@ M: sockaddr-in sockaddr>ip ( sockaddr -- string )
|
|||
M: sockaddr-in6 sockaddr>ip ( uchar-array -- string )
|
||||
addr>> [ >hex ] { } map-as 2 group [ concat ] map ":" join ;
|
||||
|
||||
C-TYPE: fd_set
|
||||
STRUCT: fd_set
|
||||
{ fd_count uint }
|
||||
{ fd_array SOCKET[64] } ;
|
||||
|
||||
LIBRARY: winsock
|
||||
|
||||
|
|
Loading…
Reference in New Issue