class Twitter::Streaming::Connection

Constants

MODIFIED

Attributes

ssl_socket_class[R]
tcp_socket_class[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/rbitter/override/gems/twitter/connection.rb, line 13
def initialize(options = {})
  @tcp_socket_class = options.fetch(:tcp_socket_class) { TCPSocket }
  @ssl_socket_class = options.fetch(:ssl_socket_class) { OpenSSL::SSL::SSLSocket }
end

Public Instance Methods

stream(request, response) click to toggle source
# File lib/rbitter/override/gems/twitter/connection.rb, line 18
def stream(request, response)
  client_context = OpenSSL::SSL::SSLContext.new
  client = @tcp_socket_class.new(
    Resolv.getaddress(request.uri.host),
    request.uri.port.nil? ? request.uri.default_port : request.uri.port)
  ssl_client = @ssl_socket_class.new(client, client_context)
  ssl_client.connect
  request.stream(ssl_client)

  loop {
    begin
      body = ssl_client.read_nonblock(1024) # rubocop:disable AssignmentInCondition, WhileUntilModifier
      response << body
    rescue IO::WaitReadable
      # The reason for setting 90 seconds as a timeout is documented on:
      # https://dev.twitter.com/streaming/overview/connecting
      r, w, e = IO.select([ssl_client], [], [], 90)
      if r.nil?
        # If timeout occurs
        ssl_client.close
        raise Twitter::Error::ServerError.new("Connection stalled")
      else
        # If socket is readable
        retry
      end
    end
  }
end