summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/components/webservice/webservice-listener.cpp
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-01-30 08:06:00 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-01-30 08:06:00 +0000
commitc06d7a38b904247917462c3c1a780f95c68e0709 (patch)
tree09e734786aa4aa710b7248921185f9ace9454078 /sca-cpp/trunk/components/webservice/webservice-listener.cpp
parenteb644871fca453fbc7de6dc6746eade97cb3a848 (diff)
Added a Web service listener component integrating Axis2/C's mod_axis2. Consolidated a bit the HTTPD redirect functions (used to redirect to mod_axis2.) Minor updates to the README and INSTALL files.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@904733 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/trunk/components/webservice/webservice-listener.cpp')
-rw-r--r--sca-cpp/trunk/components/webservice/webservice-listener.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/sca-cpp/trunk/components/webservice/webservice-listener.cpp b/sca-cpp/trunk/components/webservice/webservice-listener.cpp
index 495eb3478c..7198a00749 100644
--- a/sca-cpp/trunk/components/webservice/webservice-listener.cpp
+++ b/sca-cpp/trunk/components/webservice/webservice-listener.cpp
@@ -35,17 +35,40 @@ namespace tuscany {
namespace webservice {
/**
+ * Redirect an HTTP request to the Axis2/C HTTPD module. The given relay lambda function
+ * is stored in the HTTPD request, for later retrieval by the Axis2 service to relay the request
+ * to a target component.
+ */
+extern "C" {
+ extern module axis2_module;
+}
+
+const value redirectToAxis2(const string& uri, request_rec* r, const value& relay) {
+ const failable<request_rec*, int> nr = httpd::internalRedirectRequest(uri, r);
+ if (!hasContent(nr))
+ return value(reason(nr));
+ ap_set_module_config(content(nr)->request_config, &axis2_module, const_cast<void*>((const void*)&relay));
+ return value(httpd::internalRedirect(content(nr)));
+}
+
+/**
* Handle an HTTP request.
*/
const failable<value> handle(const list<value>& params) {
- // Extract HTTPD request and relay reference
- unused request_rec* r = httpd::request(car(params));
- const lambda<value(const list<value>&)> relay = cadr(params);
+ // Extract HTTPD request from the params
+ request_rec* r = httpd::request(car(params));
+ httpdDebugRequest(r, "webservice::handle");
- //TODO Hook Axis2/C server module here
+ // Extract the relay lambda from the params and store it in the HTTPD request,
+ // for later retrieval by our Axis2 service
+ const value relay = cadr(params);
+ cout << "relay: " << &relay << endl;
- return value(true);
+ // Redirect HTTPD request to Mod-axis2
+ if (r->args == NULL)
+ return redirectToAxis2(httpd::redirectURI("/axis2", string(r->uri)), r, relay);
+ return redirectToAxis2(httpd::redirectURI("/axis2", string(r->uri), string(r->args)), r, relay);
}
}