Sha256: 4f4182a991403b65d9556d3d9566341f83b46cbc2e23dc50f92cb54071f7ec47

Contents?: true

Size: 1.61 KB

Versions: 28

Compression:

Stored size: 1.61 KB

Contents

require "socket"

module GorgonBunny
  begin
    require "openssl"

    # TLS-enabled TCP socket that implements convenience
    # methods found in GorgonBunny::Socket.
    class SSLSocket < OpenSSL::SSL::SSLSocket

      # IO::WaitReadable is 1.9+ only
      READ_RETRY_EXCEPTION_CLASSES = [Errno::EAGAIN, Errno::EWOULDBLOCK]
      READ_RETRY_EXCEPTION_CLASSES << IO::WaitReadable if IO.const_defined?(:WaitReadable)


      # Reads given number of bytes with an optional timeout
      #
      # @param [Integer] count How many bytes to read
      # @param [Integer] timeout Timeout
      #
      # @return [String] Data read from the socket
      # @api public
      def read_fully(count, timeout = nil)
        return nil if @__bunny_socket_eof_flag__

        value = ''
        begin
          loop do
            value << read_nonblock(count - value.bytesize)
            break if value.bytesize >= count
          end
        rescue EOFError => e
          @__bunny_socket_eof_flag__ = true
        rescue OpenSSL::SSL::SSLError => e
          if e.message == "read would block"
            if IO.select([self], nil, nil, timeout)
              retry
            else
              raise Timeout::Error, "IO timeout when reading #{count} bytes"
            end
          else
            raise e
          end
        rescue *READ_RETRY_EXCEPTION_CLASSES => e
          if IO.select([self], nil, nil, timeout)
            retry
          else
            raise Timeout::Error, "IO timeout when reading #{count} bytes"
          end
        end
        value
      end
    end
  rescue LoadError => le
    puts "Could not load OpenSSL"
  end
end

Version data entries

28 entries across 28 versions & 1 rubygems

Version Path
gorgon-0.11.1 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.11.0 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.10.5 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.10.4 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.10.3 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.10.2 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.10.1 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.10.0 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.9.0 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.8.4 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.8.3 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.8.2 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.8.1 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.8.0 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.7.1 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.7.0 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.7.0.rc4 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.7.0.rc3 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.7.0.rc2 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb
gorgon-0.7.0.rc1 lib/gorgon_bunny/lib/gorgon_bunny/ssl_socket.rb