Class: Jabber::Bytestreams::SOCKS5Bytestreams

Class | Jabber::Bytestreams::SOCKS5Bytestreams
In: | lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb
Parent: | Object

SOCKS5 Bytestreams (JEP-0065) implementation

Don‘t use directly, use SOCKS5BytestreamsInitiator and SOCKS5BytestreamsTarget

### Methods

add_streamhost_callback close flush new query_streamhost read write

### Attributes

connect_timeout | [RW] | SOCKS connection timeout (for trying multiple streamhosts) default: nil, use the OS’ default timeout
streamhost_used | [R] | StreamHost the SOCKS connection is using

### Public Class methods

new(stream, session_id, initiator_jid, target_jid)

[Source]

        # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 30
    30:       def initialize(stream, session_id, initiator_jid, target_jid)
    31:         @stream = stream
    32:         @session_id = session_id
    33:         @initiator_jid = (initiator_jid.kind_of?(String) ? JID.new(initiator_jid) : initiator_jid)
    34:         @target_jid = (target_jid.kind_of?(String) ? JID.new(target_jid) : target_jid)
    35:         @socks = nil
    36:         @connect_timeout = nil
    37:         @streamhost_used = nil
    38:         @streamhost_cbs = CallbackList.new
    39:       end

query_streamhost(stream, streamhost, my_jid=nil)

Query a JID for its stream-host information

SOCKS5BytestreamsInitiator#add_streamhost can do this for you. Use this method if you plan to do multiple transfers, so you can cache the result.

stream: | [Stream] to operate on
streamhost: | [JID] of the proxy
my_jid: | [JID] Optional sender JID for Component operation

[Source]

         # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 95
     95:       def self.query_streamhost(stream, streamhost, my_jid=nil)
     96:         res = nil
     97:
     98:         iq = Iq.new(:get, streamhost)
     99:         iq.from = my_jid
    100:         iq.add(IqQueryBytestreams.new)
    101:         stream.send_with_id(iq) { |reply|
    102:           reply.query.each_element { |e|
    103:             if e.kind_of?(StreamHost)
    104:               e.jid = reply.from  # Help misconfigured proxys
    105:               res = e
    106:             end
    107:           }
    108:         }
    109:
    110:         if res and res.jid and res.host and res.port
    111:           res
    112:         else
    113:           nil
    114:         end
    115:       end

### Public Instance methods

add_streamhost_callback(priority = 0, ref = nil, &block)

Add a callback that will be called when there is action regarding SOCKS stream-hosts

Usage of this callback is optional and serves informational purposes only.

block takes three arguments:

- The StreamHost instance that is currently being tried
- State information (is either :connecting, :authenticating, :success or :failure)
- The exception value for the state :failure, else nil

[Source]

        # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 51
    51:       def add_streamhost_callback(priority = 0, ref = nil, &block)
    52:         @streamhost_cbs.add(priority, ref, block)
    53:       end

close()

Close the stream-host connection

[Source]

        # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 82
    82:       def close
    83:         @socks.close
    84:       end

flush()

Flush the SOCKS5 socket

[Source]

        # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 65
    65:       def flush
    66:         @socks.flush
    67:       end

read(length=nil)

Receive from the stream-host

length: | [Fixnum] Amount of bytes (Will be passed to TCPSocket#read for the underlying SOCKS5 connection)
result: | [String] (or [nil] if finished)

[Source]

        # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 59
    59:       def read(length=nil)
    60:         @socks.read(length)
    61:       end

write(buf)

Send to the stream-host

buf: | [String] Data
result: | [Fixnum] Amount of bytes sent

[Source]

        # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 73
    73:       def write(buf)
    74:         @socks.write(buf)
    75:         # FIXME: On FreeBSD this throws Errno::EPERM after it has already written a few
    76:         # kilobytes, and when there are multiple sockets. ktrace told, that this originates
    77:         # from the syscall, not ruby.
    78:       end

[Validate]