rest-client 1.7.0.rc1-x86-mswin32
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.
Potentially problematic release.
This version of rest-client might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +1 -0
- data/.travis.yml +14 -0
- data/AUTHORS +81 -0
- data/Gemfile +11 -0
- data/LICENSE +21 -0
- data/README.rdoc +325 -0
- data/Rakefile +117 -0
- data/bin/restclient +93 -0
- data/history.md +166 -0
- data/lib/rest-client.rb +2 -0
- data/lib/rest_client.rb +2 -0
- data/lib/restclient.rb +164 -0
- data/lib/restclient/abstract_response.rb +106 -0
- data/lib/restclient/exceptions.rb +203 -0
- data/lib/restclient/payload.rb +240 -0
- data/lib/restclient/platform.rb +30 -0
- data/lib/restclient/raw_response.rb +34 -0
- data/lib/restclient/request.rb +582 -0
- data/lib/restclient/resource.rb +169 -0
- data/lib/restclient/response.rb +24 -0
- data/lib/restclient/version.rb +7 -0
- data/lib/restclient/windows.rb +8 -0
- data/lib/restclient/windows/root_certs.rb +105 -0
- data/rest-client.gemspec +30 -0
- data/rest-client.windows.gemspec +19 -0
- data/spec/integration/capath_digicert/244b5494.0 +19 -0
- data/spec/integration/capath_digicert/81b9768f.0 +19 -0
- data/spec/integration/capath_digicert/README +8 -0
- data/spec/integration/capath_digicert/digicert.crt +19 -0
- data/spec/integration/capath_verisign/415660c1.0 +14 -0
- data/spec/integration/capath_verisign/7651b327.0 +14 -0
- data/spec/integration/capath_verisign/README +8 -0
- data/spec/integration/capath_verisign/verisign.crt +14 -0
- data/spec/integration/certs/digicert.crt +19 -0
- data/spec/integration/certs/verisign.crt +14 -0
- data/spec/integration/integration_spec.rb +35 -0
- data/spec/integration/request_spec.rb +104 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/unit/abstract_response_spec.rb +85 -0
- data/spec/unit/exceptions_spec.rb +95 -0
- data/spec/unit/master_shake.jpg +0 -0
- data/spec/unit/payload_spec.rb +245 -0
- data/spec/unit/raw_response_spec.rb +17 -0
- data/spec/unit/request2_spec.rb +32 -0
- data/spec/unit/request_spec.rb +905 -0
- data/spec/unit/resource_spec.rb +133 -0
- data/spec/unit/response_spec.rb +166 -0
- data/spec/unit/restclient_spec.rb +79 -0
- data/spec/unit/windows/root_certs_spec.rb +22 -0
- metadata +241 -0
| @@ -0,0 +1,169 @@ | |
| 1 | 
            +
            module RestClient
         | 
| 2 | 
            +
              # A class that can be instantiated for access to a RESTful resource,
         | 
| 3 | 
            +
              # including authentication.
         | 
| 4 | 
            +
              #
         | 
| 5 | 
            +
              # Example:
         | 
| 6 | 
            +
              #
         | 
| 7 | 
            +
              #   resource = RestClient::Resource.new('http://some/resource')
         | 
| 8 | 
            +
              #   jpg = resource.get(:accept => 'image/jpg')
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              # With HTTP basic authentication:
         | 
| 11 | 
            +
              #
         | 
| 12 | 
            +
              #   resource = RestClient::Resource.new('http://protected/resource', :user => 'user', :password => 'password')
         | 
| 13 | 
            +
              #   resource.delete
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              # With a timeout (seconds):
         | 
| 16 | 
            +
              #
         | 
| 17 | 
            +
              #   RestClient::Resource.new('http://slow', :timeout => 10)
         | 
| 18 | 
            +
              #
         | 
| 19 | 
            +
              # With an open timeout (seconds):
         | 
| 20 | 
            +
              #
         | 
| 21 | 
            +
              #   RestClient::Resource.new('http://behindfirewall', :open_timeout => 10)
         | 
| 22 | 
            +
              #
         | 
| 23 | 
            +
              # You can also use resources to share common headers. For headers keys,
         | 
