[pypy-svn] r38720 - in pypy/dist/pypy/translator/js/lib: . test

fijal at codespeak.net fijal at codespeak.net
Tue Feb 13 17:21:42 CET 2007


Author: fijal
Date: Tue Feb 13 17:21:39 2007
New Revision: 38720

Modified:
   pypy/dist/pypy/translator/js/lib/server.py
   pypy/dist/pypy/translator/js/lib/test/test_server.py
   pypy/dist/pypy/translator/js/lib/url.py
Log:
Add a bit better handling of url to server.py


Modified: pypy/dist/pypy/translator/js/lib/server.py
==============================================================================
--- pypy/dist/pypy/translator/js/lib/server.py	(original)
+++ pypy/dist/pypy/translator/js/lib/server.py	Tue Feb 13 17:21:39 2007
@@ -24,6 +24,7 @@
 import sys
 
 import py
+from pypy.translator.js.lib.url import parse_url
 
 from pypy.translator.js import json
 
@@ -53,48 +54,31 @@
     exported_methods = exported_methods
     
     def do_GET(self):
-        path = self.path
-        if path.endswith("/"):
-            path = path[:-1]
-        if path.startswith("/"):
-            path = path[1:]
-        m = re.match('^(.*)\?(.*)$', path)
-        if m:
-            path = m.group(1)
-            getargs = m.group(2)
+        path, args = parse_url(self.path)
+        name_path = path[0].replace(".", "_")
+        if len(path) > 1:
+            rest = os.path.sep.join(path[1:])
         else:
-            getargs = ""
-        name_path = path.replace(".", "_")
-        if name_path == "":
-            name_path = "index"
+            rest = None
         method_to_call = getattr(self, name_path, None)
         if method_to_call is None or not getattr(method_to_call, 'exposed', None):
             exec_meth = getattr(self.exported_methods, name_path, None)
             if exec_meth is None:
                 self.send_error(404, "File %s not found" % path)
             else:
-                self.serve_data('text/json', json.write(exec_meth(**self.parse_args(getargs))))
+                self.serve_data('text/json', json.write(exec_meth(**args)))
         else:
-            outp = method_to_call(**self.parse_args(getargs))
+            if rest:
+                outp = method_to_call(rest, **args)
+            else:
+                outp = method_to_call(**args)
             if isinstance(outp, (str, unicode)):
                 self.serve_data('text/html', outp)
             elif isinstance(outp, tuple):
                 self.serve_data(*outp)
             else:
                 raise ValueError("Don't know how to serve %s" % (outp,))
-    
-    def parse_args(self, getargs):
-        # parse get argument list
-        if getargs == "":
-            return {}
-        
-        args = {}
-        arg_pairs = getargs.split("&")
-        for arg in arg_pairs:
-            key, value = arg.split("=")
-            args[key] = value
-        return args
-    
+
     def log_message(self, format, *args):
         # XXX just discard it
         pass
@@ -115,7 +99,16 @@
         self.path = path
 
     def __call__(self):
-        return open(self.path).read()
+        return open(str(self.path)).read()
+
+class StaticDir(object):
+    exposed = True
+
+    def __init__(self, path):
+        self.path = path
+
+    def __call__(self, path):
+        return open(os.path.join(str(self.path), str(path))).read()
 
 def create_server(server_address = ('', 8000), handler=TestHandler,
                  server=HTTPServer):

Modified: pypy/dist/pypy/translator/js/lib/test/test_server.py
==============================================================================
--- pypy/dist/pypy/translator/js/lib/test/test_server.py	(original)
+++ pypy/dist/pypy/translator/js/lib/test/test_server.py	Tue Feb 13 17:21:39 2007
@@ -54,3 +54,22 @@
     assert URLopener().open("http://127.0.0.1:21213/index").read() == \
            "<html></html>"
 
+
+def test_static_directory():
+    import thread
+    tmpdir = py.test.ensuretemp("server_static_dir")
+    tmpdir.ensure("a", dir=1)
+    tmpdir.join("a").ensure("a.txt").write("aaa")
+    tmpdir.join("a").ensure("b.txt").write("bbb")
+
+    class StaticDir(server.Handler):
+        static_dir = tmpdir
+        a_dir = server.StaticDir(tmpdir.join("a"))
+
+    httpd = server.HTTPServer(('127.0.0.1', 0), StaticDir)
+    port = httpd.server_port
+    thread.start_new_thread(httpd.serve_forever, ())
+    addr = "http://127.0.0.1:%d/" % port
+    assert URLopener().open(addr + "a_dir/a.txt").read() == "aaa"
+    assert URLopener().open(addr + "a_dir/b.txt").read() == "bbb"
+

Modified: pypy/dist/pypy/translator/js/lib/url.py
==============================================================================
--- pypy/dist/pypy/translator/js/lib/url.py	(original)
+++ pypy/dist/pypy/translator/js/lib/url.py	Tue Feb 13 17:21:39 2007
@@ -23,6 +23,9 @@
     def __ne__(self, other):
         return not self == other
 
+    def __iter__(self):
+        return iter((self.path, self.vars))
+
 def parse_url(path):
     """ Parse a/b/c?q=a into ('a', 'b', 'c') {'q':'a'}
     """



More information about the Pypy-commit mailing list