mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00

* [Feature #21347] Add `open_timeout` as an overall timeout option for `TCPSocket.new` With this change, `TCPSocket.new` now accepts the `open_timeout` option. This option raises an exception if the specified number of seconds has elapsed since the start of the method call, even if the operation is still in the middle of name resolution or connection attempts. The addition of this option follows the same intent as the previously merged change to `Socket.tcp`. [Feature #21347](https://bugs.ruby-lang.org/issues/21347) https://github.com/ruby/ruby/pull/13368 * Tidy up: Extract rsock_raise_user_specified_timeout() * Added a note to the documentation of `Socket.tcp` * Fix `rsock_init_inetsock` for `FAST_FALLBACK_INIT_INETSOCK_IMPL`
75 lines
1.7 KiB
C
75 lines
1.7 KiB
C
/************************************************
|
|
|
|
sockssocket.c -
|
|
|
|
created at: Thu Mar 31 12:21:29 JST 1994
|
|
|
|
Copyright (C) 1993-2007 Yukihiro Matsumoto
|
|
|
|
************************************************/
|
|
|
|
#include "rubysocket.h"
|
|
|
|
#ifdef SOCKS
|
|
/*
|
|
* call-seq:
|
|
* SOCKSSocket.new(host, port) => socket
|
|
*
|
|
* Opens a SOCKS connection to +host+ via the SOCKS server.
|
|
*
|
|
* The SOCKS server configuration varies by implementation
|
|
*
|
|
* When using the Dante libsocks/libsocksd implementation it is configured as SOCKS_SERVER env var.
|
|
*
|
|
* See: https://manpages.debian.org/testing/dante-client/socksify.1.en.html for full env variable support.
|
|
*
|
|
*/
|
|
static VALUE
|
|
socks_init(VALUE sock, VALUE host, VALUE port)
|
|
{
|
|
static int init = 0;
|
|
|
|
if (init == 0) {
|
|
char progname[] = "ruby";
|
|
SOCKSinit(progname);
|
|
init = 1;
|
|
}
|
|
|
|
return rsock_init_inetsock(sock, host, port, Qnil, Qnil, INET_SOCKS, Qnil, Qnil, Qnil, Qfalse, Qnil);
|
|
}
|
|
|
|
#ifdef SOCKS5
|
|
/*
|
|
* Closes the SOCKS connection.
|
|
*
|
|
*/
|
|
static VALUE
|
|
socks_s_close(VALUE sock)
|
|
{
|
|
rb_io_t *fptr;
|
|
|
|
GetOpenFile(sock, fptr);
|
|
shutdown(fptr->fd, SHUT_RDWR);
|
|
return rb_io_close(sock);
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
void
|
|
rsock_init_sockssocket(void)
|
|
{
|
|
#ifdef SOCKS
|
|
/*
|
|
* Document-class: SOCKSSocket < TCPSocket
|
|
*
|
|
* SOCKS is an Internet protocol that routes packets between a client and
|
|
* a server through a proxy server. SOCKS5, if supported, additionally
|
|
* provides authentication so only authorized users may access a server.
|
|
*/
|
|
rb_cSOCKSSocket = rb_define_class("SOCKSSocket", rb_cTCPSocket);
|
|
rb_define_method(rb_cSOCKSSocket, "initialize", socks_init, 2);
|
|
#ifdef SOCKS5
|
|
rb_define_method(rb_cSOCKSSocket, "close", socks_s_close, 0);
|
|
#endif
|
|
#endif
|
|
}
|