merged cont.
[opensuse:yast-rest-service.git] / webyast / lib / yast / rack / static_overlay.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19 require 'uri'
20
21 module YaST
22
23   module Rack
24
25     # class that looks for a static request in a list
26     # of directories. If the file can't be served from any
27     # of the overlays
28     # then the request is forwarded to the application
29     class StaticOverlay
30
31       # initialize the middleware
32       # known options:
33       # :roots => [ dir, ... ]
34       def initialize(app, options={})
35         @app = app
36         @servers = {}
37         @roots = options[:roots] || []
38         @roots.each do |root|
39           @servers[root] = ::Rack::File.new(root)
40         end
41       end
42
43       def call(env)
44         req = ::Rack::Request.new(env)
45         resource = URI.parse(req.url).path
46
47         # this is a workaround for lighttpd server
48         # where all requests go through FastCGI dispatcher
49         if resource == '/dispatch.fcgi'
50             # get the real request path
51             resource = env['REQUEST_URI']
52             # Rack expects the path in PATH_INFO which is not set by lighttpd
53             env['PATH_INFO'] = env['REQUEST_URI']
54         end
55
56         # go over all overlays
57         @roots.each do |directory|
58           resource_path = File.join(directory, resource)
59           if File.exist?(resource_path) and File.file?(resource_path)
60             Rails.logger.info "Using static overlay for #{resource_path}"
61             return @servers[directory].call(env)
62           end
63         end
64         # if the asset was nowhere, forward
65         return @app.call(env)
66       end
67       
68     end
69     
70   end
71 end