Sha256: da42f27be6dc87de779a4d847e69d10f2ec34fcaa9b157993c2f6fd499420849

Contents?: true

Size: 996 Bytes

Versions: 2

Compression:

Stored size: 996 Bytes

Contents

module RestCore
  class FollowRedirect
    def self.members; [:max_redirects]; end
    include Middleware

    def call env, &k
      if env[DRY]
        app.call(env, &k)
      else
        app.call(env){ |res| process(res, k) }
      end
    end

    def process res, k
      return k.call(res) if max_redirects(res) <= 0
      status = res[RESPONSE_STATUS]
      return k.call(res) if ![301,302,303,307].include?(status)
      return k.call(res) if  [301,302    ,307].include?(status) &&
                            ![:get, :head    ].include?(res[REQUEST_METHOD])

      location = [res[RESPONSE_HEADERS]['LOCATION']].flatten.first
      meth     = if status == 303
                   :get
                 else
                   res[REQUEST_METHOD]
                 end

      give_promise(call(res.merge(
        REQUEST_METHOD => meth    ,
        REQUEST_PATH   => location,
        REQUEST_QUERY  => {}      ,
        'max_redirects' => max_redirects(res) - 1), &k))
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rest-core-4.0.1 lib/rest-core/middleware/follow_redirect.rb
rest-core-4.0.0 lib/rest-core/middleware/follow_redirect.rb