mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-11-30 00:00:45 -05:00
added support for rubies between 2.1 and 2.5 (polyfills)
This commit is contained in:
parent
c64976971d
commit
c4811c01f8
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
require "httpx/version"
|
require "httpx/version"
|
||||||
|
|
||||||
|
require "httpx/extensions"
|
||||||
|
|
||||||
require "httpx/errors"
|
require "httpx/errors"
|
||||||
require "httpx/callbacks"
|
require "httpx/callbacks"
|
||||||
require "httpx/loggable"
|
require "httpx/loggable"
|
||||||
|
|||||||
33
lib/httpx/extensions.rb
Normal file
33
lib/httpx/extensions.rb
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
unless String.method_defined?(:+@)
|
||||||
|
# Backport for +"", to initialize unfrozen strings from the string literal.
|
||||||
|
#
|
||||||
|
module LiteralStringExtensions
|
||||||
|
def +@
|
||||||
|
frozen? ? dup : self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
String.__send__(:include, LiteralStringExtensions)
|
||||||
|
end
|
||||||
|
|
||||||
|
unless Numeric.method_defined?(:positive?)
|
||||||
|
# Ruby 2.3 Backport (Numeric#positive?)
|
||||||
|
#
|
||||||
|
module PosMethods
|
||||||
|
def positive?
|
||||||
|
self > 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Numeric.__send__(:include, PosMethods)
|
||||||
|
end
|
||||||
|
unless Numeric.method_defined?(:negative?)
|
||||||
|
# Ruby 2.3 Backport (Numeric#negative?)
|
||||||
|
#
|
||||||
|
module NegMethods
|
||||||
|
def negative?
|
||||||
|
self < 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Numeric.__send__(:include, NegMethods)
|
||||||
|
end
|
||||||
@ -139,9 +139,12 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
|
|
||||||
class SSL < TCP
|
class SSL < TCP
|
||||||
|
TLS_OPTIONS = OpenSSL::SSL::SSLContext.instance_methods.include?(:alpn_protocols) ?
|
||||||
|
{ alpn_protocols: %w[h2 http/1.1] } : {}
|
||||||
|
|
||||||
def initialize(_, _, options)
|
def initialize(_, _, options)
|
||||||
@ctx = OpenSSL::SSL::SSLContext.new
|
@ctx = OpenSSL::SSL::SSLContext.new
|
||||||
@ctx.set_params(options.ssl)
|
@ctx.set_params(TLS_OPTIONS.merge(options.ssl))
|
||||||
super
|
super
|
||||||
@state = :negotiated if @keep_open
|
@state = :negotiated if @keep_open
|
||||||
end
|
end
|
||||||
|
|||||||
@ -41,7 +41,7 @@ module HTTPX
|
|||||||
defaults = {
|
defaults = {
|
||||||
:debug => ENV.key?("HTTPX_DEBUG") ? $stderr : nil,
|
:debug => ENV.key?("HTTPX_DEBUG") ? $stderr : nil,
|
||||||
:debug_level => (ENV["HTTPX_DEBUG"] || 1).to_i,
|
:debug_level => (ENV["HTTPX_DEBUG"] || 1).to_i,
|
||||||
:ssl => { alpn_protocols: %w[h2 http/1.1] },
|
:ssl => {},
|
||||||
:http2_settings => { settings_enable_push: 0 },
|
:http2_settings => { settings_enable_push: 0 },
|
||||||
:fallback_protocol => "http/1.1",
|
:fallback_protocol => "http/1.1",
|
||||||
:timeout => Timeout.new,
|
:timeout => Timeout.new,
|
||||||
|
|||||||
@ -33,7 +33,8 @@ module HTTPX
|
|||||||
throw(:called)
|
throw(:called)
|
||||||
else
|
else
|
||||||
response = ErrorResponse.new("socks error: #{status}", 0)
|
response = ErrorResponse.new("socks error: #{status}", 0)
|
||||||
while (req, _ = @pending.shift)
|
until @pending.empty?
|
||||||
|
req, _ = @pending.shift
|
||||||
emit(:response, req, response)
|
emit(:response, req, response)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -89,7 +89,8 @@ module HTTPX
|
|||||||
|
|
||||||
def on_error_response(error)
|
def on_error_response(error)
|
||||||
response = ErrorResponse.new(error, 0)
|
response = ErrorResponse.new(error, 0)
|
||||||
while (req, _ = @pending.shift)
|
until @pending.empty?
|
||||||
|
req, _ = @pending.shift
|
||||||
emit(:response, req, response)
|
emit(:response, req, response)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -17,7 +17,9 @@ class HTTP2Test < HTTPTest
|
|||||||
include Plugins::FollowRedirects
|
include Plugins::FollowRedirects
|
||||||
include Plugins::Cookies
|
include Plugins::Cookies
|
||||||
include Plugins::Compression
|
include Plugins::Compression
|
||||||
include Plugins::PushPromise
|
if OpenSSL::SSL::SSLContext.instance_methods.include?(:alpn_protocols)
|
||||||
|
include Plugins::PushPromise
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|||||||
@ -65,7 +65,7 @@ class OptionsSpec < Minitest::Test
|
|||||||
:body_threshold_size => 114_688,
|
:body_threshold_size => 114_688,
|
||||||
:form => {:bar => "bar"},
|
:form => {:bar => "bar"},
|
||||||
:timeout => Timeout.new,
|
:timeout => Timeout.new,
|
||||||
:ssl => {:foo => "bar", :alpn_protocols => %w[h2 http/1.1] },
|
:ssl => {:foo => "bar" },
|
||||||
:http2_settings => { :settings_enable_push => 0 },
|
:http2_settings => { :settings_enable_push => 0 },
|
||||||
:fallback_protocol => "http/1.1",
|
:fallback_protocol => "http/1.1",
|
||||||
:headers => {"Foo" => "foo", "Accept" => "xml", "Bar" => "bar"},
|
:headers => {"Foo" => "foo", "Accept" => "xml", "Bar" => "bar"},
|
||||||
|
|||||||
@ -23,7 +23,7 @@ module Requests
|
|||||||
TCPSocket.new(uri.host, uri.port)
|
TCPSocket.new(uri.host, uri.port)
|
||||||
when "https"
|
when "https"
|
||||||
ctx = OpenSSL::SSL::SSLContext.new
|
ctx = OpenSSL::SSL::SSLContext.new
|
||||||
ctx.alpn_protocols = %w[h2 http/1.1]
|
ctx.alpn_protocols = %w[h2 http/1.1] if ctx.respond_to?(:alpn_protocols)
|
||||||
sock = OpenSSL::SSL::SSLSocket.new(TCPSocket.new(uri.host, uri.port), ctx)
|
sock = OpenSSL::SSL::SSLSocket.new(TCPSocket.new(uri.host, uri.port), ctx)
|
||||||
sock.hostname = uri.host
|
sock.hostname = uri.host
|
||||||
sock.sync_close = true
|
sock.sync_close = true
|
||||||
|
|||||||
@ -38,7 +38,7 @@ module Requests
|
|||||||
attr_reader :file
|
attr_reader :file
|
||||||
|
|
||||||
def initialize(response, **)
|
def initialize(response, **)
|
||||||
@file = Tempfile.new
|
@file = Tempfile.new("httpx-test")
|
||||||
end
|
end
|
||||||
|
|
||||||
def write(data)
|
def write(data)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user