[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