Class: Excon::Socket

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Utils
Defined in:
lib/excon/socket.rb

Direct Known Subclasses

SSLSocket, UnixSocket

Constant Summary collapse

CONNECT_RETRY_EXCEPTION_CLASSES =
if defined?(IO::EINPROGRESSWaitWritable) # Ruby >= 2.1
  [Errno::EINPROGRESS, IO::EINPROGRESSWaitWritable]
else # Ruby <= 2.0
  [Errno::EINPROGRESS]
end
READ_RETRY_EXCEPTION_CLASSES =

Ruby >= 2.1

if defined?(IO::EAGAINWaitReadable) # Ruby >= 2.1
  [Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable, IO::EAGAINWaitReadable, IO::EWOULDBLOCKWaitReadable]
else # Ruby <= 2.0
  [Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable]
end
WRITE_RETRY_EXCEPTION_CLASSES =

Ruby >= 2.1

if defined?(IO::EAGAINWaitWritable) # Ruby >= 2.1
  [Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable, IO::EAGAINWaitWritable, IO::EWOULDBLOCKWaitWritable]
else # Ruby <= 2.0
  [Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable]
end
OPERATION_TO_TIMEOUT =

Maps a socket operation to a timeout property.

{
  :connect_read => :connect_timeout,
  :connect_write => :connect_timeout,
  :read => :read_timeout,
  :write => :write_timeout
}.freeze

Constants included from Utils

Utils::CONTROL, Utils::DELIMS, Utils::ESCAPED, Utils::NONASCII, Utils::UNESCAPED, Utils::UNWISE

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utils

#binary_encode, #connection_uri, #escape_uri, #headers_hash_to_s, #port_string, #query_string, #redact, #request_uri, #split_header_value, #unescape_form, #unescape_uri

Constructor Details

#initialize(data = {}) ⇒ Socket

Returns a new instance of Socket.



51
52
53
54
55
56
57
58
59
# File 'lib/excon/socket.rb', line 51

def initialize(data = {})
  @data = data
  @nonblock = data[:nonblock]
  @port ||= @data[:port] || 80
  @read_buffer = String.new
  @eof = false
  @backend_eof = false
  connect
end

Instance Attribute Details

#dataObject

Returns the value of attribute data.



10
11
12
# File 'lib/excon/socket.rb', line 10

def data
  @data
end

#remote_ipObject (readonly)

Returns the value of attribute remote_ip.



46
47
48
# File 'lib/excon/socket.rb', line 46

def remote_ip
  @remote_ip
end

Instance Method Details

#local_addressObject



108
109
110
# File 'lib/excon/socket.rb', line 108

def local_address
  unpacked_sockaddr[1]
end

#local_portObject



112
113
114
# File 'lib/excon/socket.rb', line 112

def local_port
  unpacked_sockaddr[0]
end

#paramsObject



36
37
38
39
# File 'lib/excon/socket.rb', line 36

def params
  Excon.display_warning('Excon::Socket#params is deprecated use Excon::Socket#data instead.')
  @data
end

#params=(new_params) ⇒ Object



41
42
43
44
# File 'lib/excon/socket.rb', line 41

def params=(new_params)
  Excon.display_warning('Excon::Socket#params= is deprecated use Excon::Socket#data= instead.')
  @data = new_params
end

#read(max_length = nil) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/excon/socket.rb', line 61

def read(max_length = nil)
  if @eof
    return max_length ? nil : ''
  elsif @nonblock
    read_nonblock(max_length)
  else
    read_block(max_length)
  end
end

#readlineObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/excon/socket.rb', line 71

def readline
  if @nonblock
    result = String.new
    block = @read_buffer
    @read_buffer = String.new

    loop do
      idx = block.index("\n")
      if idx.nil?
        result << block
      else
        result << block.slice!(0, idx+1)
        add_to_read_buffer(block)
        break
      end
      block = read_nonblock(@data[:chunk_size]) || raise(EOFError)
    end
    result
  else # nonblock/legacy
    begin
      Timeout.timeout(@data[:read_timeout]) do
        @socket.readline
      end
    rescue Timeout::Error
      raise Excon::Errors::Timeout.new('read timeout reached')
    end
  end
end

#write(data) ⇒ Object



100
101
102
103
104
105
106
# File 'lib/excon/socket.rb', line 100

def write(data)
  if @nonblock
    write_nonblock(data)
  else
    write_block(data)
  end
end