diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2010-02-28 20:01:44 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2010-02-28 20:01:44 +0000 |
commit | 8720acd237f415983c5ca2acd4b5135415114758 (patch) | |
tree | 9d736e5fcca561b60e66e5a5e0a59f924326e0c8 /sca-cpp/trunk/modules/wsgi/composite.py | |
parent | 4a56fb45307de579bf3ee88935c5c22a75c03512 (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-x | sca-cpp/trunk/modules/wsgi/composite.py | 103 |
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) |