diff options
author | Unrud <unrud@openaliasbox.org> | 2017-03-10 22:57:59 +0100 |
---|---|---|
committer | Unrud <unrud@openaliasbox.org> | 2017-03-11 00:42:55 +0100 |
commit | ee811b91a1e8b9ae1eaf9a531fe6dec514d591e8 (patch) | |
tree | 86fd2012ed5af9dc76ac75c1e0a7883eb6461ddc /radicale_web/__init__.py | |
download | radicaleinfcloud-ee811b91a1e8b9ae1eaf9a531fe6dec514d591e8.tar.gz radicaleinfcloud-ee811b91a1e8b9ae1eaf9a531fe6dec514d591e8.tar.bz2 radicaleinfcloud-ee811b91a1e8b9ae1eaf9a531fe6dec514d591e8.zip |
Init
Diffstat (limited to 'radicale_web/__init__.py')
-rw-r--r-- | radicale_web/__init__.py | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/radicale_web/__init__.py b/radicale_web/__init__.py new file mode 100644 index 0000000..13aecd4 --- /dev/null +++ b/radicale_web/__init__.py @@ -0,0 +1,74 @@ +# This file is part of Radicale Web. +# Copyright © 2017 Unrud <unrud@openaliasbox.org> +# +# Radicale Web is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# Radicale Web is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with Radicale Web. If not, see <http://www.gnu.org/licenses/>. + +import os +import posixpath +import radicale +import time + +from http import client + +VERSION = "2.0.0" + +MIMETYPES = { + ".css": "text/css", + ".eot": "application/vnd.ms-fontobject", + ".gif": "image/gif", + ".html": "text/html", + ".js": "application/javascript", + ".manifest": "text/cache-manifest", + ".png": "image/png", + ".svg": "image/svg+xml", + ".ttf": "application/font-sfnt", + ".txt": "text/plain", + ".woff": "application/font-woff", + ".woff2": "font/woff2", + ".xml": "text/xml"} +FALLBACK_MIMETYPE = "application/octet-stream" + +class Web: + def __init__(self, configuration, logger): + self.configuration = configuration + self.logger = logger + self.folder = os.path.join(os.path.dirname(__file__), "web") + + def get(self, environ, base_prefix, path, user): + try: + filesystem_path = radicale.storage.path_to_filesystem( + self.folder, path[len("/.web"):]) + except ValueError as e: + self.logger.debug(e) + return radicale.NOT_FOUND + if os.path.isdir(filesystem_path) and not path.endswith("/"): + location = posixpath.basename(path) + "/" + return (client.SEE_OTHER, + {"Location": location, "Content-Type": "text/plain"}, + "Redirected to %s" % location) + if os.path.isdir(filesystem_path): + filesystem_path = os.path.join(filesystem_path, "index.html") + if not os.path.isfile(filesystem_path): + return radicale.NOT_FOUND + content_type = MIMETYPES.get( + os.path.splitext(filesystem_path)[1].lower(), FALLBACK_MIMETYPE) + with open(filesystem_path, "rb") as f: + answer = f.read() + last_modified = time.strftime( + "%a, %d %b %Y %H:%M:%S GMT", + time.gmtime(os.fstat(f.fileno()).st_mtime)) + headers = { + "Content-Type": content_type, + "Last-Modified": last_modified} + return client.OK, headers, answer |