summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/wsgi
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp/trunk/modules/wsgi')
-rw-r--r--sca-cpp/trunk/modules/wsgi/atomutil.py2
-rw-r--r--sca-cpp/trunk/modules/wsgi/client-test.py3
-rwxr-xr-xsca-cpp/trunk/modules/wsgi/composite.py8
-rw-r--r--sca-cpp/trunk/modules/wsgi/httputil.py14
-rw-r--r--sca-cpp/trunk/modules/wsgi/server-test.py3
-rw-r--r--sca-cpp/trunk/modules/wsgi/util.py17
-rwxr-xr-xsca-cpp/trunk/modules/wsgi/wiring-test4
-rwxr-xr-xsca-cpp/trunk/modules/wsgi/wsgi-test4
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