Class: HTTPX::TCP

Inherits:
Object
  • Object
show all
Includes:
Loggable
Defined in:
lib/httpx/io/tcp.rb

Direct Known Subclasses

SSL, UNIX

Constant Summary

Constants included from Loggable

Loggable::COLORS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Loggable

#log

Constructor Details

#initialize(uri, addresses, options) ⇒ TCP



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/httpx/io/tcp.rb', line 16

def initialize(uri, addresses, options)
  @state = :idle
  @hostname = uri.host
  @addresses = addresses
  @ip_index = @addresses.size - 1
  @options = Options.new(options)
  @fallback_protocol = @options.fallback_protocol
  @port = uri.port
  if @options.io
    @io = case @options.io
          when Hash
            @ip = @addresses[@ip_index]
            @options.io[@ip] || @options.io["#{@ip}:#{@port}"]
          else
            @ip = @hostname
            @options.io
    end
    unless @io.nil?
      @keep_open = true
      @state = :connected
    end
  else
    @ip = @addresses[@ip_index]
  end
  @io ||= build_socket
end

Instance Attribute Details

#addressesObject (readonly)

Returns the value of attribute addresses.



12
13
14
# File 'lib/httpx/io/tcp.rb', line 12

def addresses
  @addresses
end

#ipObject (readonly) Also known as: host

Returns the value of attribute ip.



10
11
12
# File 'lib/httpx/io/tcp.rb', line 10

def ip
  @ip
end

#portObject (readonly)

Returns the value of attribute port.



10
11
12
# File 'lib/httpx/io/tcp.rb', line 10

def port
  @port
end

Instance Method Details

#closeObject



111
112
113
114
115
116
117
118
# File 'lib/httpx/io/tcp.rb', line 111

def close
  return if @keep_open || closed?
  begin
    @io.close
  ensure
    transition(:closed)
  end
end

#closed?Boolean



124
125
126
# File 'lib/httpx/io/tcp.rb', line 124

def closed?
  @state == :idle || @state == :closed
end

#connectObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/httpx/io/tcp.rb', line 55

def connect
  return unless closed?
  begin
    if @io.closed?
      transition(:idle)
      @io = build_socket
    end
    @io.connect_nonblock(Socket.sockaddr_in(@port, @ip.to_s))
  rescue Errno::EISCONN
  end
  transition(:connected)
rescue Errno::EHOSTUNREACH => e
  raise e if @ip_index <= 0
  @ip_index -= 1
  retry
rescue Errno::EINPROGRESS,
       Errno::EALREADY,
       ::IO::WaitReadable
end

#connected?Boolean



120
121
122
# File 'lib/httpx/io/tcp.rb', line 120

def connected?
  @state == :connected
end

#inspectObject



128
129
130
131
# File 'lib/httpx/io/tcp.rb', line 128

def inspect
  id = @io.closed? ? "closed" : @io.fileno
  "#<TCP(fd: #{id}): #{@ip}:#{@port} (state: #{@state})>"
end

#protocolObject



51
52
53
# File 'lib/httpx/io/tcp.rb', line 51

def protocol
  @fallback_protocol
end

#read(size, buffer) ⇒ Object



76
77
78
79
80
81
82
83
# File 'lib/httpx/io/tcp.rb', line 76

def read(size, buffer)
  @io.read_nonblock(size, buffer)
  buffer.bytesize
rescue ::IO::WaitReadable
  0
rescue EOFError
  nil
end

#schemeObject



43
44
45
# File 'lib/httpx/io/tcp.rb', line 43

def scheme
  "http"
end

#to_ioObject



47
48
49
# File 'lib/httpx/io/tcp.rb', line 47

def to_io
  @io.to_io
end

#write(buffer) ⇒ Object



85
86
87
88
89
90
91
92
93
# File 'lib/httpx/io/tcp.rb', line 85

def write(buffer)
  siz = @io.write_nonblock(buffer)
  buffer.slice!(0, siz)
  siz
rescue ::IO::WaitWritable
  0
rescue EOFError
  nil
end