ethon 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.travis.yml +13 -6
 - data/CHANGELOG.md +12 -1
 - data/Gemfile +11 -6
 - data/LICENSE +1 -1
 - data/README.md +1 -1
 - data/lib/ethon/curls/functions.rb +1 -0
 - data/lib/ethon/curls/options.rb +20 -17
 - data/lib/ethon/easy.rb +11 -0
 - data/lib/ethon/easy/operations.rb +9 -1
 - data/lib/ethon/easy/options.rb +12 -14
 - data/lib/ethon/version.rb +1 -1
 - data/profile/benchmarks.rb +51 -85
 - data/spec/ethon/easy/informations_spec.rb +1 -1
 - data/spec/ethon/easy/operations_spec.rb +2 -1
 - data/spec/ethon/easy_spec.rb +77 -0
 - data/spec/support/server.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 6fabe1040444c048c297b35b8785962b405cf22b
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 024c7e7ed7c3ef61dbbae1375b25626e1e5bbdf4
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 9e5e32e36f44d8f909d5d90e5a337959ced86643e16792e346fac504e6c53e34b548fae11a5f8334ac36b9594cbdeacc6c9fa2014a6ed73ed3e57a89a19e2801
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: f350cc872574938c24a4080dde53bd6fc97dbc78b30399bac1a9b5e68702f64920bc722ed53fa77dca41a4a3298b53955e151e1d19826be0d7a9a75c1733a316
         
     | 
    
        data/.travis.yml
    CHANGED
    
    | 
         @@ -1,19 +1,26 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            language: ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            cache: bundler
         
     | 
| 
       2 
3 
     | 
    
         
             
            sudo: false
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       3 
5 
     | 
    
         
             
            bundler_args: --without perf
         
     | 
| 
      
 6 
     | 
    
         
            +
            script: bundle exec rake
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
       4 
8 
     | 
    
         
             
            rvm:
         
     | 
| 
       5 
9 
     | 
    
         
             
              - 1.8.7
         
     | 
| 
       6 
10 
     | 
    
         
             
              - 1.9.2
         
     | 
| 
       7 
11 
     | 
    
         
             
              - 1.9.3
         
     | 
| 
       8 
     | 
    
         
            -
              - 2.0.0
         
     | 
| 
      
 12 
     | 
    
         
            +
              - 2.0.0-p648
         
     | 
| 
      
 13 
     | 
    
         
            +
              - 2.1.8
         
     | 
| 
      
 14 
     | 
    
         
            +
              - 2.2.4
         
     | 
| 
      
 15 
     | 
    
         
            +
              - 2.3.0
         
     | 
| 
       9 
16 
     | 
    
         
             
              - ruby-head
         
     | 
| 
       10 
17 
     | 
    
         
             
              - ree
         
     | 
| 
       11 
     | 
    
         
            -
              - jruby-head
         
     | 
| 
       12 
18 
     | 
    
         
             
              - jruby-18mode
         
     | 
| 
       13 
19 
     | 
    
         
             
              - jruby-19mode
         
     | 
| 
      
 20 
     | 
    
         
            +
              - jruby-head
         
     | 
| 
      
 21 
     | 
    
         
            +
              - rbx-2
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
       14 
23 
     | 
    
         
             
            matrix:
         
     | 
| 
       15 
24 
     | 
    
         
             
              allow_failures:
         
     | 
| 
      
 25 
     | 
    
         
            +
                - rvm: ree
         
     | 
| 
       16 
26 
     | 
    
         
             
                - rvm: ruby-head
         
     | 
| 
       17 
     | 
    
         
            -
                - rvm: jruby-head
         
     | 
| 
       18 
     | 
    
         
            -
                - rvm: rbx-18mode
         
     | 
| 
       19 
     | 
    
         
            -
                - rvm: rbx-19mode
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -2,10 +2,16 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            ## Master
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
            [Full Changelog](https://github.com/typhoeus/ethon/compare/v0. 
     | 
| 
      
 5 
     | 
    
         
            +
            [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.9.0...master)
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ## 0.9.0
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.8.1...v0.9.0)
         
     | 
| 
       6 
10 
     | 
    
         | 
| 
       7 
11 
     | 
    
         
             
            ## 0.8.1
         
     | 
| 
       8 
12 
     | 
    
         | 
| 
      
 13 
     | 
    
         
            +
            [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.8.0...v0.8.1)
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       9 
15 
     | 
    
         
             
            * Support optional escaping of params.
         
     | 
| 
       10 
