Class Thrift::Socket
In: lib/thrift/transport/socket.rb
lib/thrift/transport/socket.rb
Parent: BaseTransport

Methods

close   close   new   new   open   open   open?   open?   read   read   to_io   to_io   write   write  

Attributes

handle  [RW] 
handle  [RW] 
timeout  [RW] 
timeout  [RW] 

Public Class methods

[Source]

    # File lib/thrift/transport/socket.rb, line 25
25:     def initialize(host='localhost', port=9090, timeout=nil)
26:       @host = host
27:       @port = port
28:       @timeout = timeout
29:       @desc = "#{host}:#{port}"
30:       @handle = nil
31:     end

[Source]

    # File lib/thrift/transport/socket.rb, line 25
25:     def initialize(host='localhost', port=9090, timeout=nil)
26:       @host = host
27:       @port = port
28:       @timeout = timeout
29:       @desc = "#{host}:#{port}"
30:       @handle = nil
31:     end

Public Instance methods

[Source]

     # File lib/thrift/transport/socket.rb, line 128
128:     def close
129:       @handle.close unless @handle.nil? or @handle.closed?
130:       @handle = nil
131:     end

[Source]

     # File lib/thrift/transport/socket.rb, line 128
128:     def close
129:       @handle.close unless @handle.nil? or @handle.closed?
130:       @handle = nil
131:     end

[Source]

    # File lib/thrift/transport/socket.rb, line 35
35:     def open
36:       begin
37:         addrinfo = ::Socket::getaddrinfo(@host, @port).first
38:         @handle = ::Socket.new(addrinfo[4], ::Socket::SOCK_STREAM, 0)
39:         sockaddr = ::Socket.sockaddr_in(addrinfo[1], addrinfo[3])
40:         begin
41:           @handle.connect_nonblock(sockaddr)
42:         rescue Errno::EINPROGRESS
43:           unless IO.select(nil, [ @handle ], nil, @timeout)
44:             raise TransportException.new(TransportException::NOT_OPEN, "Connection timeout to #{@desc}")
45:           end
46:           begin
47:             @handle.connect_nonblock(sockaddr)
48:           rescue Errno::EISCONN
49:           end
50:         end
51:         @handle
52:       rescue StandardError => e
53:         raise TransportException.new(TransportException::NOT_OPEN, "Could not connect to #{@desc}: #{e}")
54:       end
55:     end

[Source]

    # File lib/thrift/transport/socket.rb, line 35
35:     def open
36:       begin
37:         addrinfo = ::Socket::getaddrinfo(@host, @port).first
38:         @handle = ::Socket.new(addrinfo[4], ::Socket::SOCK_STREAM, 0)
39:         sockaddr = ::Socket.sockaddr_in(addrinfo[1], addrinfo[3])
40:         begin
41:           @handle.connect_nonblock(sockaddr)
42:         rescue Errno::EINPROGRESS
43:           unless IO.select(nil, [ @handle ], nil, @timeout)
44:             raise TransportException.new(TransportException::NOT_OPEN, "Connection timeout to #{@desc}")
45:           end
46:           begin
47:             @handle.connect_nonblock(sockaddr)
48:           rescue Errno::EISCONN
49:           end
50:         end
51:         @handle
52:       rescue StandardError => e
53:         raise TransportException.new(TransportException::NOT_OPEN, "Could not connect to #{@desc}: #{e}")
54:       end
55:     end

[Source]

    # File lib/thrift/transport/socket.rb, line 57
57:     def open?
58:       !@handle.nil? and !@handle.closed?
59:     end

[Source]

    # File lib/thrift/transport/socket.rb, line 57
57:     def open?
58:       !@handle.nil? and !@handle.closed?
59:     end

[Source]

     # File lib/thrift/transport/socket.rb, line 92
 92:     def read(sz)
 93:       raise IOError, "closed stream" unless open?
 94: 
 95:       begin
 96:         if @timeout.nil? or @timeout == 0
 97:           data = @handle.readpartial(sz)
 98:         else
 99:           # it's possible to interrupt select for something other than the timeout
