| 1 | import os |
| 2 | from . import resp |
| 3 | pj = os.path.join |
| 4 | |
| 5 | __all__ = ["filehandler"] |
| 6 | |
| 7 | class filehandler(object): |
| 8 | def __init__(self, basedir): |
| 9 | self.basedir = basedir |
| 10 | |
| 11 | def handledir(self, req, path): |
| 12 | raise resp.notfound() |
| 13 | |
| 14 | def handlefile(self, req, path): |
| 15 | ctype = "application/octet-stream" |
| 16 | bn = os.path.basename(path) |
| 17 | if '.' in bn: |
| 18 | ext = bn[bn.rindex('.') + 1:].lower() |
| 19 | if ext == "jpg" or ext == "jpeg": |
| 20 | ctype = "image/jpeg" |
| 21 | elif ext == "png": |
| 22 | ctype = "image/png" |
| 23 | elif ext == "gif": |
| 24 | ctype = "image/gif" |
| 25 | elif ext == "txt": |
| 26 | ctype = "text/plain" |
| 27 | elif ext == "css": |
| 28 | ctype = "text/css" |
| 29 | elif ext == "html": |
| 30 | ctype = "text/html" |
| 31 | req.ohead["Content-Type"] = ctype |
| 32 | return open(path, "rb") |
| 33 | |
| 34 | def resolvefile(self, req, curpath, el): |
| 35 | if os.path.isfile(pj(curpath, el)): |
| 36 | return pj(curpath, el) |
| 37 | if '.' not in el: |
| 38 | for f in os.listdir(curpath): |
| 39 | p = f.find('.') |
| 40 | if p > 0: |
| 41 | if f[:p] == el: |
| 42 | return pj(curpath, f) |
| 43 | raise resp.notfound() |
| 44 | |
| 45 | def handlefinal(self, req, curpath, el): |
| 46 | if el == "": |
| 47 | return self.handledir(req, curpath) |
| 48 | return self.handlefile(req, self.resolvefile(req, curpath, el)) |
| 49 | |
| 50 | def handlenonfinal(self, req, curpath, el, rest): |
| 51 | raise resp.notfound() |
| 52 | |
| 53 | def handleentry(self, req, curpath, el, rest): |
| 54 | if el == "": |
| 55 | raise resp.notfound() |
| 56 | if '/' in el or el[0] == '.': |
| 57 | raise resp.notfound() |
| 58 | if os.path.isdir(pj(curpath, el)): |
| 59 | return self.handlepath(req, pj(curpath, el), rest) |
| 60 | return self.handlenonfinal(req, curpath, el, rest) |
| 61 | |
| 62 | def handlepath(self, req, curpath, rest): |
| 63 | p = rest.find('/') |
| 64 | if p < 0: |
| 65 | return self.handlefinal(req, curpath, rest) |
| 66 | else: |
| 67 | return self.handleentry(req, curpath, rest[:p], rest[p + 1:]) |
| 68 | |
| 69 | def handle(self, req): |
| 70 | pi = req.pathinfo |
| 71 | if len(pi) > 0 and pi[0] == '/': |
| 72 | pi = pi[1:] |
| 73 | return self.handlepath(req, self.basedir, pi) |