| 24 | 
            +
              # symbols are converted to strings. Example:
         | 
| 25 | 
            +
              #
         | 
| 26 | 
            +
              #   resource = RestClient::Resource.new('http://some/resource', :headers => { :client_version => 1 })
         | 
| 27 | 
            +
              #
         | 
| 28 | 
            +
              # This header will be transported as X-Client-Version (notice the X prefix,
         | 
| 29 | 
            +
              # capitalization and hyphens)
         | 
| 30 | 
            +
              #
         | 
| 31 | 
            +
              # Use the [] syntax to allocate subresources:
         | 
| 32 | 
            +
              #
         | 
| 33 | 
            +
              #   site = RestClient::Resource.new('http://example.com', :user => 'adam', :password => 'mypasswd')
         | 
| 34 | 
            +
              #   site['posts/1/comments'].post 'Good article.', :content_type => 'text/plain'
         | 
| 35 | 
            +
              #
         | 
| 36 | 
            +
              class Resource
         | 
| 37 | 
            +
                attr_reader :url, :options, :block
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def initialize(url, options={}, backwards_compatibility=nil, &block)
         | 
| 40 | 
            +
                  @url = url
         | 
| 41 | 
            +
                  @block = block
         | 
| 42 | 
            +
                  if options.class == Hash
         | 
| 43 | 
            +
                    @options = options
         | 
| 44 | 
            +
                  else # compatibility with previous versions
         | 
| 45 | 
            +
                    @options = { :user => options, :password => backwards_compatibility }
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def get(additional_headers={}, &block)
         | 
| 50 | 
            +
                  headers = (options[:headers] || {}).merge(additional_headers)
         | 
| 51 | 
            +
                  Request.execute(options.merge(
         | 
| 52 | 
            +
                          :method => :get,
         | 
| 53 | 
            +
                          :url => url,
         | 
| 54 | 
            +
                          :headers => headers), &(block || @block))
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                def head(additional_headers={}, &block)
         | 
| 58 | 
            +
                  headers = (options[:headers] || {}).merge(additional_headers)
         | 
| 59 | 
            +
                  Request.execute(options.merge(
         | 
| 60 | 
            +
                          :method => :head,
         | 
| 61 | 
            +
                          :url => url,
         | 
| 62 | 
            +
                          :headers => headers), &(block || @block))
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                def post(payload, additional_headers={}, &block)
         | 
| 66 | 
            +
                  headers = (options[:headers] || {}).merge(additional_headers)
         | 
| 67 | 
            +
                  Request.execute(options.merge(
         | 
| 68 | 
            +
                          :method => :post,
         | 
| 69 | 
            +
                          :url => url,
         | 
| 70 | 
            +
                          :payload => payload,
         | 
| 71 | 
            +
                          :headers => headers), &(block || @block))
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                def put(payload, additional_headers={}, &block)
         | 
| 75 | 
            +
                  headers = (options[:headers] || {}).merge(additional_headers)
         | 
| 76 | 
            +
                  Request.execute(options.merge(
         | 
| 77 | 
            +
                          :method => :put,
         | 
| 78 | 
            +
                          :url => url,
         | 
| 79 | 
            +
                          :payload => payload,
         | 
| 80 | 
            +
                          :headers => headers), &(block || @block))
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                def patch(payload, additional_headers={}, &block)
         | 
| 84 | 
            +
                  headers = (options[:headers] || {}).merge(additional_headers)
         | 
| 85 | 
            +
                  Request.execute(options.merge(
         | 
| 86 | 
            +
                          :method => :patch,
         | 
| 87 | 
            +
                          :url => url,
         | 
| 88 | 
            +
                          :payload => payload,
         | 
| 89 | 
            +
                          :headers => headers), &(block || @block))
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                def delete(additional_headers={}, &block)
         | 
| 93 | 
            +
                  headers = (options[:headers] || {}).merge(additional_headers)
         | 
| 94 | 
            +
                  Request.execute(options.merge(
         | 
| 95 | 
            +
                          :method => :delete,
         | 
| 96 | 
            +
                          :url => url,
         | 
| 97 | 
            +
                          :headers => headers), &(block || @block))
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                def to_s
         | 