100:           # so we need to ensure we've waited long enough, but not too long
101:           start = Time.now
102:           timespent = 0
103:           rd = loop do
104:             rd, = IO.select([@handle], nil, nil, @timeout - timespent)
105:             timespent = Time.now - start
106:             break rd if (rd and not rd.empty?) or timespent >= @timeout
107:           end
108:           if rd.nil? or rd.empty?
109:             raise TransportException.new(TransportException::TIMED_OUT, "Socket: Timed out reading #{sz} bytes from #{@desc}")
110:           else
111:             data = @handle.readpartial(sz)
112:           end
113:         end
114:       rescue TransportException => e
115:         # don't let this get caught by the StandardError handler
116:         raise e
117:       rescue StandardError => e
118:         @handle.close unless @handle.closed?
119:         @handle = nil
120:         raise TransportException.new(TransportException::NOT_OPEN, e.message)
121:       end
122:       if (data.nil? or data.length == 0)
123:         raise TransportException.new(TransportException::UNKNOWN, "Socket: Could not read #{sz} bytes from #{@desc}")
124:       end
125:       data
126:     end

[Source]

     # File lib/thrift/transport/socket.rb, line 92
 92:     def read(sz)
 93:       raise IOError, "closed stream" unless open?
 94: 
 95:       begin
 96:         if @timeout.nil? or @timeout == 0
 97:           data = @handle.readpartial(sz)
 98:         else
 99:           # it's possible to interrupt select for something other than the timeout
100:           # so we need to ensure we've waited long enough, but not too long
101:           start = Time.now
102:           timespent = 0
103:           rd = loop do
104:             rd, = IO.select([@handle], nil, nil, @timeout - timespent)
105:             timespent = Time.now - start
106:             break rd if (rd and not rd.empty?) or timespent >= @timeout
107:           end
108:           if rd.nil? or rd.empty?
109:             raise TransportException.new(TransportException::TIMED_OUT, "Socket: Timed out reading #{sz} bytes from #{@desc}")
110:           else
111:             data = @handle.readpartial(sz)
112:           end
113:         end
114:       rescue TransportException => e
115:         # don't let this get caught by the StandardError handler
116:         raise e
117:       rescue StandardError => e
118:         @handle.close unless @handle.closed?
119:         @handle = nil
120:         raise TransportException.new(TransportException::NOT_OPEN, e.message)
121:       end
122:       if (data.nil? or data.length == 0)
123:         raise TransportException.new(TransportException::UNKNOWN, "Socket: Could not read #{sz} bytes from #{@desc}")
124:       end
125:       data
126:     end

[Source]

     # File lib/thrift/transport/socket.rb, line 133
133:     def to_io
134:       @handle
135:     end

[Source]

     # File lib/thrift/transport/socket.rb, line 133
133:     def to_io
134:       @handle
135:     end

[Source]

    # File lib/thrift/transport/socket.rb, line 61
61:     def write(str)
62:       raise IOError, "closed stream" unless open?
63:       begin
64:         if @timeout.nil? or @timeout == 0
65:           @handle.write(str)
66:         else
67:           len = 0
68:           start = Time.now
69:           while Time.now - start < @timeout
70:             rd, wr, = IO.select(nil, [@handle], nil, @timeout)
71:             if wr and not wr.empty?
72:               len += @handle.write_nonblock(str[len..-1])
73:               break if len >= str.length
74:             end
75:           end
76:           if len < str.length
77:             raise TransportException.new(TransportException::TIMED_OUT, "Socket: Timed out writing #{str.length} bytes to #{@desc}")
78:           else
79:             len
80:           end
81:         end
82:       rescue TransportException => e
83:         # pass this on
84:         raise e
85:       rescue StandardError => e
86:         @handle.close
87:         @handle = nil
88:         raise TransportException.new(TransportException::NOT_OPEN, e.message)
89:       end
90:     end

[Source]

    # File lib/thrift/transport/socket.rb, line 61
61:     def write(str)
62:       raise IOError, "closed stream" unless open?
63:       begin
64:         if @timeout.nil? or @timeout == 0
65:           @handle.write(str)
66:         else
67:           len = 0
68:           start = Time.now
69:           while Time.now - start < @timeout
70:             rd, wr, = IO.select(nil, [@handle], nil, @timeout)
71:             if wr and not wr.empty?
72:               len += @handle.write_nonblock(str[len..-1])
73:               break if len >= str.length
74:             end
75:           end
76:           if len < str.length
77:             raise TransportException.new(TransportException::TIMED_OUT, "Socket: Timed out writing #{str.length} bytes to #{@desc}")
78:           else
79:             len
80:           end
81:         end
82:       rescue TransportException => e
83:         # pass this on
84:         raise e
85:       rescue StandardError => e
86:         @handle.close
87:         @handle = nil
88:         raise TransportException.new(TransportException::NOT_OPEN, e.message)
89:       end
90:     end

[Validate]