]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - 3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/excon.rb
add aimonb/aviator to 3rdparty
[dsa-puppet.git] / 3rdparty / modules / aviator / lib / puppet / feature / faraday / adapter / excon.rb
diff --git a/3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/excon.rb b/3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/excon.rb
new file mode 100644 (file)
index 0000000..db0c7c3
--- /dev/null
@@ -0,0 +1,80 @@
+module Faraday
+  class Adapter
+    class Excon < Faraday::Adapter
+      dependency 'excon'
+
+      def initialize(app, connection_options = {})
+        @connection_options = connection_options
+        super(app)
+      end
+
+      def call(env)
+        super
+
+        opts = {}
+        if env[:url].scheme == 'https' && ssl = env[:ssl]
+          opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true)
+          opts[:ssl_ca_path] = ssl[:ca_path] if ssl[:ca_path]
+          opts[:ssl_ca_file] = ssl[:ca_file] if ssl[:ca_file]
+          opts[:client_cert] = ssl[:client_cert] if ssl[:client_cert]
+          opts[:client_key]  = ssl[:client_key]  if ssl[:client_key]
+          opts[:certificate] = ssl[:certificate] if ssl[:certificate]
+          opts[:private_key] = ssl[:private_key] if ssl[:private_key]
+
+          # https://github.com/geemus/excon/issues/106
+          # https://github.com/jruby/jruby-ossl/issues/19
+          opts[:nonblock] = false
+        end
+
+        if ( req = env[:request] )
+          if req[:timeout]
+            opts[:read_timeout]      = req[:timeout]
+            opts[:connect_timeout]   = req[:timeout]
+            opts[:write_timeout]     = req[:timeout]
+          end
+
+          if req[:open_timeout]
+            opts[:connect_timeout]   = req[:open_timeout]
+            opts[:write_timeout]     = req[:open_timeout]
+          end
+
+          if req[:proxy]
+            opts[:proxy] = {
+              :host     => req[:proxy][:uri].host,
+              :port     => req[:proxy][:uri].port,
+              :scheme   => req[:proxy][:uri].scheme,
+              :user     => req[:proxy][:user],
+              :password => req[:proxy][:password]
+            }
+          end
+        end
+
+        conn = ::Excon.new(env[:url].to_s, opts.merge(@connection_options))
+
+        resp = conn.request \
+          :method  => env[:method].to_s.upcase,
+          :headers => env[:request_headers],
+          :body    => read_body(env)
+
+        save_response(env, resp.status.to_i, resp.body, resp.headers)
+
+        @app.call env
+      rescue ::Excon::Errors::SocketError => err
+        if err.message =~ /\btimeout\b/
+          raise Error::TimeoutError, err
+        elsif err.message =~ /\bcertificate\b/
+          raise Faraday::SSLError, err
+        else
+          raise Error::ConnectionFailed, err
+        end
+      rescue ::Excon::Errors::Timeout => err
+        raise Error::TimeoutError, err
+      end
+
+      # TODO: support streaming requests
+      def read_body(env)
+        env[:body].respond_to?(:read) ? env[:body].read : env[:body]
+      end
+    end
+  end
+end