| 101 | 
            +
                  url
         | 
| 102 | 
            +
                end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                def user
         | 
| 105 | 
            +
                  options[:user]
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                def password
         | 
| 109 | 
            +
                  options[:password]
         | 
| 110 | 
            +
                end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                def headers
         | 
| 113 | 
            +
                  options[:headers] || {}
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                def timeout
         | 
| 117 | 
            +
                  options[:timeout]
         | 
| 118 | 
            +
                end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                def open_timeout
         | 
| 121 | 
            +
                  options[:open_timeout]
         | 
| 122 | 
            +
                end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                # Construct a subresource, preserving authentication.
         | 
| 125 | 
            +
                #
         | 
| 126 | 
            +
                # Example:
         | 
| 127 | 
            +
                #
         | 
| 128 | 
            +
                #   site = RestClient::Resource.new('http://example.com', 'adam', 'mypasswd')
         | 
| 129 | 
            +
                #   site['posts/1/comments'].post 'Good article.', :content_type => 'text/plain'
         | 
| 130 | 
            +
                #
         | 
| 131 | 
            +
                # This is especially useful if you wish to define your site in one place and
         | 
| 132 | 
            +
                # call it in multiple locations:
         | 
| 133 | 
            +
                #
         | 
| 134 | 
            +
                #   def orders
         | 
| 135 | 
            +
                #     RestClient::Resource.new('http://example.com/orders', 'admin', 'mypasswd')
         | 
| 136 | 
            +
                #   end
         | 
| 137 | 
            +
                #
         | 
| 138 | 
            +
                #   orders.get                     # GET http://example.com/orders
         | 
| 139 | 
            +
                #   orders['1'].get                # GET http://example.com/orders/1
         | 
| 140 | 
            +
                #   orders['1/items'].delete       # DELETE http://example.com/orders/1/items
         | 
| 141 | 
            +
                #
         | 
| 142 | 
            +
                # Nest resources as far as you want:
         | 
| 143 | 
            +
                #
         | 
| 144 | 
            +
                #   site = RestClient::Resource.new('http://example.com')
         | 
| 145 | 
            +
                #   posts = site['posts']
         | 
| 146 | 
            +
                #   first_post = posts['1']
         | 
| 147 | 
            +
                #   comments = first_post['comments']
         | 
| 148 | 
            +
                #   comments.post 'Hello', :content_type => 'text/plain'
         | 
| 149 | 
            +
                #
         | 
| 150 | 
            +
                def [](suburl, &new_block)
         | 
| 151 | 
            +
                  case
         | 
| 152 | 
            +
                    when block_given? then self.class.new(concat_urls(url, suburl), options, &new_block)
         | 
| 153 | 
            +
                    when block        then self.class.new(concat_urls(url, suburl), options, &block)
         | 
| 154 | 
            +
                  else
         | 
| 155 | 
            +
                    self.class.new(concat_urls(url, suburl), options)
         | 
| 156 | 
            +
                  end
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                def concat_urls(url, suburl) # :nodoc:
         | 
| 160 | 
            +
                  url = url.to_s
         | 
| 161 | 
            +
                  suburl = suburl.to_s
         | 
| 162 | 
            +
                  if url.slice(-1, 1) == '/' or suburl.slice(0, 1) == '/'
         | 
| 163 | 
            +
                    url + suburl
         | 
| 164 | 
            +
                  else
         | 
| 165 | 
            +
                    "#{url}/#{suburl}"
         | 
| 166 | 
            +
                  end
         | 
| 167 | 
            +
                end
         | 
| 168 | 
            +
              end
         | 
| 169 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            module RestClient
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              # A Response from RestClient, you can access the response body, the code or the headers.
         | 
| 4 | 
            +
              #
         | 
| 5 | 
            +
              module Response
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                include AbstractResponse
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                attr_accessor :args, :net_http_res
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def body
         | 
| 12 | 
            +
                  self
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def Response.create body, net_http_res, args
         | 
| 16 | 
            +
                  result = body || ''
         | 
| 17 | 
            +
                  result.extend Response
         | 
