Sha256: 991a0d1ce1402b8ee1afad5f11f4d0a7985ec7037b5dee1a1d1adfaeebb2e2ad

Contents?: true

Size: 1.23 KB

Versions: 1

Compression:

Stored size: 1.23 KB

Contents

require 'rack/throttle'

module Dimension

  class Middleware
  
    EXCEEDED = [403, {'Content-Type' => 'text/plain'}, ['Limit Exceeded.']]
  
    def initialize(app, opts = {})
      @app  = app
      @root = File.expand_path(opts[:root] || Dir.pwd())
      @save = opts[:save]
      
      if opts[:throttle]
        @throttle = Rack::Throttle::Interval.new(self, :min => opts[:throttle])
      end
    end
  
    def call(env)
      url      = env['PATH_INFO']
      geometry = url[/-([0-9x:-]+)\.(png|gif|jpe?g)/i, 1]
      
      return @app.call(env) unless geometry

      resized  = File.join(@root, url)
      original = resized.sub("-#{geometry}", '')
    
      if !File.exist?(resized) and File.exist?(original)
        
        if @throttle
          req = Rack::Request.new(env)
          return EXCEEDED unless @throttle.allowed?(req)
        end
        
        # puts 'Processing image: ' + file
        image = Dimension.open(original)
        image.generate(geometry) do
          image.save_as(resized) if @save
          return image.to_response
        end
      end

      @app.call(env)
    rescue ArgumentError => e # Dimension::Error
      # puts "Error processing image: #{e.message}"
      @app.call(env)
    end
  
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dimension-0.0.6 lib/dimension/middleware.rb