16 
     | 
    
         
             
              ([Tasos Laskos](https://github.com/zapotek)
         
     | 
| 
       11 
17 
     | 
    
         
             
            * `Easy::Mirror`: Reduced object allocations and method calls during info handling.
         
     | 
| 
         @@ -13,6 +19,11 @@ 
     | 
|
| 
       13 
19 
     | 
    
         | 
| 
       14 
20 
     | 
    
         
             
            ## 0.8.0
         
     | 
| 
       15 
21 
     | 
    
         | 
| 
      
 22 
     | 
    
         
            +
            [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.3...v0.7.4)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            * `Easy::Mirror`: Reduced object allocations and method calls during info handling.
         
     | 
| 
      
 25 
     | 
    
         
            +
              ([Tasos Laskos](https://github.com/zapotek)
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
       16 
27 
     | 
    
         
             
            ## 0.7.4
         
     | 
| 
       17 
28 
     | 
    
         | 
| 
       18 
29 
     | 
    
         
             
            [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.7.3...v0.7.4)
         
     | 
    
        data/Gemfile
    CHANGED
    
    | 
         @@ -1,22 +1,27 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            source "https://rubygems.org"
         
     | 
| 
       2 
2 
     | 
    
         
             
            gemspec
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
      
 4 
     | 
    
         
            +
            if Gem.ruby_version < Gem::Version.new("1.9.3")
         
     | 
| 
      
 5 
     | 
    
         
            +
              gem "rake", "< 11"
         
     | 
| 
      
 6 
     | 
    
         
            +
            else
         
     | 
| 
      
 7 
     | 
    
         
            +
              gem "rake"
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
       5 
9 
     | 
    
         | 
| 
       6 
10 
     | 
    
         
             
            group :development, :test do
         
     | 
| 
       7 
     | 
    
         
            -
              gem "rspec", "~>  
     | 
| 
      
 11 
     | 
    
         
            +
              gem "rspec", "~> 3.4"
         
     | 
| 
       8 
12 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
              gem "sinatra" 
     | 
| 
      
 13 
     | 
    
         
            +
              gem "sinatra"
         
     | 
| 
       10 
14 
     | 
    
         
             
              gem "json"
         
     | 
| 
       11 
15 
     | 
    
         
             
              gem "mime-types", "~> 1.18"
         
     | 
| 
       12 
16 
     | 
    
         | 
| 
       13 
17 
     | 
    
         
             
              unless ENV["CI"]
         
     | 
| 
       14 
18 
     | 
    
         
             
                gem "guard-rspec", "~> 0.7"
         
     | 
| 
       15 
     | 
    
         
            -
                gem  
     | 
| 
      
 19 
     | 
    
         
            +
                gem "rb-fsevent", "~> 0.9.1"
         
     | 
| 
       16 
20 
     | 
    
         
             
              end
         
     | 
| 
       17 
21 
     | 
    
         
             
            end
         
     | 
| 
       18 
22 
     | 
    
         | 
| 
       19 
23 
     | 
    
         
             
            group :perf do
         
     | 
| 
       20 
     | 
    
         
            -
              gem " 
     | 
| 
       21 
     | 
    
         
            -
              gem " 
     | 
| 
      
 24 
     | 
    
         
            +
              gem "benchmark-ips"
         
     | 
| 
      
 25 
     | 
    
         
            +
              gem "patron"
         
     | 
| 
      
 26 
     | 
    
         
            +
              gem "curb"
         
     | 
| 
       22 
27 
     | 
    
         
             
            end
         
     | 
    
        data/LICENSE
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -71,7 +71,7 @@ everything up correctly. 
     | 
|
| 
       71 
71 
     | 
    
         | 
| 
       72 
72 
     | 
    
         
             
            (The MIT License)
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
            Copyright © 2012- 
     | 
| 
      
 74 
     | 
    
         
            +
            Copyright © 2012-2016 [Hans Hasselberg](http://www.hans.io)
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
            Permission is hereby granted, free of charge, to any person obtaining a
         
     | 
| 
       77 
77 
     | 
    
         
             
            copy of this software and associated documentation files (the "Software"),
         
     | 
| 
         @@ -25,6 +25,7 @@ module Ethon 
     | 
|
| 
       25 
25 
     | 
    
         
             
                    base.attach_function :easy_strerror,              :curl_easy_strerror,       [:easy_code],                   :string
         
     | 
| 
       26 
26 
     | 
    
         
             
                    base.attach_function :easy_escape,                :curl_easy_escape,         [:pointer, :pointer, :int],     :pointer
         
     | 
| 
       27 
27 
     | 
    
         
             
                    base.attach_function :easy_reset,                 :curl_easy_reset,          [:pointer],                     :void
         
     | 
| 
      
 28 
     | 
    
         
            +
                    base.attach_function :easy_duphandle,             :curl_easy_duphandle,      [:pointer],                     :pointer
         
     | 
| 
       28 
29 
     | 
    
         | 
| 
       29 
30 
     | 
    
         
             
                    base.attach_function :formadd,                    :curl_formadd,             [:pointer, :pointer, :varargs], :int
         
     | 
| 
       30 
31 
     | 
    
         
             
                    base.attach_function :formfree,                   :curl_formfree,            [:pointer],                     :void
         
     | 
    
        data/lib/ethon/curls/options.rb
    CHANGED
    
    | 
         @@ -5,10 +5,15 @@ module Ethon 
     | 
|
| 
       5 
5 
     | 
    
         
             
                # easy or multi interface.
         
     | 
| 
       6 
6 
     | 
    
         
             
                module Options
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
      
 8 
     | 
    
         
            +
                  OPTION_STRINGS = { :easy => 'easy_options', :multi => 'multi_options' }.freeze
         
     | 
| 
      
 9 
     | 
    
         
            +
                  FOPTION_STRINGS = { :easy => 'EASY_OPTIONS', :multi => 'MULTI_OPTIONS' }.freeze
         
     | 
| 
      
 10 
     | 
    
         
            +
                  FTYPES = [:long, :string, :ffipointer, :callback, :debug_callback, :off_t]
         
     | 
| 
      
 11 
     | 
    
         
            +
                  FUNCS = Hash[*[:easy, :multi].zip([:easy, :multi].map { |t| Hash[*FTYPES.zip(FTYPES.map { |ft| "#{t}_setopt_#{ft}" }).flatten] }).flatten]
         
     | 
| 
       8 
12 
     | 
    
         
             
                  # Sets appropriate option for easy, depending on value type.
         
     | 
| 
       9 
13 
     | 
    
         
             
                  def set_option(option, value, handle, type = :easy)
         
     | 
| 
       10 
     | 
    
         
            -
                     
     | 
| 
       11 
     | 
    
         
            -
                     
     | 
| 
      
 14 
     | 
    
         
            +
                    type = type.to_sym unless type.is_a?(Symbol)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    raise NameError, "Ethon::Curls::Options unknown type #{type}." unless respond_to?(OPTION_STRINGS[type])
         
     | 
| 
      
 16 
     | 
    
         
            +
                    opthash=send(OPTION_STRINGS[type], nil)
         
     | 
| 
       12 
17 
     | 
    
         
             
                    raise Errors::InvalidOption.new(option) unless opthash.include?(option)
         
     | 
| 
       13 
18 
     | 
    
         | 
| 
       14 
19 
     | 
    
         
             
                    case opthash[option][:type]
         
     | 
| 
         @@ -90,8 +95,7 @@ module Ethon 
     | 
|
| 
       90 
95 
     | 
    
         
             
                        tv=((value<0) ? value.abs-1 : value)
         
     | 
| 
       91 
96 
     | 
    
         
             
                        raise Errors::InvalidValue.new(option,value) unless tv<(1<<bits)
         
     | 
| 
       92 
97 
     | 
    
         
             
                    end
         
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
       94 
     | 
    
         
            -
                    send("#{type}_setopt_#{func}", handle, opthash[option][:opt], value)
         
     | 
| 
      
 98 
     | 
    
         
            +
                    send(FUNCS[type][func], handle, opthash[option][:opt], value)
         
     | 
| 
       95 
99 
     | 
    
         
             
                  end
         
     | 
| 
       96 
100 
     | 
    
         | 
| 
       97 
101 
     | 
    
         
             
                  OPTION_TYPE_BASE = {
         
     | 
| 
         @@ -174,25 +178,24 @@ module Ethon 
     | 
|
| 
       174 
178 
     | 
    
         
             
                    else
         
     | 
| 
       175 
179 
     | 
    
         
             
                      raise ArgumentError, "Ethon::Curls::Options #{ftype} #{name} Expected no opts." unless opts.nil?
         
     | 
| 
       176 
180 
     | 
    
         
             
                    end
         
     | 
| 
       177 
     | 
    
         
            -
             
     | 
| 
       178 
     | 
    
         
            -
                    opthash= 
     | 
| 
       179 
     | 
    
         
            -
             
     | 
| 
      
 181 
     | 
    
         
            +
                    opthash=const_get(FOPTION_STRINGS[ftype])
         
     | 
| 
      
 182 
     | 
    
         
            +
                    opthash[name] = { :type => type,
         
     | 
| 
      
 183 
     | 
    
         
            +
                                      :opt => OPTION_TYPE_BASE[OPTION_TYPE_MAP[type]] + num,
         
     | 
| 
      
 184 
     | 
    
         
            +
                                      :opts => opts }
         
     | 
| 
       180 
185 
     | 
    
         
             
                  end
         
     | 
| 
       181 
186 
     | 
    
         | 
| 
       182 
187 
     | 
    
         
             
                  def self.option_alias(ftype,name,*aliases)
         
     | 
| 
       183 
     | 
    
         
            -
                    opthash=const_get( 
     | 
| 
      
 188 
     | 
    
         
            +
                    opthash=const_get(FOPTION_STRINGS[ftype])
         
     | 
| 
       184 
189 
     | 
    
         
             
                    aliases.each { |a| opthash[a]=opthash[name] }
         
     | 
| 
       185 
190 
     | 
    
         
             
                  end
         
     | 
| 
       186 
191 
     | 
    
         | 
| 
       187 
192 
     | 
    
         
             
                  def self.option_type(type)
         
     | 
| 
       188 
     | 
    
         
            -
                    cname= 
     | 
| 
       189 
     | 
    
         
            -
                     
     | 
| 
       190 
     | 
    
         
            -
                     
     | 
| 
       191 
     | 
    
         
            -
                       
     | 
| 
       192 
     | 
    
         
            -
             
     | 
| 
       193 
     | 
    
         
            -
             
     | 
| 
       194 
     | 
    
         
            -
                      end
         
     | 
| 
       195 
     | 
    
         
            -
                    >
         
     | 
| 
      
 193 
     | 
    
         
            +
                    cname = FOPTION_STRINGS[type]
         
     | 
| 
      
 194 
     | 
    
         
            +
                    const_set(cname, {})
         
     | 
| 
      
 195 
     | 
    
         
            +
                    define_method(OPTION_STRINGS[type]) do |rt|
         
     | 
| 
      
 196 
     | 
    
         
            +
                      return Ethon::Curls::Options.const_get(cname).map { |k, v| [k, v[:opt]] } if rt == :enum
         
     | 
| 
      
 197 
     | 
    
         
            +
                      Ethon::Curls::Options.const_get(cname)
         
     | 
| 
      
 198 
     | 
    
         
            +
                    end
         
     | 
| 
       196 
199 
     | 
    
         
             
                  end
         
     | 
| 
       197 
200 
     | 
    
         | 
| 
       198 
201 
     | 
    
         
             
                  # Curl multi options, refer
         
     | 
| 
         @@ -415,7 +418,7 @@ module Ethon 
     | 
|
| 
       415 
418 
     | 
    
         
             
                  option_alias :easy, :keypasswd, :sslkeypasswd
         
     | 
| 
       416 
419 
     | 
    
         
             
                  option :easy, :sslengine, :string, 89
         
     | 
| 
       417 
420 
     | 
    
         
             
                  option :easy, :sslengine_default, :none, 90
         
     | 
| 
       418 
     | 
    
         
            -
                  option :easy, :sslversion, :enum, 32, [:default, :tlsv1, :sslv2, :sslv3]
         
     | 
| 
      
 421 
     | 
    
         
            +
                  option :easy, :sslversion, :enum, 32, [:default, :tlsv1, :sslv2, :sslv3, :tlsv1_0, :tlsv1_1, :tlsv1_2]
         
     | 
| 
       419 
422 
     | 
    
         
             
                  option :easy, :ssl_verifypeer, :bool, 64
         
     | 
| 
       420 
423 
     | 
    
         
             
                  option :easy, :cainfo, :string, 65
         
     | 
| 
       421 
424 
     | 
    
         
             
                  option :easy, :issuercert, :string, 170
         
     | 
    
        data/lib/ethon/easy.rb
    CHANGED
    
    | 
         @@ -259,6 +259,17 @@ module Ethon 
     | 
|
| 
       259 
259 
     | 
    
         
             
                  set_callbacks
         
     | 
| 
       260 
260 
     | 
    
         
             
                end
         
     | 
| 
       261 
261 
     | 
    
         | 
| 
      
 262 
     | 
    
         
            +
                # Clones libcurl session handle. This means that all options that is set in
         
     | 
| 
      
 263 
     | 
    
         
            +
                #   the current handle will be set on duplicated handle.
         
     | 
| 
      
 264 
     | 
    
         
            +
                def dup
         
     | 
| 
      
 265 
     | 
    
         
            +
                  e = super
         
     | 
| 
      
 266 
     | 
    
         
            +
                  e.handle = Curl.easy_duphandle(handle)
         
     | 
| 
      
 267 
     | 
    
         
            +
                  e.instance_variable_set(:@body_write_callback, nil)
         
     | 
| 
      
 268 
     | 
    
         
            +
                  e.instance_variable_set(:@header_write_callback, nil)
         
     | 
| 
      
 269 
     | 
    
         
            +
                  e.instance_variable_set(:@debug_callback, nil)
         
     | 
| 
      
 270 
     | 
    
         
            +
                  e.set_callbacks
         
     | 
| 
      
 271 
     | 
    
         
            +
                  e
         
     | 
| 
      
 272 
     | 
    
         
            +
                end
         
     | 
| 
       262 
273 
     | 
    
         
             
                # Url escapes the value.
         
     | 
| 
       263 
274 
     | 
    
         
             
                #
         
     | 
| 
       264 
275 
     | 
    
         
             
                # @example Url escape.
         
     | 
| 
         @@ -13,6 +13,12 @@ module Ethon 
     | 
|
| 
       13 
13 
     | 
    
         
             
                    @handle ||= FFI::AutoPointer.new(Curl.easy_init, Curl.method(:easy_cleanup))
         
     | 
| 
       14 
14 
     | 
    
         
             
                  end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
      
 16 
     | 
    
         
            +
                  # Sets a pointer to the curl easy handle.
         
     | 
| 
      
 17 
     | 
    
         
            +
                  # @param [ ::FFI::Pointer ] Easy handle that will be assigned.
         
     | 
| 
      
 18 
     | 
    
         
            +
                  def handle=(h)
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @handle = h
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
       16 
22 
     | 
    
         
             
                  # Perform the easy request.
         
     | 
| 
       17 
23 
     | 
    
         
             
                  #
         
     | 
| 
       18 
24 
     | 
    
         
             
                  # @example Perform the request.
         
     | 
| 
         @@ -21,7 +27,9 @@ module Ethon 
     | 
|
| 
       21 
27 
     | 
    
         
             
                  # @return [ Integer ] The return code.
         
     | 
| 
       22 
28 
     | 
    
         
             
                  def perform
         
     | 
| 
       23 
29 
     | 
    
         
             
                    @return_code = Curl.easy_perform(handle)
         
     | 
| 
       24 
     | 
    
         
            -
                    Ethon.logger. 
     | 
| 
      
 30 
     | 
    
         
            +
                    if Ethon.logger.level.zero?
         
     | 
| 
      
 31 
     | 
    
         
            +
                      Ethon.logger.debug { "ETHON: performed #{log_inspect}" }
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
       25 
33 
     | 
    
         
             
                    complete
         
     | 
| 
       26 
34 
     | 
    
         
             
                    @return_code
         
     | 
| 
       27 
35 
     | 
    
         
             
                  end
         
     | 
    
        data/lib/ethon/easy/options.rb
    CHANGED
    
    | 
         @@ -20,22 +20,20 @@ module Ethon 
     | 
|
| 
       20 
20 
     | 
    
         
             
                    @escape.nil? ? true : false
         
     | 
| 
       21 
21 
     | 
    
         
             
                  end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
                  Curl.easy_options.each do |opt,props|
         
     | 
| 
       24 
     | 
    
         
            -
                     
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 23 
     | 
    
         
            +
                  Curl.easy_options(nil).each do |opt, props|
         
     | 
| 
      
 24 
     | 
    
         
            +
                    method_name = "#{opt}=".freeze
         
     | 
| 
      
 25 
     | 
    
         
            +
                    unless method_defined? method_name
         
     | 
| 
      
 26 
     | 
    
         
            +
                      define_method(method_name) do |value|
         
     | 
| 
      
 27 
     | 
    
         
            +
                        Curl.set_option(opt, value, handle)
         
     | 
| 
       27 
28 
     | 
    
         
             
                        value
         
     | 
| 
       28 
29 
     | 
    
         
             
                      end
         
     | 
| 
       29 
     | 
    
         
            -
                     
     | 
| 
       30 
     | 
    
         
            -
                    if props[:type] 
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                          nil
         
     | 
| 
       37 
     | 
    
         
            -
                        end
         
     | 
| 
       38 
     | 
    
         
            -
                      > unless method_defined? opt.to_s
         
     | 
| 
      
 30 
     | 
    
         
            +
                    end
         
     | 
| 
      
 31 
     | 
    
         
            +
                    next if props[:type] != :callback || method_defined?(opt)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    define_method(opt) do |&block|
         
     | 
| 
      
 33 
     | 
    
         
            +
                      @procs ||= {}
         
     | 
| 
      
 34 
     | 
    
         
            +
                      @procs[opt.to_sym] = block
         
     | 
| 
      
 35 
     | 
    
         
            +
                      Curl.set_option(opt, block, handle)
         
     | 
| 
      
 36 
     | 
    
         
            +
                      nil
         
     | 
| 
       39 
37 
     | 
    
         
             
                    end
         
     | 
| 
       40 
38 
     | 
    
         
             
                  end
         
     | 
| 
       41 
39 
     | 
    
         
             
                end
         
     | 
    
        data/lib/ethon/version.rb
    CHANGED
    
    
    
        data/profile/benchmarks.rb
    CHANGED
    
    | 
         @@ -3,111 +3,79 @@ require 'ethon' 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require 'open-uri'
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'patron'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'curb'
         
     | 
| 
       6 
     | 
    
         
            -
            require  
     | 
| 
      
 6 
     | 
    
         
            +
            require 'net/http'
         
     | 
| 
       7 
7 
     | 
    
         
             
            require 'cgi'
         
     | 
| 
       8 
     | 
    
         
            -
            require 'benchmark'
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 8 
     | 
    
         
            +
            require 'benchmark/ips'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            require_relative '../spec/support/server'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require_relative '../spec/support/localhost_server'
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            LocalhostServer.new(TESTSERVER.new, 3000)
         
     | 
| 
      
 14 
     | 
    
         
            +
            LocalhostServer.new(TESTSERVER.new, 3001)
         
     | 
| 
      
 15 
     | 
    
         
            +
            LocalhostServer.new(TESTSERVER.new, 3002)
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            url = 'http://localhost:3000/'.freeze
         
     | 
| 
      
 18 
     | 
    
         
            +
            uri = URI.parse('http://localhost:3000/').freeze
         
     | 
| 
      
 19 
     | 
    
         
            +
            ethon = Ethon::Easy.new(url: url)
         
     | 
| 
      
 20 
     | 
    
         
            +
            patron = Patron::Session.new
         
     | 
| 
      
 21 
     | 
    
         
            +
            patron_url = Patron::Session.new(base_url: url)
         
     | 
| 
      
 22 
     | 
    
         
            +
            curb = Curl::Easy.new(url)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            puts '[Creation]'
         
     | 
| 
      
 25 
     | 
    
         
            +
            Benchmark.ips do |x|
         
     | 
| 
      
 26 
     | 
    
         
            +
              x.report('String.new') { '' }
         
     | 
| 
      
 27 
     | 
    
         
            +
              x.report('Easy.new') { Ethon::Easy.new }
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
       11 
29 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 30 
     | 
    
         
            +
            puts '[Escape]'
         
     | 
| 
      
 31 
     | 
    
         
            +
            Benchmark.ips do |x|
         
     | 
| 
      
 32 
     | 
    
         
            +
              x.report('CGI.escape') { CGI.escape("まつもと") }
         
     | 
| 
      
 33 
     | 
    
         
            +
              x.report('Easy.escape') { ethon.escape("まつもと") }
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
       14 
35 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 36 
     | 
    
         
            +
            puts '[Requests]'
         
     | 
| 
      
 37 
     | 
    
         
            +
            Benchmark.ips do |x|
         
     | 
| 
      
 38 
     | 
    
         
            +
              x.report('net/http') { Net::HTTP.get_response(uri) }
         
     | 
| 
      
 39 
     | 
    
         
            +
              x.report('open-uri') { open url }
         
     | 
| 
       18 
40 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                 
     | 
| 
      
 41 
     | 
    
         
            +
              x.report('patron') do
         
     | 
| 
      
 42 
     | 
    
         
            +
                patron.base_url = url
         
     | 
| 
      
 43 
     | 
    
         
            +
                patron.get('/')
         
     | 
| 
       22 
44 
     | 
    
         
             
              end
         
     | 
| 
       23 
45 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
               
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
              [100_000].each do |i|
         
     | 
| 
       27 
     | 
    
         
            -
                puts "[ #{i} Escapes]"
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                bm.report("CGI::escape       ") do
         
     | 
| 
       30 
     | 
    
         
            -
                  i.times { CGI::escape("まつもと") }
         
     | 
| 
       31 
     | 
    
         
            -
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
              x.report('patron reuse') { patron_url.get('/') }
         
     | 
| 
       32 
47 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
              x.report('curb') do
         
     | 
| 
      
 49 
     | 
    
         
            +
                curb.url = url
         
     | 
| 
      
 50 
     | 
    
         
            +
                curb.perform
         
     | 
| 
       37 
51 
     | 
    
         
             
              end
         
     | 
| 
       38 
52 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
               
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
              [1000].each do |i|
         
     | 
| 
       42 
     | 
    
         
            -
                puts "[ #{i} Requests]"
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                bm.report("net/http          ") do
         
     | 
| 
       45 
     | 
    
         
            -
                  uri = URI.parse("http://localhost:3001/")
         
     | 
| 
       46 
     | 
    
         
            -
                  i.times { Net::HTTP.get_response(uri) }
         
     | 
| 
       47 
     | 
    
         
            -
                end
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                bm.report("open-uri          ") do
         
     | 
| 
       50 
     | 
    
         
            -
                  i.times { open "http://localhost:3001/" }
         
     | 
| 
       51 
     | 
    
         
            -
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
              x.report('curb reuse') { curb.perform }
         
     | 
| 
       52 
54 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                    sess.base_url = "http://localhost:3001"
         
     | 
| 
       57 
     | 
    
         
            -
                    sess.get("/")
         
     | 
| 
       58 
     | 
    
         
            -
                  end
         
     | 
| 
       59 
     | 
    
         
            -
                end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                bm.report("patron reuse      ") do
         
     | 
| 
       62 
     | 
    
         
            -
                  sess = Patron::Session.new
         
     | 
| 
       63 
     | 
    
         
            -
                  sess.base_url = "http://localhost:3001"
         
     | 
| 
       64 
     | 
    
         
            -
                  i.times do
         
     | 
| 
       65 
     | 
    
         
            -
                    sess.get("/")
         
     | 
| 
       66 
     | 
    
         
            -
                  end
         
     | 
| 
       67 
     | 
    
         
            -
                end
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                bm.report("curb reuse        ") do
         
     | 
| 
       70 
     | 
    
         
            -
                  easy = Curl::Easy.new("http://localhost:3001")
         
     | 
| 
       71 
     | 
    
         
            -
                  i.times do
         
     | 
| 
       72 
     | 
    
         
            -
                    easy.perform
         
     | 
| 
       73 
     | 
    
         
            -
                  end
         
     | 
| 
       74 
     | 
    
         
            -
                end
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
                bm.report("Easy.perform      ") do
         
     | 
| 
       77 
     | 
    
         
            -
                  easy = Ethon::Easy.new
         
     | 
| 
       78 
     | 
    
         
            -
                  i.times do
         
     | 
| 
       79 
     | 
    
         
            -
                    easy.url = "http://localhost:3001/"
         
     | 
| 
       80 
     | 
    
         
            -
                    easy.prepare
         
     | 
| 
       81 
     | 
    
         
            -
                    easy.perform
         
     | 
| 
       82 
     | 
    
         
            -
                  end
         
     | 
| 
       83 
     | 
    
         
            -
                end
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
                bm.report("Easy.perform reuse") do
         
     | 
| 
       86 
     | 
    
         
            -
                  easy = Ethon::Easy.new
         
     | 
| 
       87 
     | 
    
         
            -
                  easy.url = "http://localhost:3001/"
         
     | 
| 
       88 
     | 
    
         
            -
                  easy.prepare
         
     | 
| 
       89 
     | 
    
         
            -
                  i.times { easy.perform }
         
     | 
| 
       90 
     | 
    
         
            -
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
              x.report('Easy.perform') do
         
     | 
| 
      
 56 
     | 
    
         
            +
                ethon.url = url
         
     | 
| 
      
 57 
     | 
    
         
            +
                ethon.perform
         
     | 
| 
       91 
58 
     | 
    
         
             
              end
         
     | 
| 
       92 
59 
     | 
    
         | 
| 
       93 
     | 
    
         
            -
               
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
              puts "[ 4 delayed Requests ]"
         
     | 
| 
      
 60 
     | 
    
         
            +
              x.report('Easy.perform reuse') { ethon.perform }
         
     | 
| 
      
 61 
     | 
    
         
            +
            end
         
     | 
| 
       96 
62 
     | 
    
         | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
      
 63 
     | 
    
         
            +
            puts "[ 4 delayed Requests ]"
         
     | 
| 
      
 64 
     | 
    
         
            +
            Benchmark.ips do |x|
         
     | 
| 
      
 65 
     | 
    
         
            +
              x.report('net/http') do
         
     | 
| 
       98 
66 
     | 
    
         
             
                3.times do |i|
         
     | 
| 
       99 
67 
     | 
    
         
             
                  uri = URI.parse("http://localhost:300#{i}/?delay=1")
         
     | 
| 
       100 
68 
     | 
    
         
             
                  Net::HTTP.get_response(uri)
         
     | 
| 
       101 
69 
     | 
    
         
             
                end
         
     | 
| 
       102 
70 
     | 
    
         
             
              end
         
     | 
| 
       103 
71 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
               
     | 
| 
      
 72 
     | 
    
         
            +
              x.report("open-uri") do
         
     | 
| 
       105 
73 
     | 
    
         
             
                3.times do |i|
         
     | 
| 
       106 
74 
     | 
    
         
             
                  open("http://localhost:300#{i}/?delay=1")
         
     | 
| 
       107 
75 
     | 
    
         
             
                end
         
     | 
| 
       108 
76 
     | 
    
         
             
              end
         
     | 
| 
       109 
77 
     | 
    
         | 
| 
       110 
     | 
    
         
            -
               
     | 
| 
      
 78 
     | 
    
         
            +
              x.report("patron") do
         
     | 
| 
       111 
79 
     | 
    
         
             
                sess = Patron::Session.new
         
     | 
| 
       112 
80 
     | 
    
         
             
                3.times do |i|
         
     | 
| 
       113 
81 
     | 
    
         
             
                  sess.base_url = "http://localhost:300#{i}/?delay=1"
         
     | 
| 
         @@ -115,21 +83,19 @@ Benchmark.bm do |bm| 
     | 
|
| 
       115 
83 
     | 
    
         
             
                end
         
     | 
| 
       116 
84 
     | 
    
         
             
              end
         
     | 
| 
       117 
85 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
               
     | 
| 
      
 86 
     | 
    
         
            +
              x.report("Easy.perform") do
         
     | 
| 
       119 
87 
     | 
    
         
             
                easy = Ethon::Easy.new
         
     | 
| 
       120 
88 
     | 
    
         
             
                3.times do |i|
         
     | 
| 
       121 
89 
     | 
    
         
             
                  easy.url = "http://localhost:300#{i}/?delay=1"
         
     | 
| 
       122 
     | 
    
         
            -
                  easy.prepare
         
     | 
| 
       123 
90 
     | 
    
         
             
                  easy.perform
         
     | 
| 
       124 
91 
     | 
    
         
             
                end
         
     | 
| 
       125 
92 
     | 
    
         
             
              end
         
     | 
| 
       126 
93 
     | 
    
         | 
| 
       127 
     | 
    
         
            -
               
     | 
| 
      
 94 
     | 
    
         
            +
              x.report("Multi.perform") do
         
     | 
| 
       128 
95 
     | 
    
         
             
                multi = Ethon::Multi.new
         
     | 
| 
       129 
96 
     | 
    
         
             
                3.times do |i|
         
     | 
| 
       130 
97 
     | 
    
         
             
                  easy = Ethon::Easy.new
         
     | 
| 
       131 
98 
     | 
    
         
             
                  easy.url = "http://localhost:300#{i}/?delay=1"
         
     | 
| 
       132 
     | 
    
         
            -
                  easy.prepare
         
     | 
| 
       133 
99 
     | 
    
         
             
                  multi.add(easy)
         
     | 
| 
       134 
100 
     | 
    
         
             
                end
         
     | 
| 
       135 
101 
     | 
    
         
             
                multi.perform
         
     | 
| 
         @@ -25,6 +25,7 @@ describe Ethon::Easy::Operations do 
     | 
|
| 
       25 
25 
     | 
    
         
             
                let(:password) { nil }
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
                before do
         
     | 
| 
      
 28 
     | 
    
         
            +
                  Ethon.logger.level = Logger::DEBUG
         
     | 
| 
       28 
29 
     | 
    
         
             
                  easy.url = url
         
     | 
| 
       29 
30 
     | 
    
         
             
                  easy.timeout = timeout
         
     | 
| 
       30 
31 
     | 
    
         
             
                  easy.connecttimeout = connect_timeout
         
     | 
| 
         @@ -51,7 +52,7 @@ describe Ethon::Easy::Operations do 
     | 
|
| 
       51 
52 
     | 
    
         
             
                end
         
     | 
| 
       52 
53 
     | 
    
         | 
| 
       53 
54 
     | 
    
         
             
                it "calls Curl.easy_cleanup" do
         
     | 
| 
       54 
     | 
    
         
            -
                  FFI::AutoPointer. 
     | 
| 
      
 55 
     | 
    
         
            +
                  expect_any_instance_of(FFI::AutoPointer).to receive(:free)
         
     | 
| 
       55 
56 
     | 
    
         
             
                  easy.cleanup
         
     | 
| 
       56 
57 
     | 
    
         
             
                end
         
     | 
| 
       57 
58 
     | 
    
         | 
    
        data/spec/ethon/easy_spec.rb
    CHANGED
    
    | 
         @@ -99,6 +99,83 @@ describe Ethon::Easy do 
     | 
|
| 
       99 
99 
     | 
    
         
             
                end
         
     | 
| 
       100 
100 
     | 
    
         
             
              end
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
      
 102 
     | 
    
         
            +
              describe "#dup" do
         
     | 
| 
      
 103 
     | 
    
         
            +
                let!(:easy) do
         
     | 
| 
      
 104 
     | 
    
         
            +
                  easy = Ethon::Easy.new
         
     | 
| 
      
 105 
     | 
    
         
            +
                  easy.url = "http://localhost:3001/"
         
     | 
| 
      
 106 
     | 
    
         
            +
                  easy.on_complete { 'on_complete' }
         
     | 
| 
      
 107 
     | 
    
         
            +
                  easy.on_headers { 'on_headers' }
         
     | 
| 
      
 108 
     | 
    
         
            +
                  easy.response_body = 'test_body'
         
     | 
| 
      
 109 
     | 
    
         
            +
                  easy.response_headers = 'test_headers'
         
     | 
| 
      
 110 
     | 
    
         
            +
                  easy
         
     | 
| 
      
 111 
     | 
    
         
            +
                end
         
     | 
| 
      
 112 
     | 
    
         
            +
                let!(:e) { easy.dup }
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                it "sets a new handle" do
         
     | 
| 
      
 115 
     | 
    
         
            +
                  expect(e.handle).not_to eq(easy.handle)
         
     | 
| 
      
 116 
     | 
    
         
            +
                end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
                it "preserves url" do
         
     | 
| 
      
 119 
     | 
    
         
            +
                  expect(e.url).to eq(easy.url)
         
     | 
| 
      
 120 
     | 
    
         
            +
                end
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
                it "preserves on_complete callback" do
         
     | 
| 
      
 123 
     | 
    
         
            +
                  expect(e.on_complete).to be(easy.on_complete)
         
     | 
| 
      
 124 
     | 
    
         
            +
                end
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
                it "preserves on_headers callback" do
         
     | 
| 
      
 127 
     | 
    
         
            +
                  expect(e.on_headers).to be(easy.on_headers)
         
     | 
| 
      
 128 
     | 
    
         
            +
                end
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                it 'preserves body_write_callback of original handle' do
         
     | 
| 
      
 131 
     | 
    
         
            +
                  expect { easy.perform }.to change { easy.response_body }
         
     | 
| 
      
 132 
     | 
    
         
            +
                  expect { easy.perform }.not_to change { e.response_body }
         
     | 
| 
      
 133 
     | 
    
         
            +
                end
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
                it 'sets new body_write_callback of duplicated handle' do
         
     | 
| 
      
 136 
     | 
    
         
            +
                  expect { e.perform }.to change { e.response_body }
         
     | 
| 
      
 137 
     | 
    
         
            +
                  expect { e.perform }.not_to change { easy.response_body }
         
     | 
| 
      
 138 
     | 
    
         
            +
                end
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
                it 'preserves headers_write_callback of original handle' do
         
     | 
| 
      
 141 
     | 
    
         
            +
                  expect { easy.perform }.to change { easy.response_headers }
         
     | 
| 
      
 142 
     | 
    
         
            +
                  expect { easy.perform }.not_to change { e.response_headers }
         
     | 
| 
      
 143 
     | 
    
         
            +
                end
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
                it 'sets new headers_write_callback of duplicated handle' do
         
     | 
| 
      
 146 
     | 
    
         
            +
                  expect { e.perform }.to change { e.response_headers }
         
     | 
| 
      
 147 
     | 
    
         
            +
                  expect { e.perform }.not_to change { easy.response_headers }
         
     | 
| 
      
 148 
     | 
    
         
            +
                end
         
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
                it "resets response_body" do
         
     | 
| 
      
 151 
     | 
    
         
            +
                  expect(e.response_body).to be_empty
         
     | 
| 
      
 152 
     | 
    
         
            +
                end
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
                it "resets response_headers" do
         
     | 
| 
      
 155 
     | 
    
         
            +
                  expect(e.response_headers).to be_empty
         
     | 
| 
      
 156 
     | 
    
         
            +
                end
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
                it "sets response_body for duplicated Easy" do
         
     | 
| 
      
 159 
     | 
    
         
            +
                  e.perform
         
     | 
| 
      
 160 
     | 
    
         
            +
                  expect(e.response_body).not_to be_empty
         
     | 
| 
      
 161 
     | 
    
         
            +
                end
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
                it "sets response_headers for duplicated Easy" do
         
     | 
| 
      
 164 
     | 
    
         
            +
                  e.perform
         
     | 
| 
      
 165 
     | 
    
         
            +
                  expect(e.response_headers).not_to be_empty
         
     | 
| 
      
 166 
     | 
    
         
            +
                end
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
                it "preserves response_body for original Easy" do
         
     | 
| 
      
 169 
     | 
    
         
            +
                  e.perform
         
     | 
| 
      
 170 
     | 
    
         
            +
                  expect(easy.response_body).to eq('test_body')
         
     | 
| 
      
 171 
     | 
    
         
            +
                end
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
                it "preserves response_headers for original Easy" do
         
     | 
| 
      
 174 
     | 
    
         
            +
                  e.perform
         
     | 
| 
      
 175 
     | 
    
         
            +
                  expect(easy.response_headers).to eq('test_headers')
         
     | 
| 
      
 176 
     | 
    
         
            +
                end
         
     | 
| 
      
 177 
     | 
    
         
            +
              end
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
       102 
179 
     | 
    
         
             
              describe "#mirror" do
         
     | 
| 
       103 
180 
     | 
    
         
             
                it "returns a Mirror" do
         
     | 
| 
       104 
181 
     | 
    
         
             
                  expect(easy.mirror).to be_a(Ethon::Easy::Mirror)
         
     | 
    
        data/spec/support/server.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: ethon
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.9.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Hans Hasselberg
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2016- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-04-28 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: ffi
         
     |