| 18 | 
            +
                  result.net_http_res = net_http_res
         | 
| 19 | 
            +
                  result.args = args
         | 
| 20 | 
            +
                  result
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,105 @@ | |
| 1 | 
            +
            require 'openssl'
         | 
| 2 | 
            +
            require 'ffi'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # Adapted from Puppet, Copyright (c) Puppet Labs Inc,
         | 
| 5 | 
            +
            # licensed under the Apache License, Version 2.0.
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # https://github.com/puppetlabs/puppet/blob/bbe30e0a/lib/puppet/util/windows/root_certs.rb
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # Represents a collection of trusted root certificates.
         | 
| 10 | 
            +
            #
         | 
| 11 | 
            +
            # @api public
         | 
| 12 | 
            +
            class RestClient::Windows::RootCerts
         | 
| 13 | 
            +
              include Enumerable
         | 
| 14 | 
            +
              extend FFI::Library
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              typedef :ulong, :dword
         | 
| 17 | 
            +
              typedef :uintptr_t, :handle
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              def initialize(roots)
         | 
| 20 | 
            +
                @roots = roots
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              # Enumerates each root certificate.
         | 
| 24 | 
            +
              # @yieldparam cert [OpenSSL::X509::Certificate] each root certificate
         | 
| 25 | 
            +
              # @api public
         | 
| 26 | 
            +
              def each
         | 
| 27 | 
            +
                @roots.each {|cert| yield cert}
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              # Returns a new instance.
         | 
| 31 | 
            +
              # @return [RestClient::Windows::RootCerts] object constructed from current root certificates
         | 
| 32 | 
            +
              def self.instance
         | 
| 33 | 
            +
                new(self.load_certs)
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              # Returns an array of root certificates.
         | 
| 37 | 
            +
              #
         | 
| 38 | 
            +
              # @return [Array<[OpenSSL::X509::Certificate]>] an array of root certificates
         | 
| 39 | 
            +
              # @api private
         | 
| 40 | 
            +
              def self.load_certs
         | 
| 41 | 
            +
                certs = []
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                # This is based on a patch submitted to openssl:
         | 
| 44 | 
            +
                # http://www.mail-archive.com/openssl-dev@openssl.org/msg26958.html
         | 
| 45 | 
            +
                ptr = FFI::Pointer::NULL
         | 
| 46 | 
            +
                store = CertOpenSystemStoreA(nil, "ROOT")
         | 
| 47 | 
            +
                begin
         | 
| 48 | 
            +
                  while (ptr = CertEnumCertificatesInStore(store, ptr)) and not ptr.null?
         | 
| 49 | 
            +
                    context = CERT_CONTEXT.new(ptr)
         | 
| 50 | 
            +
                    cert_buf = context[:pbCertEncoded].read_bytes(context[:cbCertEncoded])
         | 
| 51 | 
            +
                    begin
         | 
| 52 | 
            +
                      certs << OpenSSL::X509::Certificate.new(cert_buf)
         | 
| 53 | 
            +
                    rescue => detail
         | 
| 54 | 
            +
                      warn("Failed to import root certificate: #{detail.inspect}")
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
                ensure
         | 
| 58 | 
            +
                  CertCloseStore(store, 0)
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                certs
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              private
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              # typedef ULONG_PTR HCRYPTPROV_LEGACY;
         | 
| 67 | 
            +
              # typedef void *HCERTSTORE;
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              class CERT_CONTEXT < FFI::Struct
         | 
| 70 | 
            +
                layout(
         | 
| 71 | 
            +
                  :dwCertEncodingType, :dword,
         | 
| 72 | 
            +
                  :pbCertEncoded,      :pointer,
         | 
| 73 | 
            +
                  :cbCertEncoded,      :dword,
         | 
| 74 | 
            +
                  :pCertInfo,          :pointer,
         | 
| 75 | 
            +
                  :hCertStore,         :handle
         | 
| 76 | 
            +
                )
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              # HCERTSTORE
         | 
| 80 | 
            +
              # WINAPI
         | 
| 81 | 
            +
              # CertOpenSystemStoreA(
         | 
