diff --git a/servefile b/servefile index 821e317..928ba23 100755 --- a/servefile +++ b/servefile @@ -349,6 +349,27 @@ class DirListingHandler(FileBaseHandler): htmlstr = htmlstr.replace(src, dst) return htmlstr + def _appendToListing(self, content, item, itemPath, stat, is_dir): + # Strings to display on directory listing + lastModifiedDate = datetime.datetime.fromtimestamp(stat.st_mtime) + lastModified = lastModifiedDate.strftime("%Y-%m-%d %H:%M") + fileSize = "%.1f%s" % self.convertSize(stat.st_size) + (fileType, _) = mimetypes.guess_type(itemPath) + if not fileType: + fileType = "-" + + if is_dir: + item += "/" + fileType = "Directory" + content.append(""" + + %s + %s + %s + %s + + """ % (urllib.quote(item), item, lastModified, fileSize, fileType)) + def sendDirectoryListing(self, path, head): """ Generate a directorylisting for path and send it """ header = """ @@ -389,7 +410,11 @@ class DirListingHandler(FileBaseHandler): """ % {'version': __version__} content = [] - for item in [".."] + sorted(os.listdir(path)): + + dir_items = list() + file_items = list() + + for item in [".."] + sorted(os.listdir(path), key=lambda x:x.lower()): # create path to item itemPath = os.path.join(path, item) @@ -400,24 +425,19 @@ class DirListingHandler(FileBaseHandler): except IOError: continue - # Strings to display on directory listing - lastModifiedDate = datetime.datetime.fromtimestamp(stat.st_mtime) - lastModified = lastModifiedDate.strftime("%Y-%m-%d %H:%M") - fileSize = "%.1f%s" % self.convertSize(stat.st_size) - (fileType, _) = mimetypes.guess_type(itemPath) - if not fileType: - fileType = "-" - if os.path.isdir(itemPath): - item += "/" - fileType = "Directory" - content.append(""" - - %s - %s - %s - %s - """ % (urllib.quote(item), item, lastModified, fileSize, fileType)) + target_items = dir_items + else: + target_items = file_items + target_items.append((item, itemPath, stat)) + + # Directories first, then files + for (tuple_list, is_dir) in ( + (dir_items, True), + (file_items, False), + ): + for (item, itemPath, stat) in tuple_list: + self._appendToListing(content, item, itemPath, stat, is_dir=is_dir) listing = header + "\n".join(content) + footer