diff options
Diffstat (limited to '')
-rw-r--r-- | sca-cpp/trunk/modules/wsgi/atomutil.py | 2 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/wsgi/client-test.py | 3 | ||||
-rwxr-xr-x | sca-cpp/trunk/modules/wsgi/composite.py | 8 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/wsgi/httputil.py | 14 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/wsgi/server-test.py | 3 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/wsgi/util.py | 17 | ||||
-rwxr-xr-x | sca-cpp/trunk/modules/wsgi/wiring-test | 4 | ||||
-rwxr-xr-x | sca-cpp/trunk/modules/wsgi/wsgi-test | 4 |
8 files changed, 52 insertions, 3 deletions
diff --git a/sca-cpp/trunk/modules/wsgi/atomutil.py b/sca-cpp/trunk/modules/wsgi/atomutil.py index ad6425f062..4b67ef216e 100644 --- a/sca-cpp/trunk/modules/wsgi/atomutil.py +++ b/sca-cpp/trunk/modules/wsgi/atomutil.py @@ -29,7 +29,7 @@ def entryElementValues(e): i = "" if isNil(li) else elementValue(car(li)) lc = filter(selector((element, "'content")), e) return append((element, "'entry", (element, "'title", t), (element, "'id", i)), - () if isNil(lc) else ((element, "'content", elementValue(car(lc))),)) + () if isNil(lc) else () if isAttribute(elementValue(car(lc))) else ((element, "'content", elementValue(car(lc))),)) # Convert a list of elements to a list of values representing ATOM entries def entriesElementValues(e): diff --git a/sca-cpp/trunk/modules/wsgi/client-test.py b/sca-cpp/trunk/modules/wsgi/client-test.py index 867222e792..5c67269885 100644 --- a/sca-cpp/trunk/modules/wsgi/client-test.py +++ b/sca-cpp/trunk/modules/wsgi/client-test.py @@ -36,5 +36,8 @@ def post(collection, item, ref): def put(id, item, ref): return ref.put(id, item) +def patch(id, item, ref): + return ref.patch(id, item) + def delete(id, ref): return ref.delete(id) diff --git a/sca-cpp/trunk/modules/wsgi/composite.py b/sca-cpp/trunk/modules/wsgi/composite.py index baea7aa053..77f2ecdb59 100755 --- a/sca-cpp/trunk/modules/wsgi/composite.py +++ b/sca-cpp/trunk/modules/wsgi/composite.py @@ -237,6 +237,14 @@ def application(e, r): return failure(e, r, 404) return result(e, r, 200) + if m == "PATCH": + # Handle an ATOM entry PATCH + ae = elementsToValues(readATOMEntry(requestBody(e))) + v = comp("patch", id, ae) + if v == False: + return failure(e, r, 404) + return result(e, r, 200) + if m == "DELETE": v = comp("delete", id) if v == False: diff --git a/sca-cpp/trunk/modules/wsgi/httputil.py b/sca-cpp/trunk/modules/wsgi/httputil.py index 842460cc6a..f98418d0bc 100644 --- a/sca-cpp/trunk/modules/wsgi/httputil.py +++ b/sca-cpp/trunk/modules/wsgi/httputil.py @@ -124,6 +124,20 @@ class client: return None return True + # handle a PATCH request + if func == "patch": + u = requesturi(self.url, car(args)) + print >> stderr, "Client PATCH request", u + req = StringIO() + writeStrings(atomutil.writeATOMEntry(atomutil.entryValuesToElements(cadr(args))), req) + headers["Content-type"] = "application/atom+xml" + c.request("PATCH", u, req.getvalue(), headers) + res = c.getresponse() + print >> stderr, "Client status", res.status + if res.status != 200: + return None + return True + # handle a DELETE request if func == "delete": u = requesturi(self.url, car(args)) diff --git a/sca-cpp/trunk/modules/wsgi/server-test.py b/sca-cpp/trunk/modules/wsgi/server-test.py index 610ec05075..b2bc0efe98 100644 --- a/sca-cpp/trunk/modules/wsgi/server-test.py +++ b/sca-cpp/trunk/modules/wsgi/server-test.py @@ -41,5 +41,8 @@ def post(collection, item): def put(id, item): return True +def patch(id, item): + return True + def delete(id): return True diff --git a/sca-cpp/trunk/modules/wsgi/util.py b/sca-cpp/trunk/modules/wsgi/util.py index 24467fd2cb..f630455901 100644 --- a/sca-cpp/trunk/modules/wsgi/util.py +++ b/sca-cpp/trunk/modules/wsgi/util.py @@ -60,7 +60,7 @@ def reverse(l): def isNil(l): if isinstance(l, streampair): return l.isNil() - return l == () + return l is None or l == () def isSymbol(v): return isinstance(v, basestring) and v[0:1] == "'" @@ -132,11 +132,24 @@ def cons_stream(car, cdr): def assoc(k, l): if l == (): return None - if k == car(car(l)): return car(l) return assoc(k, cdr(l)) +def delAssoc(k, l): + if l == (): + return () + if k == car(car(l)): + return delAssoc(k, cdr(l)) + return cons(car(l), delAssoc(k, cdr(l))) + +def putAssoc(a, l): + if l == (): + return (a,) + if car(a) == car(car(l)): + return cons(a, cdr(l)) + return cons(car(l), putAssoc(a, cdr(l))) + # Currying / partial function application def curry(f, *args): return lambda *a: f(*(args + a)) diff --git a/sca-cpp/trunk/modules/wsgi/wiring-test b/sca-cpp/trunk/modules/wsgi/wiring-test index cbecc201e8..4a8d15a5bd 100755 --- a/sca-cpp/trunk/modules/wsgi/wiring-test +++ b/sca-cpp/trunk/modules/wsgi/wiring-test @@ -56,6 +56,10 @@ if [ "$rc" = "0" ]; then rc=$? fi if [ "$rc" = "0" ]; then + $curl_prefix/bin/curl $uri/client/111 -X PATCH -H "Content-type: application/atom+xml" --data @htdocs/test/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then $curl_prefix/bin/curl $uri/client/111 -X DELETE 2>/dev/null rc=$? fi diff --git a/sca-cpp/trunk/modules/wsgi/wsgi-test b/sca-cpp/trunk/modules/wsgi/wsgi-test index f8334b33ad..8deeb4d0ba 100755 --- a/sca-cpp/trunk/modules/wsgi/wsgi-test +++ b/sca-cpp/trunk/modules/wsgi/wsgi-test @@ -52,6 +52,10 @@ if [ "$rc" = "0" ]; then rc=$? fi if [ "$rc" = "0" ]; then + $curl_prefix/bin/curl http://localhost:8090/wsgi/111 -X PATCH -H "Content-type: application/atom+xml" --data @htdocs/test/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then $curl_prefix/bin/curl http://localhost:8090/wsgi/111 -X DELETE 2>/dev/null rc=$? fi |