| 82 | 
            +
              #   __in_opt HCRYPTPROV_LEGACY hProv,
         | 
| 83 | 
            +
              #   __in LPCSTR szSubsystemProtocol
         | 
| 84 | 
            +
              #   );
         | 
| 85 | 
            +
              ffi_lib :crypt32
         | 
| 86 | 
            +
              attach_function :CertOpenSystemStoreA, [:pointer, :string], :handle
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              # PCCERT_CONTEXT
         | 
| 89 | 
            +
              # WINAPI
         | 
| 90 | 
            +
              # CertEnumCertificatesInStore(
         | 
| 91 | 
            +
              #   __in HCERTSTORE hCertStore,
         | 
| 92 | 
            +
              #   __in_opt PCCERT_CONTEXT pPrevCertContext
         | 
| 93 | 
            +
              #   );
         | 
| 94 | 
            +
              ffi_lib :crypt32
         | 
| 95 | 
            +
              attach_function :CertEnumCertificatesInStore, [:handle, :pointer], :pointer
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              # BOOL
         | 
| 98 | 
            +
              # WINAPI
         | 
| 99 | 
            +
              # CertCloseStore(
         | 
| 100 | 
            +
              #   __in_opt HCERTSTORE hCertStore,
         | 
| 101 | 
            +
              #   __in DWORD dwFlags
         | 
| 102 | 
            +
              #   );
         | 
| 103 | 
            +
              ffi_lib :crypt32
         | 
| 104 | 
            +
              attach_function :CertCloseStore, [:handle, :dword], :bool
         | 
| 105 | 
            +
            end
         | 
    
        data/rest-client.gemspec
    ADDED
    
    | @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require File.expand_path('../lib/restclient/version', __FILE__)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Gem::Specification.new do |s|
         | 
| 6 | 
            +
              s.name = 'rest-client'
         | 
| 7 | 
            +
              s.version = RestClient::VERSION
         | 
| 8 | 
            +
              s.authors = ['REST Client Team']
         | 
| 9 | 
            +
              s.description = 'A simple HTTP and REST client for Ruby, inspired by the Sinatra microframework style of specifying actions: get, put, post, delete.'
         | 
| 10 | 
            +
              s.license = 'MIT'
         | 
| 11 | 
            +
              s.email = 'rest.client@librelist.com'
         | 
| 12 | 
            +
              s.executables = ['restclient']
         | 
| 13 | 
            +
              s.extra_rdoc_files = ['README.rdoc', 'history.md']
         | 
| 14 | 
            +
              s.files = `git ls-files -z`.split("\0")
         | 
| 15 | 
            +
              s.test_files = `git ls-files -z spec/`.split("\0")
         | 
| 16 | 
            +
              s.homepage = 'https://github.com/rest-client/rest-client'
         | 
| 17 | 
            +
              s.summary = 'Simple HTTP and REST client for Ruby, inspired by microframework syntax for specifying actions.'
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              s.add_development_dependency('webmock', '~> 1.4')
         | 
| 20 | 
            +
              s.add_development_dependency('rspec', '~> 2.4')
         | 
| 21 | 
            +
              s.add_development_dependency('pry')
         | 
| 22 | 
            +
              s.add_development_dependency('pry-doc')
         | 
| 23 | 
            +
              s.add_development_dependency('rdoc', '>= 2.4.2', '< 5.0')
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              s.add_dependency('mime-types', '~> 2.0')
         | 
| 26 | 
            +
              s.add_dependency('netrc', '~> 0.7')
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              s.required_ruby_version = '>= 1.9.2'
         | 
| 29 | 
            +
            end
         | 
| 30 | 
            +
             | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            #
         | 
| 2 | 
            +
            # Gemspec for Windows platforms. We can't put these in the main gemspec because
         | 
| 3 | 
            +
            # it results in bundler platform hell when trying to build the gem.
         | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            # Set $BUILD_PLATFORM when calling gem build with this gemspec to build for
         | 
| 6 | 
            +
            # Windows platforms like x86-mingw32.
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            s = eval(File.read(File.join(File.dirname(__FILE__), 'rest-client.gemspec')))
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            platform = ENV['BUILD_PLATFORM'] || RUBY_PLATFORM
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            case platform
         | 
