* libs/httpd: print request uri, not real path in directory listings
[project/luci.git] / libs / httpd / luasrc / httpd / module.lua
index ba745bd..46cfa54 100644 (file)
@@ -13,6 +13,7 @@ $Id$
 ]]--
 module("luci.httpd.module", package.seeall)
 require("luci.util")
+require("luci.http.protocol")
 require("ltn12")
 
 
@@ -23,6 +24,7 @@ Handler = luci.util.class()
 -- Constructor
 function Handler.__init__(self)
        self.filters = {}
+       self.handler = {}
 end
 
 
@@ -33,22 +35,17 @@ end
 
 
 -- Creates a failure reply
-function Handler.failure(self, message)
-       response = {
-               status = 500,
-               headers = {
-                       ["Content-Type"] = "text/plain"
-               }
-       }
-       
-       sourceout = ltn12.source.string(message)
+function Handler.failure(self, code, message)
+       local response = Response(code, { ["Content-Type"] = "text/plain" })
+       local sourceout = ltn12.source.string(message)
        
        return response, sourceout 
 end
 
-
 -- Processes a request
-function Handler.process(self, request, sourcein, sinkout, sinkerr)
+function Handler.process(self, request, sourcein, sinkerr, ...)
+       local stat, response, sourceout
+
        -- Process incoming filters
        for i, f in ipairs(self.filters) do
                local i = f:get("input")
@@ -62,19 +59,25 @@ function Handler.process(self, request, sourcein, sinkout, sinkerr)
                end
        end
        
-       -- Run the handler
-       local stat, response, sourceout = luci.util.copcall(
-               self.handle, self, request, sourcein, sinkerr
-       )
+       -- Detect request Method
+       local hname = "handle_" .. request.request_method
+       if self[hname] then
+               -- Run the handler
+               stat, response, sourceout = luci.util.copcall(
+                       self[hname], self, request, sourcein, sinkerr, ...
+               )
        
-       -- Check for any errors
-       if not stat then
-               response, sourceout = self:failure(response)
+               -- Check for any errors
+               if not stat then
+                       response, sourceout = self:failure(500, response)
+               end
+       else
+               response, sourceout = self:failure(405, luci.http.protocol.statusmsg[405])
        end
        
        -- Check data
        if not luci.util.instanceof(response, Response) then
-               response, sourceout = self:failure("Core error: Invalid module response!")
+               response, sourceout = self:failure(500, "Core error: Invalid module response!")
        end
        
        -- Process outgoing filters
@@ -90,7 +93,7 @@ function Handler.process(self, request, sourcein, sinkout, sinkerr)
                end
        end
        
-       luci.http.push_response(request, status, response, sourceout, sinkout, sinkerr) 
+       return response, sourceout
 end
 
 
@@ -119,7 +122,7 @@ end
 -- Handler Response 
 Response = luci.util.class()
 
-function Response.__init__(self, request, status, headers)
+function Response.__init__(self, status, headers)
        self.status = tonumber(status) or 200
        self.headers = (type(headers) == "table") and headers or {}
 end
@@ -130,12 +133,4 @@ end
 
 function Response.setstatus(self, status)
        self.status = status
-end
-
-
--- Status codes
-statusmsg = {
-       [200] = "OK",
-       [404] = "Not Found",
-       [500] = "Internal Server Error",
-}
\ No newline at end of file
+end
\ No newline at end of file