Sha256: 7a2cff0a7e1435f884537d0086e141c3663506c66f20143ab50d38b80a6a23d9

Contents?: true

Size: 1.9 KB

Versions: 2

Compression:

Stored size: 1.9 KB

Contents

# cf) xray-rails : xray/middleware.rb

module CopyTunerClient
  class CopyrayMiddleware
    def initialize(app)
      @app = app
    end

    def call(env)
      status, headers, response = @app.call(env)
      if should_inject_xray?(status, headers, response)
        body = response.body.sub(/<body[^>]*>/) { "#{$~}\n#{css_tag}" }
        # if Rails.application.config.assets.debug
          append_js!(body, 'jquery', :copyray)
        # end
        headers['Content-Length'] = body.bytesize.to_s
      end
      [status, headers, (body ? [body] : response)]
    end

    private

    def helpers
      ActionController::Base.helpers
    end

    # Appends the given `script_name` after the `after_script_name`.
    def append_js!(html, after_script_name, script_name)
      # Matches:
      #   <script src="/assets/jquery.js"></script>
      #   <script src="/assets/jquery-min.js"></script>
      #   <script src="/assets/jquery.min.1.9.1.js"></script>
      html.sub!(/<script[^>]+\/#{after_script_name}([-.]{1}[\d\.]+)?([-.]{1}min)?\.js[^>]+><\/script>/) do
        "#{$~}\n" + helpers.javascript_include_tag(script_name)
      end
    end

    def css_tag
      h = ActionController::Base.helpers
      helpers.stylesheet_link_tag :copyray
    end

    def should_inject_xray?(status, headers, response)
      status == 200 &&
      !empty?(response) &&
      html_request?(headers, response) &&
      !file?(headers) &&
      !response.body.frozen?
    end

    def empty?(response)
      # response may be ["Not Found"], ["Move Permanently"], etc.
      (response.is_a?(Array) && response.size <= 1) ||
        !response.respond_to?(:body) || response.body.empty?
    end

    def file?(headers)
      headers["Content-Transfer-Encoding"] == "binary"
    end

    def html_request?(headers, response)
      headers['Content-Type'] && headers['Content-Type'].include?('text/html') && response.body.include?("<html")
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
copy_tuner_client-0.1.1.beta lib/copy_tuner_client/copyray_middleware.rb
copy_tuner_client-0.1.0.beta lib/copy_tuner_client/copyray_middleware.rb