| 13 | 
            +
            when /(mingw32|mswin32)/
         | 
| 14 | 
            +
              # ffi is needed for RestClient::Windows::RootCerts
         | 
| 15 | 
            +
              s.add_dependency('ffi', '~> 1.9')
         | 
| 16 | 
            +
              s.platform = platform
         | 
| 17 | 
            +
            end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            s
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            -----BEGIN CERTIFICATE-----
         | 
| 2 | 
            +
            MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
         | 
| 3 | 
            +
            EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
         | 
| 4 | 
            +
            KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
         | 
| 5 | 
            +
            MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
         | 
| 6 | 
            +
            MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
         | 
| 7 | 
            +
            Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
         | 
| 8 | 
            +
            Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
         | 
| 9 | 
            +
            OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
         | 
| 10 | 
            +
            MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
         | 
| 11 | 
            +
            NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
         | 
| 12 | 
            +
            h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
         | 
| 13 | 
            +
            Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
         | 
| 14 | 
            +
            JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
         | 
| 15 | 
            +
            V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
         | 
| 16 | 
            +
            myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
         | 
| 17 | 
            +
            mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
         | 
| 18 | 
            +
            vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
         | 
| 19 | 
            +
            -----END CERTIFICATE-----
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            -----BEGIN CERTIFICATE-----
         | 
| 2 | 
            +
            MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
         | 
| 3 | 
            +
            EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
         | 
| 4 | 
            +
            KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
         | 
| 5 | 
            +
            MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
         | 
| 6 | 
            +
            MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
         | 
| 7 | 
            +
            Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
         | 
| 8 | 
            +
            Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
         | 
| 9 | 
            +
            OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
         | 
| 10 | 
            +
            MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
         | 
| 11 | 
            +
            NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
         | 
| 12 | 
            +
            h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
         | 
| 13 | 
            +
            Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
         | 
| 14 | 
            +
            JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
         | 
| 15 | 
            +
            V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
         | 
| 16 | 
            +
            myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
         | 
| 17 | 
            +
            mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
         | 
| 18 | 
            +
            vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
         | 
| 19 | 
            +
            -----END CERTIFICATE-----
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            The CA path symlinks can be created by c_rehash(1ssl).
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            But in order for the tests to work on Windows, they have to be regular files.
         | 
| 4 | 
            +
            You can turn them all into regular files by running this on a GNU system:
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                for file in $(find . -type l); do
         | 
| 7 | 
            +
                    cp -iv --remove-destination $(readlink -e $file) $file
         | 
| 8 | 
            +
                done
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            -----BEGIN CERTIFICATE-----
         | 
| 2 | 
            +
            MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
         | 
| 3 | 
            +
            EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
         | 
| 4 | 
            +
            KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
         | 
| 5 | 
            +
            MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
         | 
| 6 | 
            +
            MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
         | 
| 7 | 
            +
            Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
         | 
| 8 | 
            +
            Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
         | 
| 9 | 
            +
            OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
         | 
| 10 | 
            +
            MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
         | 
| 11 | 
            +
            NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
         | 
| 12 | 
            +
            h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
         | 
| 13 | 
            +
            Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
         | 
| 14 | 
            +
            JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
         | 
| 15 | 
            +
            V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
         | 
| 16 | 
            +
            myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
         | 
| 17 | 
            +
            mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
         | 
| 18 | 
            +
            vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
         | 
| 19 | 
            +
            -----END CERTIFICATE-----
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            -----BEGIN CERTIFICATE-----
         | 
| 2 | 
            +
            MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
         | 
| 3 | 
            +
            A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
         | 
| 4 | 
            +
            cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
         | 
| 5 | 
            +
            MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
         | 
| 6 | 
            +
            BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
         | 
| 7 | 
            +
            YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
         | 
| 8 | 
            +
            ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
         | 
| 9 | 
            +
            BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
         | 
| 10 | 
            +
            I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
         | 
| 11 | 
            +
            CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
         | 
| 12 | 
            +
            lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
         | 
| 13 | 
            +
            AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
         | 
| 14 | 
            +
            -----END CERTIFICATE-----
         |