]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - 3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/em_synchrony.rb
add aimonb/aviator to 3rdparty
[dsa-puppet.git] / 3rdparty / modules / aviator / lib / puppet / feature / faraday / adapter / em_synchrony.rb
diff --git a/3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/em_synchrony.rb b/3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/em_synchrony.rb
new file mode 100644 (file)
index 0000000..305e702
--- /dev/null
@@ -0,0 +1,92 @@
+require 'uri'
+
+module Faraday
+  class Adapter
+    class EMSynchrony < Faraday::Adapter
+      include EMHttp::Options
+
+      dependency do
+        require 'em-synchrony/em-http'
+        require 'em-synchrony/em-multi'
+        require 'fiber'
+      end
+
+      self.supports_parallel = true
+
+      def self.setup_parallel_manager(options = {})
+        ParallelManager.new
+      end
+
+      def call(env)
+        super
+        request = EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env))
+
+        http_method = env[:method].to_s.downcase.to_sym
+
+        # Queue requests for parallel execution.
+        if env[:parallel_manager]
+          env[:parallel_manager].add(request, http_method, request_config(env)) do |resp|
+            save_response(env, resp.response_header.status, resp.response) do |resp_headers|
+              resp.response_header.each do |name, value|
+                resp_headers[name.to_sym] = value
+              end
+            end
+
+            # Finalize the response object with values from `env`.
+            env[:response].finish(env)
+          end
+
+        # Execute single request.
+        else
+          client = nil
+          block = lambda { request.send(http_method, request_config(env)) }
+
+          if !EM.reactor_running?
+            EM.run do
+              Fiber.new {
+                client = block.call
+                EM.stop
+              }.resume
+            end
+          else
+            client = block.call
+          end
+
+          raise client.error if client.error
+
+          save_response(env, client.response_header.status, client.response) do |resp_headers|
+            client.response_header.each do |name, value|
+              resp_headers[name.to_sym] = value
+            end
+          end
+        end
+
+        @app.call env
+      rescue Errno::ECONNREFUSED
+        raise Error::ConnectionFailed, $!
+      rescue EventMachine::Connectify::CONNECTError => err
+        if err.message.include?("Proxy Authentication Required")
+          raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
+        else
+          raise Error::ConnectionFailed, err
+        end
+      rescue => err
+        if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
+          raise Faraday::SSLError, err
+        else
+          raise
+        end
+      end
+    end
+  end
+end
+
+require 'faraday/adapter/em_synchrony/parallel_manager'
+
+begin
+  require 'openssl'
+rescue LoadError
+  warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
+else
+  require 'faraday/adapter/em_http_ssl_patch'
+end if Faraday::Adapter::EMSynchrony.loaded?