function std.extra_mime(name) local ext = std.ext(name); local mpath = __ROOT__.."/".."mimes.json" local xmimes = {} if utils.file_exists(mpath) then local f = io.open(mpath, "r") if f then xmimes = JSON.decodeString(f:read("*all")) f:close() end end if(name:find("Makefile$")) then return "text/makefile",false elseif ext == "php" then return "text/php",false elseif ext == "c" or ext == "h" then return "text/c",false elseif ext == "cpp" or ext == "hpp" then return "text/cpp",false elseif ext == "md" then return "text/markdown",false elseif ext == "lua" then return "text/lua",false elseif ext == "yaml" then return "application/x-yaml", false elseif xmimes[ext] then return xmimes[ext].mime, xmimes[ext].binary --elseif ext == "pgm" then return "image/x-portable-graymap", true else return "application/octet-stream",true end end function std.mimeOf(name) local mime = std.mime(name) if mime ~= "application/octet-stream" then return mime else return std.extra_mime(name) end end --[[ function std.isBinary(name) local mime = std.mime(name) if mime ~= "application/octet-stream" then return std.is_bin(name) else local xmime,bin = std.extra_mime(name) return bin end end ]] function std.sendFile(m) local mime = std.mimeOf(m) local finfo = ulib.file_stat(m) local len = tostring(math.floor(finfo.size)) local len1 = tostring(math.floor(finfo.size - 1)) if mime == "audio/mpeg" then std.status(200) std.header("Pragma", "public") std.header("Expires", "0") std.header("Content-Type", mime) std.header("Content-Length", len) std.header("Content-Disposition", "inline; filename=" .. std.basename(m)) std.header("Content-Range:", "bytes 0-" .. len1 .. "/" .. len) std.header("Accept-Ranges", "bytes") std.header("X-Pad", "avoid browser bug") std.header("Content-Transfer-Encoding", "binary") std.header("Cache-Control", "no-cache, no-store") std.header("Connection", "Keep-Alive") std.header_flush() std.f(m) else if HEADER['If-Modified-Since'] and HEADER['If-Modified-Since'] == finfo.ctime then std.status(304) std.header_flush() else std.status(200) std.header("Content-Type", mime) --std.header("Content-Length", len) std.header("Cache-Control", "no-cache") std.header("Last-Modified", finfo.ctime) std.header_flush() std.f(m) end end end