123456789_123456789_123456789_123456789_123456789_

Class: EventMachine::Protocols::Socks4

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Connection
Instance Chain:
self, Connection
Inherits: EventMachine::Connection
Defined in: lib/em/protocols/socks4.rb

Overview

Basic SOCKS v4 client implementation

Use as you would any regular connection:

class MyConn < EM::P::Socks4 def post_init send_data("sup") end

def receive_data(data) send_data("you said: #data") end end

EM.connect socks_host, socks_port, MyConn, host, port

Class Method Summary

Connection - Inherited

.new

Override .new so subclasses don't have to call super and can ignore connection-specific arguments.

Instance Attribute Summary

Connection - Inherited

#comm_inactivity_timeout

comm_inactivity_timeout returns the current value (float in seconds) of the inactivity-timeout property of network-connection and datagram-socket objects.

#comm_inactivity_timeout=

Allows you to set the inactivity-timeout property for a network connection or datagram socket.

#error?

Returns true if the connection is in an error state, false otherwise.

#notify_readable=

Watches connection for readability.

#notify_readable?,
#notify_writable=

Watches connection for writeability.

#notify_writable?

Returns true if the connection is being watched for writability.

#paused?,
#pending_connect_timeout

The duration after which a TCP connection in the connecting state will fail.

#pending_connect_timeout=

Sets the duration after which a TCP connection in a connecting state will fail.

#signature, #watch_only?

Instance Method Summary

Connection - Inherited

#associate_callback_target

conn_associate_callback_target.

#close_connection

EventMachine::Connection#close_connection is called only by user code, and never by the event loop.

#close_connection_after_writing
#connection_completed

Called by the event loop when a remote TCP connection attempt completes successfully.

#detach

Removes given connection from the event loop.

#disable_keepalive

t_disable_keepalive.

#enable_keepalive

t_enable_keepalive.

#get_cipher_bits, #get_cipher_name, #get_cipher_protocol,
#get_idle_time

The number of seconds since the last send/receive activity on this connection.

#get_outbound_data_size

conn_get_outbound_data_size.

#get_peer_cert

If TLS is active on the connection, returns the remote X509 certificate as a string, in the popular PEM format.

#get_peername

This method is used with stream-connections to obtain the identity of the remotely-connected peer.

#get_pid

Returns the PID (kernel process identifier) of a subprocess associated with this Connection object.

#get_proxied_bytes

The number of bytes proxied to another connection.

#get_sni_hostname, #get_sock_opt,
#get_sockname

Used with stream-connections to obtain the identity of the local side of the connection.

#get_status

Returns a subprocess exit status.

#initialize

Stubbed initialize so legacy superclasses can safely call super.

#original_method,
#pause

Pause a connection so that EventMachine#send_data and #receive_data events are not fired until #resume is called.

#post_init

Called by the event loop immediately after the network connection has been established, and before resumption of the network loop.

#proxy_completed

called when the reactor finished proxying all of the requested bytes.

#proxy_incoming_to

EventMachine::Connection#proxy_incoming_to is called only by user code.

#proxy_target_unbound

Called by the reactor after attempting to relay incoming data to a descriptor (set as a proxy target descriptor with EventMachine.enable_proxy) that has already been closed.

#receive_data

Called by the event loop whenever data has been received by the network connection.

#reconnect

Reconnect to a given host/port with the current instance.

#resume

Resume a connection's EventMachine#send_data and #receive_data events.

#send_data

Call this method to send data to the remote end of the network connection.

#send_datagram

Sends UDP messages.

#send_file_data

Like Connection#send_data, this sends data to the remote end of the network connection.

#set_sock_opt,
#ssl_handshake_completed

Called by ::EventMachine when the SSL/TLS handshake has been completed, as a result of calling #start_tls to initiate SSL/TLS on the connection.

#ssl_verify_peer

Called by ::EventMachine when :verify_peer => true has been passed to EventMachine#start_tls.

#start_tls

Call EventMachine#start_tls at any point to initiate TLS encryption on connected streams.

#stop_proxying

A helper method for EventMachine.disable_proxy

#stream_file_data

Open a file on the filesystem and send it to the remote peer.

#unbind

called by the framework whenever a connection (either a server or client connection) is closed.

Constructor Details

.new(host, port) ⇒ Socks4

[ GitHub ]

  
# File 'lib/em/protocols/socks4.rb', line 20

def initialize(host, port)
  @host = Socket.gethostbyname(host).last
  @port = port
  @socks_error_code = nil
  @buffer = ''
  setup_methods
end

Instance Method Details

#restore_methods

[ GitHub ]

  
# File 'lib/em/protocols/socks4.rb', line 35

def restore_methods
  class << self
    remove_method :post_init
    remove_method :receive_data
  end
end

#setup_methods

[ GitHub ]

  
# File 'lib/em/protocols/socks4.rb', line 28

def setup_methods
  class << self
    def post_init; socks_post_init; end
    def receive_data(*a); socks_receive_data(*a); end
  end
end

#socks_post_init

[ GitHub ]

  
# File 'lib/em/protocols/socks4.rb', line 42

def socks_post_init
  header = [4, 1, @port, @host, 0].flatten.pack("CCnA4C")
  send_data(header)
end

#socks_receive_data(data)

[ GitHub ]

  
# File 'lib/em/protocols/socks4.rb', line 47

def socks_receive_data(data)
  @buffer << data
  return  if @buffer.size < 8

  header_resp = @buffer.slice! 0, 8
  _, r = header_resp.unpack("cc")
  if r != 90
    @socks_error_code = r
    close_connection
    return
  end

  restore_methods

  post_init
  receive_data(@buffer)  unless @buffer.empty?
end