Sha256: 375e4d836456f4e73d4a7eb2c7d757665c346cd08e2ed875d4fb0f6f83f61ea9
Contents?: true
Size: 1.41 KB
Versions: 4
Compression:
Stored size: 1.41 KB
Contents
require "openssl" require "resolv" module Twitter module Streaming class Connection attr_reader :tcp_socket_class, :ssl_socket_class def initialize(options = {}) @tcp_socket_class = options.fetch(:tcp_socket_class) { TCPSocket } @ssl_socket_class = options.fetch(:ssl_socket_class) { OpenSSL::SSL::SSLSocket } @using_ssl = options.fetch(:using_ssl, false) @write_pipe = nil end def stream(request, response) # rubocop:disable Metrics/MethodLength client = connect(request) request.stream(client) read_pipe, @write_pipe = IO.pipe loop do read_ios, _write_ios, _exception_ios = IO.select([read_pipe, client]) case read_ios.first when client response << client.readpartial(1024) when read_pipe break end end client.close end def connect(request) client = new_tcp_socket(request.socket_host, request.socket_port) return client if !@using_ssl && request.using_proxy? client_context = OpenSSL::SSL::SSLContext.new ssl_client = @ssl_socket_class.new(client, client_context) ssl_client.connect end def close @write_pipe&.write("q") end private def new_tcp_socket(host, port) @tcp_socket_class.new(Resolv.getaddress(host), port) end end end end
Version data entries
4 entries across 4 versions & 1 rubygems