28 lines
872 B
Ruby
28 lines
872 B
Ruby
|
require 'http/parser'
|
||
|
require 'openssl'
|
||
|
require 'resolv'
|
||
|
|
||
|
module Twitter
|
||
|
module Streaming
|
||
|
class Connection
|
||
|
def initialize(opts = {})
|
||
|
@tcp_socket_class = opts.fetch(:tcp_socket_class) { TCPSocket }
|
||
|
@ssl_socket_class = opts.fetch(:ssl_socket_class) { OpenSSL::SSL::SSLSocket }
|
||
|
end
|
||
|
attr_reader :tcp_socket_class, :ssl_socket_class
|
||
|
|
||
|
def stream(request, response)
|
||
|
client_context = OpenSSL::SSL::SSLContext.new
|
||
|
client = @tcp_socket_class.new(Resolv.getaddress(request.uri.host), request.uri.port)
|
||
|
ssl_client = @ssl_socket_class.new(client, client_context)
|
||
|
|
||
|
ssl_client.connect
|
||
|
request.stream(ssl_client)
|
||
|
while body = ssl_client.readpartial(1024) # rubocop:disable AssignmentInCondition, WhileUntilModifier
|
||
|
response << body
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|