Sha256: 22ab134289586141a2357083b36fb693350e326ca3a6dc6537b80d664ef5cfeb

Contents?: true

Size: 1.82 KB

Versions: 1

Compression:

Stored size: 1.82 KB

Contents

module Rack
  module Putty

    module Router

      class ExtractParams
        attr_accessor :pattern, :keys

        def initialize(app, pattern, keys)
          @app, @pattern, @keys = app, pattern, keys
        end

        def call(env)
          add_request(env)
          extract_params(env)
          @app.call(env)
        end

        private

        def add_request(env)
          env['request'] = Rack::Request.new(env)
        end

        def extract_params(env)
          route = env[Rack::Mount::Prefix::KEY]
          route = '/' if route.empty?
          return unless match = pattern.match(route)
          values = match.captures.to_a.map { |v| URI.decode_www_form_component(v) if v }

          params = env['request'].params.dup

          if env['CONTENT_TYPE'] =~ /\Amultipart/
            env['data'] = params.select { |k,v| Hash === v && v.has_key?(:filename) }
            params = params.reject { |k,v| Hash === v && v.has_key?(:filename) }
          end

          if values.any?
            params.merge!('captures' => values)
            keys.zip(values) { |k,v| Array === params[k] ? params[k] << v : params[k] = v if v }
          end

          env['params'] = indifferent_params(params)
        end

        # Enable string or symbol key access to the nested params hash.
        def indifferent_params(object)
          case object
          when Hash
            new_hash = indifferent_hash
            object.each { |key, value| new_hash[key] = indifferent_params(value) }
            new_hash
          when Array
            object.map { |item| indifferent_params(item) }
          else
            object
          end
        end

        # Creates a Hash with indifferent access.
        def indifferent_hash
          Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
        end
      end

    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rack-putty-0.0.1 lib/rack-putty/router/extract_params.rb