3 HTTP server implementation for LuCI - luci handler
4 (c) 2008 Steven Barth <steven@midlink.org>
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
16 module("luci.httpd.handler.file", package.seeall)
18 require("luci.httpd.module")
19 require("luci.http.protocol.date")
20 require("luci.http.protocol.mime")
21 require("luci.http.protocol.conditionals")
25 Simple = luci.util.class(luci.httpd.module.Handler)
26 Response = luci.httpd.module.Response
28 function Simple.__init__(self, docroot, dirlist)
29 luci.httpd.module.Handler.__init__(self)
30 self.docroot = docroot
31 self.dirlist = dirlist and true or false
32 self.mime = luci.http.protocol.mime
33 self.date = luci.http.protocol.date
34 self.cond = luci.http.protocol.conditionals
37 function Simple.getfile(self, uri)
38 local file = self.docroot .. uri:gsub("%.%./+", "")
39 local stat = luci.fs.stat(file)
44 function Simple.handle_get(self, request, sourcein, sinkerr)
45 local file, stat = self:getfile(request.env.PATH_INFO)
48 if stat.type == "regular" then
50 -- Generate Entity Tag
51 local etag = self.cond.mk_etag( stat )
56 ok, code, hdrs = self.cond.if_modified_since( request, stat )
58 ok, code, hdrs = self.cond.if_match( request, stat )
60 ok, code, hdrs = self.cond.if_unmodified_since( request, stat )
62 ok, code, hdrs = self.cond.if_none_match( request, stat )
67 ["Date"] = self.date.to_http( os.time() );
68 ["Last-Modified"] = self.date.to_http( stat.mtime );
69 ["Content-Type"] = self.mime.to_mime( file );
70 ["Content-Length"] = stat.size;
73 ), ltn12.source.file(io.open(file))
75 return Response( code, hdrs or { } ),
79 return Response( code, hdrs or { } ),
83 return Response( code, hdrs or { } ),
87 return Response( code, hdrs or { } ),
91 return self:failure(403, "Unable to transmit " .. stat.type .. " " .. file)
94 return self:failure(404, "No such file: " .. file)
98 function Simple.handle_head(self, ...)
99 local response, sourceout = self:handle_get(...)