summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/wsgi/composite.py
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-02-28 20:01:44 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-02-28 20:01:44 +0000
commit8720acd237f415983c5ca2acd4b5135415114758 (patch)
tree9d736e5fcca561b60e66e5a5e0a59f924326e0c8 /sca-cpp/trunk/modules/wsgi/composite.py
parent4a56fb45307de579bf3ee88935c5c22a75c03512 (diff)
Strawman WSGI integration, allowing Python components to run in a Python WSGI server.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@917286 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rwxr-xr-xsca-cpp/trunk/modules/wsgi/composite.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/sca-cpp/trunk/modules/wsgi/composite.py b/sca-cpp/trunk/modules/wsgi/composite.py
new file mode 100755
index 0000000000..3d55aeb0ab
--- /dev/null
+++ b/sca-cpp/trunk/modules/wsgi/composite.py
@@ -0,0 +1,103 @@
+#!/usr/bin/python
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Composite deployment and integration with WSGI
+
+from wsgiref.simple_server import make_server
+from wsgiref.handlers import CGIHandler
+from os import environ
+from sys import stderr, argv
+from util import *
+from scdl import *
+
+def requestPath(e):
+ return e.get("PATH_INFO", "")
+
+def requestMethod(e):
+ return e.get("REQUEST_METHOD", "")
+
+def contentType(ct):
+ if ct == None:
+ return []
+ return [("Content-type", ct)]
+
+def status(st):
+ if st == 200:
+ return "200 OK"
+ if st == 404:
+ return "404 Not Found"
+ if st == 201:
+ return "201 Created"
+ return "500 Internal Server Error"
+
+def result(r, st, ct = None, b = ()):
+ r(status(st), contentType(ct))
+ return b
+
+# WSGI application function
+def application(e, r):
+
+ # Read the deployed composite
+ comps = components(parse("domain-test.composite"))
+ print >> stderr, comps
+
+ # Find the requested component
+ path = tokens(requestPath(e))
+ uc = uriToComponent(path, comps)
+ uri = car(uc)
+ if uri == None:
+ return result(r, 404)
+ comp = cadr(uc)
+ mod = __import__(cadr(comp))
+
+ # Call the requested component function
+ id = path[len(uri):]
+ print >> stderr, id
+ m = requestMethod(e)
+ if (m == "GET"):
+ v = mod.get(id)
+ print >> stderr, v
+
+ # write returned content-type / content pair
+ if not isinstance(cadr(v), basestring):
+ return result(r, 200, car(v), cadr(v))
+
+ # TODO write an ATOM feed or entry
+ if nil(id):
+ return result(r, 200, "application/atom+xml;type=feed", ("Atom feed"))
+ return result(r, 200, "application/atom+xml;type=entry", ("Atom entry"))
+
+ if m == "DELETE":
+ v = mod.delete(id)
+ if v == False:
+ return result(r, 404)
+ return result(r, 200)
+
+ # TODO implement POST and PUT methods
+ return result(r, 500)
+
+def serverType(e):
+ return e.get("SERVER_SOFTWARE", "")
+
+# Run the WSGI application
+if __name__ == "__main__":
+ st = serverType(environ)
+ if st == "":
+ make_server("", int(argv[1]), application).serve_forever()
+ else:
+ CGIHandler().run(application)