Commit aa7b797ee7f19b64b3cb60b2baeeff19124dab2a
1 parent
c36cfb56
Exists in
master
and in
1 other branch
- fixed bug where mimetype was not defined when serving files
Showing
1 changed file
with
12 additions
and
4 deletions
Show diff stats
serve.py
| ... | ... | @@ -8,6 +8,7 @@ import uuid |
| 8 | 8 | import logging.config |
| 9 | 9 | import argparse |
| 10 | 10 | from concurrent.futures import ThreadPoolExecutor |
| 11 | +import mimetypes | |
| 11 | 12 | |
| 12 | 13 | # user installed libraries |
| 13 | 14 | import tornado.ioloop |
| ... | ... | @@ -92,10 +93,12 @@ class LoginHandler(BaseHandler): |
| 92 | 93 | class LogoutHandler(BaseHandler): |
| 93 | 94 | @tornado.web.authenticated |
| 94 | 95 | def get(self): |
| 95 | - self.learn.logout(self.current_user) | |
| 96 | 96 | self.clear_cookie('user') |
| 97 | 97 | self.redirect(self.get_argument('next', '/')) |
| 98 | 98 | |
| 99 | + def on_finish(self): | |
| 100 | + self.learn.logout(self.current_user) | |
| 101 | + | |
| 99 | 102 | # ---------------------------------------------------------------------------- |
| 100 | 103 | class ChangePasswordHandler(BaseHandler): |
| 101 | 104 | @tornado.web.authenticated |
| ... | ... | @@ -159,6 +162,7 @@ class FileHandler(BaseHandler): |
| 159 | 162 | uid = self.current_user |
| 160 | 163 | public_dir = self.learn.get_current_public_dir(uid) |
| 161 | 164 | filepath = path.expanduser(path.join(public_dir, filename)) |
| 165 | + | |
| 162 | 166 | try: |
| 163 | 167 | f = open(filepath, 'rb') |
| 164 | 168 | except FileNotFoundError: |
| ... | ... | @@ -166,6 +170,11 @@ class FileHandler(BaseHandler): |
| 166 | 170 | except PermissionError: |
| 167 | 171 | logging.error(f'No permission: {filepath}') |
| 168 | 172 | else: |
| 173 | + content_type = mimetypes.guess_type(filename) | |
| 174 | + self.set_header("Content-Type", content_type[0]) | |
| 175 | + | |
| 176 | + # divide the file into chunks and write one chunk at a time, so | |
| 177 | + # that the write does not block the ioloop for very long. | |
| 169 | 178 | with f: |
| 170 | 179 | chunk = f.read(self.chunk_size) |
| 171 | 180 | while chunk: |
| ... | ... | @@ -173,12 +182,11 @@ class FileHandler(BaseHandler): |
| 173 | 182 | self.write(chunk) # write the cunk to response |
| 174 | 183 | await self.flush() # flush the current chunk to socket |
| 175 | 184 | except iostream.StreamClosedError: |
| 176 | - # client closed the connection | |
| 177 | - break | |
| 185 | + break # client closed the connection | |
| 178 | 186 | finally: |
| 179 | 187 | del chunk |
| 180 | 188 | await gen.sleep(0.000000001) # 1 nanosecond (hack) |
| 181 | - # in tornnado 5.0 use `await asyncio.sleep(0)` instead | |
| 189 | + # FIXME in the upcomming tornado 5.0 use `await asyncio.sleep(0)` instead | |
| 182 | 190 | chunk = f.read(self.chunk_size) |
| 183 | 191 | |
| 184 | 192 | ... | ... |