summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/server
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-06-27 00:47:05 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-06-27 00:47:05 +0000
commitd7cc8057a36fb87292568989adb19c354b26a181 (patch)
tree3b6e3b62dffa921575f54ef10ef2a0d1bcebfc72 /sca-cpp/trunk/modules/server
parentdde314a44064dd8ddc63375078dacbaebbdd9a3f (diff)
Add support for user and email component properties, and minimal support for sign in using OpenID.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@958305 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/trunk/modules/server')
-rw-r--r--sca-cpp/trunk/modules/server/mod-eval.hpp53
1 files changed, 50 insertions, 3 deletions
diff --git a/sca-cpp/trunk/modules/server/mod-eval.hpp b/sca-cpp/trunk/modules/server/mod-eval.hpp
index e69e9c6f13..e46d8ba78a 100644
--- a/sca-cpp/trunk/modules/server/mod-eval.hpp
+++ b/sca-cpp/trunk/modules/server/mod-eval.hpp
@@ -234,7 +234,6 @@ const failable<int> del(request_rec* r, const lambda<value(const list<value>&)>&
* Translate a component request.
*/
int translate(request_rec *r) {
- gc_scoped_pool pool(r->pool);
if (strncmp(r->uri, "/components/", 12) != 0)
return DECLINED;
r->handler = "mod_tuscany_eval";
@@ -242,12 +241,32 @@ int translate(request_rec *r) {
}
/**
+ * Store current HTTP request for access from property lambda functions.
+ */
+#ifdef WANT_THREADS
+__thread
+#endif
+const request_rec* currentRequest = NULL;
+
+class scoped_request {
+public:
+ scoped_request(const request_rec* r) {
+ currentRequest = r;
+ }
+
+ ~scoped_request() {
+ currentRequest = NULL;
+ }
+};
+
+/**
* HTTP request handler.
*/
int handler(request_rec *r) {
- gc_scoped_pool pool(r->pool);
if(strcmp(r->handler, "mod_tuscany_eval"))
return DECLINED;
+ gc_scoped_pool pool(r->pool);
+ scoped_request sr(r);
httpdDebugRequest(r, "modeval::handler::input");
// Get the component implementation lambda
@@ -287,7 +306,8 @@ const list<value> refProxies(const list<value>& refs, const string& base, const
/**
* Convert a list of component properties to a list of lambda functions that just return
- * the property value.
+ * the property value. The user and email properties are configured with the values
+ * from the HTTP request, if any.
*/
struct propProxy {
const value v;
@@ -298,7 +318,34 @@ struct propProxy {
}
};
+struct emailPropProxy {
+ const value v;
+ emailPropProxy(const value& v) : v(v) {
+ }
+ const value operator()(unused const list<value>& params) const {
+ const char* email = apr_table_get(currentRequest->subprocess_env, "EMAIL");
+ if (email == NULL || *email == '\0')
+ return v;
+ return string(email);
+ }
+};
+
+struct userPropProxy {
+ const value v;
+ userPropProxy(const value& v) : v(v) {
+ }
+ const value operator()(unused const list<value>& params) const {
+ if (currentRequest->user == NULL)
+ return v;
+ return string(currentRequest->user);
+ }
+};
+
const value mkpropProxy(const value& prop) {
+ if (scdl::name(prop) == "email")
+ return lambda<value(const list<value>&)>(emailPropProxy(elementValue(prop)));
+ if (scdl::name(prop) == "user")
+ return lambda<value(const list<value>&)>(userPropProxy(elementValue(prop)));
return lambda<value(const list<value>&)>(propProxy(elementValue(prop)));
}