Class: LoremImageWare::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/lorem-image-ware.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Middleware

Returns a new instance of Middleware.



42
43
44
45
# File 'lib/lorem-image-ware.rb', line 42

def initialize(app, options = {})
  @app     = app
  @options = options
end

Instance Method Details

#_call(env) ⇒ Object



51
52
53
54
55
56
57
58
59
60
# File 'lib/lorem-image-ware.rb', line 51

def _call(env)
  request = Rack::Request.new(env)

  if request.fullpath =~ %r{^#{root}/image/(\d+)/(\d+)/?(/(\S+))?}i
    url = provider.url(width: $1, height: $2, tag: $4)
    serve_image(url)
  else
    @app.call(env)
  end
end

#call(env) ⇒ Object



47
48
49
# File 'lib/lorem-image-ware.rb', line 47

def call(env)
  self.dup._call(env)
end

#fetch_image(url) ⇒ Object



72
73
74
75
76
77
78
79
80
# File 'lib/lorem-image-ware.rb', line 72

def fetch_image(url)
  @@image_cache ||= Hash.new do |h, url|
    uri = URI(url)
    res = Net::HTTP.get_response(uri)
    h[url] = res.body if res.code == "200"
  end

  @@image_cache[url]
end

#providerObject



86
87
88
# File 'lib/lorem-image-ware.rb', line 86

def provider
  @provider ||= @options.fetch(:provider, LoremPixelProvider.new)
end

#rootObject



82
83
84
# File 'lib/lorem-image-ware.rb', line 82

def root
  @options.fetch(:root, "/lorem")
end

#serve_image(url) ⇒ Object



62
63
64
65
66
67
68
69
70
# File 'lib/lorem-image-ware.rb', line 62

def serve_image(url)
  if image_data = fetch_image(url)
    Rack::Response.new([], 200, {"Content-Type" => "image/jpeg"}).finish do |res|
      res.write(image_data)
    end
  else
    [404, {"Content-Type" => "test/plain"}, ["Not found"]]
  end
end