]> granicus.if.org Git - python/commitdiff
Add a simple directory listing function.
authorGuido van Rossum <guido@python.org>
Tue, 9 May 2000 14:57:09 +0000 (14:57 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 9 May 2000 14:57:09 +0000 (14:57 +0000)
Lib/SimpleHTTPServer.py

index a4517dc0591bbf5170a345b3587c1e8baa12153a..6def14e9dc28d1c5e2463d048ea5fea620af4712 100644 (file)
@@ -6,7 +6,7 @@ and HEAD requests in a fairly straightforward manner.
 """
 
 
-__version__ = "0.3"
+__version__ = "0.4"
 
 
 import os
@@ -14,6 +14,8 @@ import string
 import posixpath
 import BaseHTTPServer
 import urllib
+import cgi
+from StringIO import StringIO
 
 
 class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
@@ -58,18 +60,45 @@ class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
         """
         path = self.translate_path(self.path)
         if os.path.isdir(path):
-            self.send_error(403, "Directory listing not supported")
-            return None
-        try:
-            f = open(path, 'rb')
-        except IOError:
-            self.send_error(404, "File not found")
-            return None
+            f = self.list_directory(path)
+            if f is None:
+                return None
+            ctype = "text/HTML"
+        else:
+            try:
+                f = open(path, 'rb')
+            except IOError:
+                self.send_error(404, "File not found")
+                return None
+            ctype = self.guess_type(path)
         self.send_response(200)
-        self.send_header("Content-type", self.guess_type(path))
+        self.send_header("Content-type", ctype)
         self.end_headers()
         return f
 
+    def list_directory(self, path):
+        try:
+            list = os.listdir(path)
+        except os.error:
+            self.send_error(404, "No permission to list directory");
+            return None
+        list.sort(lambda a, b: cmp(a.lower(), b.lower()))
+        f = StringIO()
+        f.write("<h2>Directory listing for %s</h2>\n" % self.path)
+        f.write("<hr>\n<ul>\n")
+        for name in list:
+            fullname = os.path.join(path, name)
+            displayname = name = cgi.escape(name)
+            if os.path.islink(fullname):
+                displayname = name + "@"
+            elif os.path.isdir(fullname):
+                displayname = name + "/"
+                name = name + os.sep
+            f.write('<li><a href="%s">%s</a>\n' % (name, displayname))
+        f.write("</ul>\n<hr>\n")
+        f.seek(0)
+        return f
+
     def translate_path(self, path):
         """Translate a /-separated PATH to the local filename syntax.