summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-07-08 06:38:07 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2010-07-08 06:38:07 +0000
commit211c686bc6d05d8d05e5490b9a9f612619461abc (patch)
treebb8f56afb24f2b52ea92598babff7d94fd70da10
parentf6a51224cc350c7d3b42b15051a9c074cce48b5d (diff)
More changes to get both single and mass dynamic virtual hosting working with HTTP and HTTPS.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@961589 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--sca-cpp/trunk/modules/http/Makefile.am2
-rwxr-xr-xsca-cpp/trunk/modules/http/httpd-conf35
-rwxr-xr-xsca-cpp/trunk/modules/http/httpd-ssl-conf50
-rw-r--r--sca-cpp/trunk/modules/http/httpd.hpp29
-rwxr-xr-xsca-cpp/trunk/modules/http/ssl-ca-conf (renamed from sca-cpp/trunk/modules/http/httpd-ca-conf)0
-rwxr-xr-xsca-cpp/trunk/modules/http/ssl-cert-conf (renamed from sca-cpp/trunk/modules/http/httpd-cert-conf)15
-rw-r--r--sca-cpp/trunk/modules/server/mod-eval.hpp59
-rw-r--r--sca-cpp/trunk/modules/server/mod-wiring.cpp34
-rwxr-xr-xsca-cpp/trunk/modules/server/server-conf16
-rwxr-xr-xsca-cpp/trunk/samples/store-cpp/ssl-start4
-rwxr-xr-xsca-cpp/trunk/samples/store-java/ssl-start4
-rwxr-xr-xsca-cpp/trunk/samples/store-nosql/ssl-start4
-rwxr-xr-xsca-cpp/trunk/samples/store-python/ssl-start4
-rwxr-xr-xsca-cpp/trunk/samples/store-python/uec2-start4
-rwxr-xr-xsca-cpp/trunk/samples/store-scheme/ssl-start4
-rwxr-xr-xsca-cpp/trunk/samples/store-sql/ssl-start4
-rw-r--r--sca-cpp/trunk/samples/store-vhost/Makefile.am2
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/jane/currency-converter.py (renamed from sca-cpp/trunk/samples/store-vhost/currency-converter.py)0
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/jane/fruits-catalog.py30
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/jane/shopping-cart.py (renamed from sca-cpp/trunk/samples/store-vhost/shopping-cart.py)0
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/jane/store.composite (renamed from sca-cpp/trunk/samples/store-vhost/store.composite)2
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/jane/store.py (renamed from sca-cpp/trunk/samples/store-vhost/store.py)0
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/joe/currency-converter.py29
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/joe/fruits-catalog.py (renamed from sca-cpp/trunk/samples/store-vhost/fruits-catalog.py)0
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/joe/shopping-cart.py75
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite69
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/joe/store.py40
-rw-r--r--sca-cpp/trunk/samples/store-vhost/htdocs/index.html137
-rwxr-xr-xsca-cpp/trunk/samples/store-vhost/server-test6
-rwxr-xr-xsca-cpp/trunk/samples/store-vhost/ssl-start18
-rwxr-xr-xsca-cpp/trunk/samples/store-vhost/start6
-rwxr-xr-xsca-cpp/trunk/samples/store-vhost/uec2-start18
32 files changed, 457 insertions, 243 deletions
diff --git a/sca-cpp/trunk/modules/http/Makefile.am b/sca-cpp/trunk/modules/http/Makefile.am
index 795137b6ca..f25ef170c9 100644
--- a/sca-cpp/trunk/modules/http/Makefile.am
+++ b/sca-cpp/trunk/modules/http/Makefile.am
@@ -20,7 +20,7 @@ INCLUDES = -I${HTTPD_INCLUDE}
incl_HEADERS = *.hpp
incldir = $(prefix)/include/modules/http
-dist_mod_SCRIPTS = httpd-conf httpd-start httpd-stop httpd-restart httpd-ca-conf httpd-cert-conf httpd-ssl-conf
+dist_mod_SCRIPTS = httpd-conf httpd-start httpd-stop httpd-restart ssl-ca-conf ssl-cert-conf httpd-ssl-conf
moddir=$(prefix)/modules/http
curl_test_SOURCES = curl-test.cpp
diff --git a/sca-cpp/trunk/modules/http/httpd-conf b/sca-cpp/trunk/modules/http/httpd-conf
index a6ba048f67..70c0b295af 100755
--- a/sca-cpp/trunk/modules/http/httpd-conf
+++ b/sca-cpp/trunk/modules/http/httpd-conf
@@ -30,13 +30,7 @@ htdocs=`readlink -f $4`
user=`id -un`
group=`id -gn`
modules_prefix=`cat $here/httpd-modules.prefix`
-if [ "$5" = "vhost" ]; then
- vhost="VirtualDocumentRoot $htdocs/domains/%1/"
- maxr="MaxRequestsPerChild 1"
-else
- vhost="#VirtualDocumentRoot $htdocs/domains/%1/"
- maxr="#MaxRequestsPerChild 1"
-fi
+vhost=$5
mkdir -p $root
mkdir -p $root/logs
@@ -123,19 +117,34 @@ Options FollowSymLinks
Allow from all
</Location>
-# Setup HTTP virtual host
+# Setup HTTP virtual hosts
Listen $port
-<VirtualHost _default_:$port>
+
+<VirtualHost *:$port>
ServerName http://$host:$pport
UseCanonicalName Off
-UseCanonicalPhysicalPort Off
+</VirtualHost>
+
+EOF
+# Generate mass dynamic virtual hosting configuration
+if [ "$vhost" = "vhost" ]; then
+
+cat >>$root/conf/httpd.conf <<EOF
# Setup mass dynamic virtual hosting
-$vhost
+NameVirtualHost *:$port
+
+<VirtualHost *:$port>
+ServerName http://vhost.$host:$pport
+ServerAlias *.$host
+UseCanonicalName Off
+VirtualDocumentRoot $htdocs/domains/%1/
</VirtualHost>
-# Isolate dynamic virtual hosts
-$maxr
+# Isolate virtual host based requests
+MaxRequestsPerChild 1
EOF
+fi
+
diff --git a/sca-cpp/trunk/modules/http/httpd-ssl-conf b/sca-cpp/trunk/modules/http/httpd-ssl-conf
index 04ca61dba0..f6082dea14 100755
--- a/sca-cpp/trunk/modules/http/httpd-ssl-conf
+++ b/sca-cpp/trunk/modules/http/httpd-ssl-conf
@@ -28,6 +28,7 @@ if [ "$sslpport" = "" ]; then
fi
htdocs=`readlink -f $4`
httpd_prefix=`cat $here/httpd.prefix`
+vhost=$5
# Extract organization name from our CA certificate
org=`openssl x509 -noout -subject -nameopt multiline -in $root/conf/ca.crt | grep organizationName | awk -F "= " '{ print $2 }'`
@@ -51,19 +52,31 @@ SSLMutex "file:$root/logs/ssl_mutex"
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
-# HTTPS virtual host
+# Setup HTTPS virtual hosts
Listen $sslport
-<VirtualHost _default_:$sslport>
+
+SSLCACertificateFile "$root/conf/ca.crt"
+SSLCertificateFile "$root/conf/server.crt"
+SSLCertificateKeyFile "$root/conf/server.key"
+
+<VirtualHost *:$sslport>
ServerName https://$host:$sslpport
UseCanonicalName Off
-UseCanonicalPhysicalPort Off
# Enable SSL
+Include conf/ssl-vhost.conf
+</VirtualHost>
+
+# Route all wiring through HTTPS
+SCAWiringServerName https://$host:$sslpport
+
+EOF
+
+# Generate VirtualHost SSL configuration
+cat >$root/conf/ssl-vhost.conf <<EOF
+# Enable SSL
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
-SSLCACertificateFile "$root/conf/ca.crt"
-SSLCertificateFile "$root/conf/server.crt"
-SSLCertificateKeyFile "$root/conf/server.key"
BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
# Logging
@@ -88,12 +101,35 @@ AuthType Basic
AuthName "$host"
AuthUserFile "$root/conf/httpd.passwd"
Require valid-user
-</location>
+</Location>
+
+EOF
+
+# Generate mass dynamic virtual hosting configuration
+if [ "$vhost" = "vhost" ]; then
+
+cat >>$root/conf/httpd.conf <<EOF
+# Setup mass dynamic virtual hosting
+NameVirtualHost *:$sslport
+SSLStrictSNIVHostCheck Off
+<VirtualHost *:$sslport>
+ServerName https://vhost.$host:$sslpport
+ServerAlias *.$host
+UseCanonicalName Off
+VirtualDocumentRoot $htdocs/domains/%1/
+
+# Enable SSL
+SSLCACertificateFile "$root/conf/ca.crt"
+SSLCertificateFile "$root/conf/vhost.crt"
+SSLCertificateKeyFile "$root/conf/vhost.key"
+Include conf/ssl-vhost.conf
</VirtualHost>
EOF
+fi
+
# Create test users for HTTP basic authentication
$httpd_prefix/bin/htpasswd -bc $root/conf/httpd.passwd test test 2>/dev/null
$httpd_prefix/bin/htpasswd -b $root/conf/httpd.passwd foo foo 2>/dev/null
diff --git a/sca-cpp/trunk/modules/http/httpd.hpp b/sca-cpp/trunk/modules/http/httpd.hpp
index bd4f6e8ada..05403a5897 100644
--- a/sca-cpp/trunk/modules/http/httpd.hpp
+++ b/sca-cpp/trunk/modules/http/httpd.hpp
@@ -100,6 +100,35 @@ const string serverName(request_rec* r) {
}
/**
+ * Return the host name for a server.
+ */
+const string hostName(const server_rec* s) {
+ return s->server_hostname != NULL? s->server_hostname : "localhost";
+}
+
+/**
+ * Return the host name from an HTTP request.
+ */
+const string hostName(request_rec* r) {
+ const char* hn = ap_get_server_name(r);
+ return hn != NULL? hn : (r->server->server_hostname != NULL? r->server->server_hostname : "localhost");
+}
+
+/**
+ * Return the first subdomain name in a host name.
+ */
+const string subdomain(const string& host) {
+ return substr(host, 0, find(host, '.'));
+}
+
+/**
+ * Return true if a request is targeting a virtual host.
+ */
+const bool isVirtualHostRequest(const server_rec* s, request_rec* r) {
+ return serverName(r) != serverName(s);
+}
+
+/**
* Return the content type of a request.
*/
const char* optional(const char* s) {
diff --git a/sca-cpp/trunk/modules/http/httpd-ca-conf b/sca-cpp/trunk/modules/http/ssl-ca-conf
index c5a3f8e894..c5a3f8e894 100755
--- a/sca-cpp/trunk/modules/http/httpd-ca-conf
+++ b/sca-cpp/trunk/modules/http/ssl-ca-conf
diff --git a/sca-cpp/trunk/modules/http/httpd-cert-conf b/sca-cpp/trunk/modules/http/ssl-cert-conf
index b6dc8ebd6f..a7a1103d1a 100755
--- a/sca-cpp/trunk/modules/http/httpd-cert-conf
+++ b/sca-cpp/trunk/modules/http/ssl-cert-conf
@@ -21,16 +21,21 @@
here=`readlink -f $0`; here=`dirname $here`
root=`readlink -f $1`
host=$2
+if [ "$3" != "" ]; then
+ certname=$3
+else
+ certname="server"
+fi
# Don't regenerate the certificate if it already exists
-if [ -f $root/conf/server.crt ]; then
+if [ -f $root/conf/$certname.crt ]; then
return 0
fi
# Generate openssl configuration
mkdir -p $root/conf
umask 0007
-cat >$root/conf/openssl-cert.conf <<EOF
+cat >$root/conf/openssl-cert-$certname.conf <<EOF
[ req ]
default_bits = 1024
encrypt_key = no
@@ -48,11 +53,11 @@ emailAddress = root@$host
EOF
# Generate a certificate request
-openssl req -new -config $root/conf/openssl-cert.conf -out $root/conf/server-req.crt -keyout $root/conf/server.key
+openssl req -new -config $root/conf/openssl-cert-$certname.conf -out $root/conf/$certname-req.crt -keyout $root/conf/$certname.key
# Generate a certificate, signed with our test certification authority certificate
-openssl ca -batch -config $root/conf/openssl-ca.conf -out $root/conf/server.crt -infiles $root/conf/server-req.crt
+openssl ca -batch -config $root/conf/openssl-ca.conf -out $root/conf/$certname.crt -infiles $root/conf/$certname-req.crt
# Export it to PKCS12 format, that's the format Web browsers want to import
-openssl pkcs12 -export -passout pass: -out $root/conf/server.p12 -inkey $root/conf/server.key -in $root/conf/server.crt -certfile $root/conf/ca.crt
+openssl pkcs12 -export -passout pass: -out $root/conf/$certname.p12 -inkey $root/conf/$certname.key -in $root/conf/$certname.crt -certfile $root/conf/ca.crt
diff --git a/sca-cpp/trunk/modules/server/mod-eval.hpp b/sca-cpp/trunk/modules/server/mod-eval.hpp
index 464e0eabf1..ded496a0bf 100644
--- a/sca-cpp/trunk/modules/server/mod-eval.hpp
+++ b/sca-cpp/trunk/modules/server/mod-eval.hpp
@@ -78,6 +78,13 @@ const bool hasCompositeConf(const ServerConf& sc) {
}
/**
+ * Return true if a server contains a virtual host composite configuration.
+ */
+const bool hasVirtualCompositeConf(const ServerConf& sc) {
+ return sc.virtualHostContributionPath != "" && sc.virtualHostCompositeName != "";
+}
+
+/**
* Convert a result represented as a content + failure pair to a
* failable monad.
*/
@@ -421,6 +428,11 @@ const failable<list<value> > applyLifecycleExpr(const list<value>& impls, const
const failable<bool> confComponents(ServerConf& sc) {
if (!hasCompositeConf(sc))
return false;
+ debug(sc.contributionPath, "modeval::confComponents::contributionPath");
+ debug(sc.compositeName, "modeval::confComponents::compositeName");
+ if (sc.ca != "") debug(sc.ca, "modeval::confComponents::sslCA");
+ if (sc.cert != "") debug(sc.cert, "modeval::confComponents::sslCert");
+ if (sc.key != "") debug(sc.key, "modeval::confComponents::sslKey");
// Chdir to the deployed contribution
if (chdir(c_str(sc.contributionPath)) != 0)
@@ -462,9 +474,8 @@ const failable<bool> startComponents(ServerConf& sc) {
class VirtualHostConf {
public:
VirtualHostConf(const ServerConf& ssc) : sc(ssc.server) {
- sc.contributionPath = ssc.virtualHostContributionPath;
- sc.compositeName = ssc.virtualHostCompositeName;
- sc.wiringServerName = ssc.wiringServerName;
+ sc.virtualHostContributionPath = ssc.virtualHostContributionPath;
+ sc.virtualHostCompositeName = ssc.virtualHostCompositeName;
sc.ca = ssc.ca;
sc.cert = ssc.cert;
sc.key = ssc.key;
@@ -489,10 +500,14 @@ const failable<bool> virtualHostConfig(ServerConf& sc, request_rec* r) {
debug(httpd::serverName(r), "modeval::virtualHostConfig::virtualHostName");
sc.wiringServerName = httpd::serverName(r);
debug(sc.wiringServerName, "modeval::virtualHostConfig::wiringServerName");
+ debug(sc.virtualHostContributionPath, "modwiring::virtualHostConfig::virtualHostContributionPath");
+
+ // Resolve the configured virtual contribution under
+ // the virtual host's SCA contribution root
+ sc.contributionPath = sc.virtualHostContributionPath + httpd::subdomain(httpd::hostName(r)) + "/";
+ sc.compositeName = sc.virtualHostCompositeName;
// Configure the deployed components
- debug(sc.contributionPath, "modeval::virtualHostConfig::contributionPath");
- debug(sc.compositeName, "modeval::virtualHostConfig::compositeName");
const failable<bool> cr = confComponents(sc);
if (!hasContent(cr))
return cr;
@@ -529,8 +544,8 @@ int handler(request_rec *r) {
// Process dynamic virtual host configuration, if any
VirtualHostConf vhc(sc);
- const bool hasv = hasCompositeConf(vhc.sc);
- if (hasv) {
+ const bool usevh = hasVirtualCompositeConf(vhc.sc) && httpd::isVirtualHostRequest(sc.server, r);
+ if (usevh) {
const failable<bool> cr = virtualHostConfig(vhc.sc, r);
if (!hasContent(cr))
return httpd::reportStatus(mkfailure<int>(reason(cr)));
@@ -538,7 +553,7 @@ int handler(request_rec *r) {
// Get the component implementation lambda
const list<value> path(pathValues(r->uri));
- const list<value> impl(assoctree<value>(cadr(path), hasv? vhc.sc.implTree : sc.implTree));
+ const list<value> impl(assoctree<value>(cadr(path), usevh? vhc.sc.implTree : sc.implTree));
if (isNil(impl))
return httpd::reportStatus(mkfailure<int>(string("Couldn't find component implementation")));
@@ -584,17 +599,17 @@ apr_status_t serverCleanup(void* v) {
const int postConfigMerge(const ServerConf& mainsc, server_rec* s) {
if (s == NULL)
return OK;
- ostringstream sname;
- debug(httpd::serverName(s), "modeval::postConfigMerge::serverName");
ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_eval);
- sc.wiringServerName = mainsc.wiringServerName;
+ debug(httpd::serverName(s), "modeval::postConfigMerge::serverName");
+ if (sc.wiringServerName == "") sc.wiringServerName = httpd::serverName(s);
+ debug(httpd::serverName(s), "modeval::postConfigMerge::wiringServerName");
sc.contributionPath = mainsc.contributionPath;
sc.compositeName = mainsc.compositeName;
sc.virtualHostContributionPath = mainsc.virtualHostContributionPath;
sc.virtualHostCompositeName = mainsc.virtualHostCompositeName;
- sc.ca = mainsc.ca;
- sc.cert = mainsc.cert;
- sc.key = mainsc.key;
+ if (sc.ca == "") sc.ca = mainsc.ca;
+ if (sc.cert == "") sc.cert = mainsc.cert;
+ if (sc.key == "") sc.key = mainsc.key;
sc.implementations = mainsc.implementations;
sc.implTree = mainsc.implTree;
return postConfigMerge(mainsc, s->next);
@@ -608,8 +623,7 @@ int postConfig(apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp,
// Get the server configuration and determine the wiring server name
ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_eval);
debug(httpd::serverName(s), "modeval::postConfig::serverName");
- if (sc.wiringServerName == "")
- sc.wiringServerName = httpd::serverName(s);
+ if (sc.wiringServerName == "") sc.wiringServerName = httpd::serverName(s);
debug(sc.wiringServerName, "modeval::postConfig::wiringServerName");
// Count the calls to post config
@@ -638,8 +652,6 @@ int postConfig(apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp,
}
// Configure the deployed components
- debug(sc.contributionPath, "modeval::postConfig::contributionPath");
- debug(sc.compositeName, "modeval::postConfig::compositeName");
const failable<bool> res = confComponents(sc);
if (!hasContent(res)) {
cerr << "[Tuscany] Due to one or more errors mod_tuscany_eval loading failed. Causing apache to stop loading." << endl;
@@ -649,7 +661,7 @@ int postConfig(apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp,
// Register a cleanup callback, called when the server is stopped or restarted
apr_pool_pre_cleanup_register(p, (void*)&sc, serverCleanup);
- // Merge the config into any virtual hosts
+ // Merge the configuration into the virtual hosts
return postConfigMerge(sc, s->next);
}
@@ -670,6 +682,9 @@ void childInit(apr_pool_t* p, server_rec* s) {
cerr << "[Tuscany] Due to one or more errors mod_tuscany_eval loading failed. Causing apache to stop loading." << endl;
exit(APEXIT_CHILDFATAL);
}
+
+ // Merge the updated configuration into the virtual hosts
+ postConfigMerge(*sc, s->next);
// Register a cleanup callback, called when the child is stopped or restarted
apr_pool_pre_cleanup_register(p, (void*)sc, serverCleanup);
@@ -743,9 +758,9 @@ const command_rec commands[] = {
AP_INIT_TAKE1("SCAVirtualContribution", (const char*(*)())confVirtualContribution, NULL, RSRC_CONF, "SCA virtual host contribution location"),
AP_INIT_TAKE1("SCAVirtualComposite", (const char*(*)())confVirtualComposite, NULL, RSRC_CONF, "SCA virtual composite location"),
AP_INIT_TAKE12("SCASetEnv", (const char*(*)())confEnv, NULL, OR_FILEINFO, "Environment variable name and optional value"),
- AP_INIT_TAKE1("SCASSLCACertificateFile", (const char*(*)())confCAFile, NULL, RSRC_CONF, "SSL CA certificate file"),
- AP_INIT_TAKE1("SCASSLCertificateFile", (const char*(*)())confCertFile, NULL, RSRC_CONF, "SSL certificate file"),
- AP_INIT_TAKE1("SCASSLCertificateKeyFile", (const char*(*)())confCertKeyFile, NULL, RSRC_CONF, "SSL certificate key file"),
+ AP_INIT_TAKE1("SSLCACertificateFile", (const char*(*)())confCAFile, NULL, RSRC_CONF, "SSL CA certificate file"),
+ AP_INIT_TAKE1("SSLCertificateFile", (const char*(*)())confCertFile, NULL, RSRC_CONF, "SSL certificate file"),
+ AP_INIT_TAKE1("SSLCertificateKeyFile", (const char*(*)())confCertKeyFile, NULL, RSRC_CONF, "SSL certificate key file"),
{NULL, NULL, NULL, 0, NO_ARGS, NULL}
};
diff --git a/sca-cpp/trunk/modules/server/mod-wiring.cpp b/sca-cpp/trunk/modules/server/mod-wiring.cpp
index 5b2aba73b3..964f7efc82 100644
--- a/sca-cpp/trunk/modules/server/mod-wiring.cpp
+++ b/sca-cpp/trunk/modules/server/mod-wiring.cpp
@@ -72,6 +72,13 @@ const bool hasCompositeConf(const ServerConf& sc) {
}
/**
+ * Return true if a server contains a virtual host composite configuration.
+ */
+const bool hasVirtualCompositeConf(const ServerConf& sc) {
+ return sc.virtualHostContributionPath != "" && sc.virtualHostCompositeName != "";
+}
+
+/**
* Returns true if a URI is absolute.
*/
const bool isAbsolute(const string& uri) {
@@ -235,6 +242,8 @@ const list<value> uriToComponentAssoc(const list<value>& c) {
const bool confComponents(ServerConf& sc) {
if (!hasCompositeConf(sc))
return true;
+ debug(sc.contributionPath, "modwiring::confComponents::contributionPath");
+ debug(sc.compositeName, "modwiring::confComponents::compositeName");
// Read the component configuration and store the references and service URIs
// in trees for fast retrieval later
@@ -257,8 +266,8 @@ const bool confComponents(ServerConf& sc) {
class VirtualHostConf {
public:
VirtualHostConf(const ServerConf& ssc) : sc(ssc.server) {
- sc.contributionPath = ssc.virtualHostContributionPath;
- sc.compositeName = ssc.virtualHostCompositeName;
+ sc.virtualHostContributionPath = ssc.virtualHostContributionPath;
+ sc.virtualHostCompositeName = ssc.virtualHostCompositeName;
}
~VirtualHostConf() {
@@ -273,10 +282,14 @@ public:
const failable<bool> virtualHostConfig(ServerConf& sc, request_rec* r) {
debug(httpd::serverName(sc.server), "modwiring::virtualHostConfig::serverName");
debug(httpd::serverName(r), "modwiring::virtualHostConfig::virtualHostName");
+ debug(sc.virtualHostContributionPath, "modwiring::virtualHostConfig::virtualHostContributionPath");
+
+ // Resolve the configured virtual contribution under
+ // the virtual host's SCA contribution root
+ sc.contributionPath = sc.virtualHostContributionPath + httpd::subdomain(httpd::hostName(r)) + "/";
+ sc.compositeName = sc.virtualHostCompositeName;
// Configure the wiring for the deployed components
- debug(sc.contributionPath, "modwiring::virtualHostConfig::contributionPath");
- debug(sc.compositeName, "modwiring::virtualHostConfig::compositeName");
confComponents(sc);
return true;
}
@@ -297,8 +310,8 @@ int translate(request_rec *r) {
// Process dynamic virtual host configuration, if any
VirtualHostConf vhc(sc);
- const bool hasv = hasCompositeConf(vhc.sc);
- if (hasv) {
+ const bool usevh = hasVirtualCompositeConf(vhc.sc) && httpd::isVirtualHostRequest(sc.server, r);
+ if (usevh) {
const failable<bool> cr = virtualHostConfig(vhc.sc, r);
if (!hasContent(cr))
return -1;
@@ -306,10 +319,10 @@ int translate(request_rec *r) {
// Translate a component reference request
if (!strncmp(r->uri, "/references/", 12))
- return translateReference(hasv? vhc.sc: sc, r);
+ return translateReference(usevh? vhc.sc: sc, r);
// Translate a service request
- return translateService(hasv? vhc.sc : sc, r);
+ return translateService(usevh? vhc.sc : sc, r);
}
/**
@@ -340,7 +353,6 @@ int handler(request_rec *r) {
const int postConfigMerge(const ServerConf& mainsc, server_rec* s) {
if (s == NULL)
return OK;
- ostringstream sname;
debug(httpd::serverName(s), "modwiring::postConfigMerge::serverName");
ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_wiring);
sc.contributionPath = mainsc.contributionPath;
@@ -364,10 +376,8 @@ int postConfig(unused apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t
return OK;
// Configure the wiring for the deployed components
- ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_wiring);
debug(httpd::serverName(s), "modwiring::postConfig::serverName");
- debug(sc.contributionPath, "modwiring::postConfig::contributionPath");
- debug(sc.compositeName, "modwiring::postConfig::compositeName");
+ ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_wiring);
confComponents(sc);
// Merge the config into any virtual hosts
diff --git a/sca-cpp/trunk/modules/server/server-conf b/sca-cpp/trunk/modules/server/server-conf
index cff1ab1965..359a8ebc16 100755
--- a/sca-cpp/trunk/modules/server/server-conf
+++ b/sca-cpp/trunk/modules/server/server-conf
@@ -21,25 +21,9 @@
here=`readlink -f $0`; here=`dirname $here`
root=`readlink -f $1`
-servername=`cat $root/conf/httpd.conf | grep ServerName | tail -1 | awk '{ print $2 }'`
-host=`echo $servername | awk -F ":" '{ printf "%s:%s", $1, $2 }'`
-port=`cat $root/conf/httpd.conf | grep Listen | tail -1 | awk '{ print $2 }'`
-
-ssl=`cat $root/conf/httpd.conf | grep "SSLEngine" | awk '{ print $2 }'`
-if [ "$ssl" = "on" ]; then
-cat >>$root/conf/httpd.conf <<EOF
-# Configure SCA SSL support
-SCASSLCACertificateFile "$root/conf/ca.crt"
-SCASSLCertificateFile "$root/conf/server.crt"
-SCASSLCertificateKeyFile "$root/conf/server.key"
-
-EOF
-fi
-
cat >>$root/conf/httpd.conf <<EOF
# Support for SCA component wiring
LoadModule mod_tuscany_wiring $here/libmod_tuscany_wiring.so
-#SCAWiringServerName $host:$port
# Serve HTTP binding JavaScript client code
Alias /js/tuscany-ref.js $here/htdocs/js/tuscany-ref.js
diff --git a/sca-cpp/trunk/samples/store-cpp/ssl-start b/sca-cpp/trunk/samples/store-cpp/ssl-start
index 9cb5b88974..87622e48b0 100755
--- a/sca-cpp/trunk/samples/store-cpp/ssl-start
+++ b/sca-cpp/trunk/samples/store-cpp/ssl-start
@@ -17,8 +17,8 @@
# specific language governing permissions and limitations
# under the License.
-../../modules/http/httpd-ca-conf tmp localhost
-../../modules/http/httpd-cert-conf tmp localhost
+../../modules/http/ssl-ca-conf tmp localhost
+../../modules/http/ssl-cert-conf tmp localhost
../../modules/http/httpd-conf tmp localhost 8090 htdocs
../../modules/http/httpd-ssl-conf tmp localhost 8453 htdocs
../../modules/server/server-conf tmp
diff --git a/sca-cpp/trunk/samples/store-java/ssl-start b/sca-cpp/trunk/samples/store-java/ssl-start
index ec44ba1ac0..2573e5189a 100755
--- a/sca-cpp/trunk/samples/store-java/ssl-start
+++ b/sca-cpp/trunk/samples/store-java/ssl-start
@@ -17,8 +17,8 @@
# specific language governing permissions and limitations
# under the License.
-../../modules/http/httpd-ca-conf tmp localhost
-../../modules/http/httpd-cert-conf tmp localhost
+../../modules/http/ssl-ca-conf tmp localhost
+../../modules/http/ssl-cert-conf tmp localhost
../../modules/http/httpd-conf tmp localhost 8090 htdocs
../../modules/http/httpd-ssl-conf tmp localhost 8453 htdocs
../../modules/server/server-conf tmp
diff --git a/sca-cpp/trunk/samples/store-nosql/ssl-start b/sca-cpp/trunk/samples/store-nosql/ssl-start
index b18a8e4af1..9dd9ce11bb 100755
--- a/sca-cpp/trunk/samples/store-nosql/ssl-start
+++ b/sca-cpp/trunk/samples/store-nosql/ssl-start
@@ -17,8 +17,8 @@
# specific language governing permissions and limitations
# under the License.
-../../modules/http/httpd-ca-conf tmp localhost
-../../modules/http/httpd-cert-conf tmp localhost
+../../modules/http/ssl-ca-conf tmp localhost
+../../modules/http/ssl-cert-conf tmp localhost
../../modules/http/httpd-conf tmp localhost 8090 htdocs
../../modules/http/httpd-ssl-conf tmp localhost 8453 htdocs
../../modules/server/server-conf tmp
diff --git a/sca-cpp/trunk/samples/store-python/ssl-start b/sca-cpp/trunk/samples/store-python/ssl-start
index 1e70d6edfb..fa3efcbe14 100755
--- a/sca-cpp/trunk/samples/store-python/ssl-start
+++ b/sca-cpp/trunk/samples/store-python/ssl-start
@@ -17,8 +17,8 @@
# specific language governing permissions and limitations
# under the License.
-../../modules/http/httpd-ca-conf tmp localhost
-../../modules/http/httpd-cert-conf tmp localhost
+../../modules/http/ssl-ca-conf tmp localhost
+../../modules/http/ssl-cert-conf tmp localhost
../../modules/http/httpd-conf tmp localhost 8090 htdocs
../../modules/http/httpd-ssl-conf tmp localhost 8453 htdocs
../../modules/server/server-conf tmp
diff --git a/sca-cpp/trunk/samples/store-python/uec2-start b/sca-cpp/trunk/samples/store-python/uec2-start
index 2e59815637..57f8c5ef22 100755
--- a/sca-cpp/trunk/samples/store-python/uec2-start
+++ b/sca-cpp/trunk/samples/store-python/uec2-start
@@ -28,8 +28,8 @@ fi
sudo ../../ubuntu/ip-redirect 80 8090
sudo ../../ubuntu/ip-redirect 443 8453
-../../modules/http/httpd-ca-conf tmp $host
-../../modules/http/httpd-cert-conf tmp $host
+../../modules/http/ssl-ca-conf tmp $host
+../../modules/http/ssl-cert-conf tmp $host
../../modules/http/httpd-conf tmp $host 8090/80 htdocs
../../modules/http/httpd-ssl-conf tmp $host 8453/443 htdocs
../../modules/server/server-conf tmp
diff --git a/sca-cpp/trunk/samples/store-scheme/ssl-start b/sca-cpp/trunk/samples/store-scheme/ssl-start
index 14b85f5342..5060137cd5 100755
--- a/sca-cpp/trunk/samples/store-scheme/ssl-start
+++ b/sca-cpp/trunk/samples/store-scheme/ssl-start
@@ -17,8 +17,8 @@
# specific language governing permissions and limitations
# under the License.
-../../modules/http/httpd-ca-conf tmp localhost
-../../modules/http/httpd-cert-conf tmp localhost
+../../modules/http/ssl-ca-conf tmp localhost
+../../modules/http/ssl-cert-conf tmp localhost
../../modules/http/httpd-conf tmp localhost 8090 htdocs
../../modules/http/httpd-ssl-conf tmp localhost 8453 htdocs
../../modules/server/server-conf tmp
diff --git a/sca-cpp/trunk/samples/store-sql/ssl-start b/sca-cpp/trunk/samples/store-sql/ssl-start
index 8e27d31a2e..ea60c527c4 100755
--- a/sca-cpp/trunk/samples/store-sql/ssl-start
+++ b/sca-cpp/trunk/samples/store-sql/ssl-start
@@ -17,8 +17,8 @@
# specific language governing permissions and limitations
# under the License.
-../../modules/http/httpd-ca-conf tmp localhost
-../../modules/http/httpd-cert-conf tmp localhost
+../../modules/http/ssl-ca-conf tmp localhost
+../../modules/http/ssl-cert-conf tmp localhost
../../modules/http/httpd-conf tmp localhost 8090 htdocs
../../modules/http/httpd-ssl-conf tmp localhost 8453 htdocs
../../modules/server/server-conf tmp
diff --git a/sca-cpp/trunk/samples/store-vhost/Makefile.am b/sca-cpp/trunk/samples/store-vhost/Makefile.am
index 61933afd35..8623f468fb 100644
--- a/sca-cpp/trunk/samples/store-vhost/Makefile.am
+++ b/sca-cpp/trunk/samples/store-vhost/Makefile.am
@@ -20,7 +20,7 @@ if WANT_PYTHON
dist_sample_SCRIPTS = start stop ssl-start uec2-start
sampledir = $(prefix)/samples/store-vhost
-nobase_dist_sample_DATA = currency-converter.py fruits-catalog.py shopping-cart.py store.py store.composite htdocs/*.html htdocs/domains/joe/*.html htdocs/domains/jane/*.html
+nobase_dist_sample_DATA = htdocs/*.html htdocs/domains/*/*.html domains/*/*.py domains/*/*.composite
dist_noinst_SCRIPTS = server-test
#TESTS = server-test
diff --git a/sca-cpp/trunk/samples/store-vhost/currency-converter.py b/sca-cpp/trunk/samples/store-vhost/domains/jane/currency-converter.py
index 2fded8f616..2fded8f616 100644
--- a/sca-cpp/trunk/samples/store-vhost/currency-converter.py
+++ b/sca-cpp/trunk/samples/store-vhost/domains/jane/currency-converter.py
diff --git a/sca-cpp/trunk/samples/store-vhost/domains/jane/fruits-catalog.py b/sca-cpp/trunk/samples/store-vhost/domains/jane/fruits-catalog.py
new file mode 100644
index 0000000000..3d108f42eb
--- /dev/null
+++ b/sca-cpp/trunk/samples/store-vhost/domains/jane/fruits-catalog.py
@@ -0,0 +1,30 @@
+# 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.
+
+# Catalog implementation
+
+def getcatalog(converter, currencyCode):
+ code = currencyCode()
+ def convert(price):
+ return converter("convert", "USD", code, price)
+ symbol = converter("symbol", code)
+ return (
+ (("'javaClass", "services.Item"), ("'name", "Passion"), ("'currencyCode", code), ("'currencySymbol", symbol), ("'price", convert(2.99))),
+ (("'javaClass", "services.Item"), ("'name", "Mango"), ("'currencyCode", code), ("'currencySymbol", symbol), ("'price", convert(3.55))),
+ (("'javaClass", "services.Item"), ("'name", "Pineapple"), ("'currencyCode", code), ("'currencySymbol", symbol), ("'price", convert(1.55)))
+ )
+
diff --git a/sca-cpp/trunk/samples/store-vhost/shopping-cart.py b/sca-cpp/trunk/samples/store-vhost/domains/jane/shopping-cart.py
index 405adb85bf..405adb85bf 100644
--- a/sca-cpp/trunk/samples/store-vhost/shopping-cart.py
+++ b/sca-cpp/trunk/samples/store-vhost/domains/jane/shopping-cart.py
diff --git a/sca-cpp/trunk/samples/store-vhost/store.composite b/sca-cpp/trunk/samples/store-vhost/domains/jane/store.composite
index 045ebe6ec5..893b4f0ed4 100644
--- a/sca-cpp/trunk/samples/store-vhost/store.composite
+++ b/sca-cpp/trunk/samples/store-vhost/domains/jane/store.composite
@@ -60,7 +60,7 @@
</component>
<component name="Cache">
- <implementation.cpp path="../../components/cache" library="libmemcache"/>
+ <implementation.cpp path="../../../../components/cache" library="libmemcache"/>
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
diff --git a/sca-cpp/trunk/samples/store-vhost/store.py b/sca-cpp/trunk/samples/store-vhost/domains/jane/store.py
index 0b4e0f72fd..0b4e0f72fd 100644
--- a/sca-cpp/trunk/samples/store-vhost/store.py
+++ b/sca-cpp/trunk/samples/store-vhost/domains/jane/store.py
diff --git a/sca-cpp/trunk/samples/store-vhost/domains/joe/currency-converter.py b/sca-cpp/trunk/samples/store-vhost/domains/joe/currency-converter.py
new file mode 100644
index 0000000000..2fded8f616
--- /dev/null
+++ b/sca-cpp/trunk/samples/store-vhost/domains/joe/currency-converter.py
@@ -0,0 +1,29 @@
+# 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.
+
+# Currency converter implementation
+
+def convert(fr, to, amount):
+ if to == "EUR":
+ return amount * 0.70
+ return amount
+
+def symbol(currency):
+ if currency == "EUR":
+ return "E"
+ return "$"
+
diff --git a/sca-cpp/trunk/samples/store-vhost/fruits-catalog.py b/sca-cpp/trunk/samples/store-vhost/domains/joe/fruits-catalog.py
index 2a6d726fdc..2a6d726fdc 100644
--- a/sca-cpp/trunk/samples/store-vhost/fruits-catalog.py
+++ b/sca-cpp/trunk/samples/store-vhost/domains/joe/fruits-catalog.py
diff --git a/sca-cpp/trunk/samples/store-vhost/domains/joe/shopping-cart.py b/sca-cpp/trunk/samples/store-vhost/domains/joe/shopping-cart.py
new file mode 100644
index 0000000000..405adb85bf
--- /dev/null
+++ b/sca-cpp/trunk/samples/store-vhost/domains/joe/shopping-cart.py
@@ -0,0 +1,75 @@
+# 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.
+
+# Shopping cart implementation
+import uuid
+import sys
+
+cartId = "1234"
+
+# Get the shopping cart from the cache
+# Return an empty cart if not found
+def getcart(id, cache):
+ cart = cache("get", (id,))
+ if cart is None:
+ return ()
+ return cart
+
+# Post a new item to the cart, create a new cart if necessary
+def post(collection, item, cache):
+ id = str(uuid.uuid1())
+ cart = ((item[0], id, item[2]),) + getcart(cartId, cache)
+ cache("put", (cartId,), cart)
+ return (id,)
+
+
+# Find an item in the cart
+def find(id, cart):
+ if cart == ():
+ return ("Item", "0", ())
+ elif id == cart[0][1]:
+ return cart[0]
+ else:
+ return find(id, cart[1:])
+
+# Get items from the cart
+def get(id, cache):
+ if id == ():
+ return ("Your Cart", cartId) + getcart(cartId, cache)
+ return find(id[0], getcart(cartId, cache))
+
+# Delete items from the cart
+def delete(id, cache):
+ if id == ():
+ return cache("delete", (cartId,))
+ return True
+
+# Return the price of an item
+def price(item):
+ return float(filter(lambda x: x[0] == "'price", item[2])[0][1])
+
+# Sum the prices of a list of items
+def sum(items):
+ if items == ():
+ return 0
+ return price(items[0]) + sum(items[1:])
+
+# Return the total price of the items in the cart
+def gettotal(cache):
+ cart = getcart(cartId, cache)
+ return sum(cart)
+
diff --git a/sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite b/sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite
new file mode 100644
index 0000000000..893b4f0ed4
--- /dev/null
+++ b/sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
+ targetNamespace="http://store"
+ name="store">
+
+ <component name="Store">
+ <t:implementation.python script="store.py"/>
+ <service name="Widget">
+ <t:binding.http uri="store"/>
+ </service>
+ <reference name="catalog" target="Catalog"/>
+ <reference name="shoppingCart" target="ShoppingCart/Cart"/>
+ <reference name="shoppingTotal" target="ShoppingCart/Total"/>
+ </component>
+
+ <component name="Catalog">
+ <t:implementation.python script="fruits-catalog.py"/>
+ <property name="currencyCode">USD</property>
+ <service name="Catalog">
+ <t:binding.jsonrpc uri="catalog"/>
+ </service>
+ <reference name="currencyConverter" target="CurrencyConverter"/>
+ </component>
+
+ <component name="ShoppingCart">
+ <t:implementation.python script="shopping-cart.py"/>
+ <service name="ShoppingCart">
+ <t:binding.atom uri="shoppingCart"/>
+ </service>
+ <service name="Total">
+ <t:binding.jsonrpc uri="total"/>
+ </service>
+ <reference name="cache" target="Cache"/>
+ </component>
+
+ <component name="CurrencyConverter">
+ <t:implementation.python script="currency-converter.py"/>
+ <service name="CurrencyConverter">
+ <t:binding.jsonrpc uri="currencyConverter"/>
+ </service>
+ </component>
+
+ <component name="Cache">
+ <implementation.cpp path="../../../../components/cache" library="libmemcache"/>
+ <service name="Cache">
+ <t:binding.atom uri="cache"/>
+ </service>
+ </component>
+
+</composite>
diff --git a/sca-cpp/trunk/samples/store-vhost/domains/joe/store.py b/sca-cpp/trunk/samples/store-vhost/domains/joe/store.py
new file mode 100644
index 0000000000..0b4e0f72fd
--- /dev/null
+++ b/sca-cpp/trunk/samples/store-vhost/domains/joe/store.py
@@ -0,0 +1,40 @@
+# 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.
+
+# Store implementation
+
+def post(item, catalog, shoppingCart, shoppingTotal):
+ return shoppingCart("post", item)
+
+def getall(catalog, shoppingCart, shoppingTotal):
+ return shoppingCart("getall")
+
+def get(id, catalog, shoppingCart, shoppingTotal):
+ return shoppingCart("get", id)
+
+def getcatalog(catalog, shoppingCart, shoppingTotal):
+ return catalog("getcatalog")
+
+def gettotal(catalog, shoppingCart, shoppingTotal):
+ return shoppingCart("gettotal")
+
+def deleteall(catalog, shoppingCart, shoppingTotal):
+ return shoppingCart("deleteall")
+
+def delete(id, catalog, shoppingCart, shoppingTotal):
+ return shoppingCart("delete", id)
+
diff --git a/sca-cpp/trunk/samples/store-vhost/htdocs/index.html b/sca-cpp/trunk/samples/store-vhost/htdocs/index.html
index c27e54f753..e0239392ff 100644
--- a/sca-cpp/trunk/samples/store-vhost/htdocs/index.html
+++ b/sca-cpp/trunk/samples/store-vhost/htdocs/index.html
@@ -19,139 +19,16 @@
<html>
<head>
<title>Store</title>
-
-<script type="text/javascript" src="/js/tuscany-ref.js"></script>
-
-<script type="text/javascript">
-var component = new tuscany.sca.Component("Store");
-
-//@Reference
-var catalog = new tuscany.sca.Reference("catalog");
-
-//@Reference
-var shoppingCart = new tuscany.sca.Reference("shoppingCart");
-
-//@Reference
-var shoppingTotal = new tuscany.sca.Reference("shoppingTotal");
-
-var catalogItems;
-
-function catalog_getcatalogResponse(items, exception) {
- if (exception){
- alert(exception.message);
- return;
- }
- var catalog = "";
- for (var i=0; i<items.length; i++) {
- var item = items[i].name + ' - ' + items[i].price;
- catalog += '<input name="items" type="checkbox" value="' +
- item + '">' + item + ' <br>';
- }
- document.getElementById('catalog').innerHTML=catalog;
- catalogItems = items;
-
-}
-
-function shoppingCart_getResponse(feed) {
- if (feed != null) {
- var entries = feed.getElementsByTagName("entry");
- var list = "";
- for (var i=0; i<entries.length; i++) {
- var content = entries[i].getElementsByTagName("content")[0];
- var name = content.getElementsByTagName("name")[0].firstChild.nodeValue;
- var price = content.getElementsByTagName("price")[0].firstChild.nodeValue;
- list += name + ' - ' + price + ' <br>';
- }
- document.getElementById("shoppingCart").innerHTML = list;
-
- shoppingTotal.apply("gettotal", shoppingTotal_gettotalResponse);
- }
-}
-
-function shoppingTotal_gettotalResponse(total, exception) {
- if (exception) {
- alert(exception.message);
- return;
- }
- document.getElementById('total').innerHTML = total;
-}
-
-function shoppingCart_postResponse(entry) {
- shoppingCart.get("", shoppingCart_getResponse);
-}
-
-function addToCart() {
- var items = document.catalogForm.items;
- var j = 0;
- for (var i=0; i<items.length; i++)
- if (items[i].checked) {
- var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><content type="application/xml">' +
- '<item>' +
- '<javaClass>' + catalogItems[i].javaClass + '</javaClass>' +
- '<name>' + catalogItems[i].name + '</name>' +
- '<currencyCode>' + catalogItems[i].currencyCode + '</currencyCode>' +
- '<currencySymbol>' + catalogItems[i].currencySymbol + '</currencySymbol>' +
- '<price>' + catalogItems[i].price + '</price>' +
- '</item>' +
- '</content></entry>';
- shoppingCart.post(entry, shoppingCart_postResponse);
- items[i].checked = false;
- }
-}
-function checkoutCart() {
- document.getElementById('store').innerHTML='<h2>' +
- 'Thanks for Shopping With Us!</h2>'+
- '<h2>Your Order</h2>'+
- '<form name="orderForm">'+
- document.getElementById('shoppingCart').innerHTML+
- '<br>'+
- document.getElementById('total').innerHTML+
- '<br>'+
- '<br>'+
- '<input type="submit" value="Continue Shopping">'+
- '</form>';
- shoppingCart.del("", null);
-}
-function deleteCart() {
- shoppingCart.del("", null);
- document.getElementById('shoppingCart').innerHTML = "";
- document.getElementById('total').innerHTML = "";
-}
-
-function init() {
- try {
- catalog.apply("getcatalog", catalog_getcatalogResponse);
- shoppingCart.get("", shoppingCart_getResponse);
- } catch(e){
- alert(e);
- }
-}
-</script>
-
</head>
-<body onload="init()">
+<body>
<h1>Store</h1>
-<div id="store">
-<h2>Catalog</h2>
-<form name="catalogForm">
-<div id="catalog" ></div>
-<br>
-<input type="button" onClick="addToCart()" value="Add to Cart">
-</form>
-<br>
-
-<h2>Your Shopping Cart</h2>
-<form name="shoppingCartForm">
-<div id="shoppingCart"></div>
-<br>
-<div id="total"></div>
-<br>
-<input type="button" onClick="checkoutCart()" value="Checkout">
-<input type="button" onClick="deleteCart()" value="Empty">
-<a href="shoppingCart/">(feed)</a>
-</form>
-</div>
+<p>For this sample to work, add the sample domain to your /etc/hosts as follows:<br/>
+127.0.0.1 sca-store.com jane.sca-store.com joe.sca-store.com</p>
+
+<p/>
+<p>Jane's store at <a href="http://jane.sca-store.com:8090/">jane.sca-store.com</a>
+<br/>Joe's store at <a href="http://joe.sca-store.com:8090/">joe.sca-store.com</a></p>
</body>
</html>
diff --git a/sca-cpp/trunk/samples/store-vhost/server-test b/sca-cpp/trunk/samples/store-vhost/server-test
index 26efd14c0e..1ed4b55df0 100755
--- a/sca-cpp/trunk/samples/store-vhost/server-test
+++ b/sca-cpp/trunk/samples/store-vhost/server-test
@@ -25,11 +25,11 @@ curl_prefix=`cat $here/../../modules/http/curl.prefix`
./start
sleep 2
-# For this test to work, add the following line to your etc/hosts
-127.0.0.1 jane.store.com joe.store.com
+# For this test to work, add the test domain to your etc/hosts as follows:
+# 127.0.0.1 sca-store.com jane.sca-store.com joe.sca-store.com
# Test HTTP GET
-$curl_prefix/bin/curl http://jane.store.com:8090/ 2>/dev/null >tmp/jane.html
+$curl_prefix/bin/curl http://jane.sca-store.com:8090/ 2>/dev/null >tmp/jane.html
diff tmp/jane.html htdocs/domains/jane/index.html
rc=$?
diff --git a/sca-cpp/trunk/samples/store-vhost/ssl-start b/sca-cpp/trunk/samples/store-vhost/ssl-start
index 1e70d6edfb..368a664674 100755
--- a/sca-cpp/trunk/samples/store-vhost/ssl-start
+++ b/sca-cpp/trunk/samples/store-vhost/ssl-start
@@ -17,16 +17,20 @@
# specific language governing permissions and limitations
# under the License.
-../../modules/http/httpd-ca-conf tmp localhost
-../../modules/http/httpd-cert-conf tmp localhost
-../../modules/http/httpd-conf tmp localhost 8090 htdocs
-../../modules/http/httpd-ssl-conf tmp localhost 8453 htdocs
+# For this sample to work, add the sample domain to your /etc/hosts as follows:
+# 127.0.0.1 sca-store.com jane.sca-store.com joe.sca-store.com
+
+../../modules/http/ssl-ca-conf tmp sca-store.com
+../../modules/http/ssl-cert-conf tmp sca-store.com server
+../../modules/http/ssl-cert-conf tmp *.sca-store.com vhost
+../../modules/http/httpd-conf tmp sca-store.com 8090 htdocs vhost
+../../modules/http/httpd-ssl-conf tmp sca-store.com 8453 htdocs vhost
../../modules/server/server-conf tmp
../../modules/python/python-conf tmp
cat >>tmp/conf/httpd.conf <<EOF
-# Configure SCA Composite
-SCAContribution `pwd`/
-SCAComposite store.composite
+# Configure SCA Composite for mass dynamic virtual Hosting
+SCAVirtualContribution `pwd`/domains/
+SCAVirtualComposite store.composite
EOF
diff --git a/sca-cpp/trunk/samples/store-vhost/start b/sca-cpp/trunk/samples/store-vhost/start
index 6cbea136b3..01173e68b7 100755
--- a/sca-cpp/trunk/samples/store-vhost/start
+++ b/sca-cpp/trunk/samples/store-vhost/start
@@ -17,12 +17,12 @@
# specific language governing permissions and limitations
# under the License.
-../../modules/http/httpd-conf tmp localhost 8090 htdocs vhost
+../../modules/http/httpd-conf tmp sca-store.com 8090 htdocs vhost
../../modules/server/server-conf tmp
../../modules/python/python-conf tmp
cat >>tmp/conf/httpd.conf <<EOF
-# Configure SCA Composite for mass dynamic virtual Hosting
-SCAVirtualContribution `pwd`/
+# Configure SCA Composite for mass dynamic virtual hosting
+SCAVirtualContribution `pwd`/domains/
SCAVirtualComposite store.composite
EOF
diff --git a/sca-cpp/trunk/samples/store-vhost/uec2-start b/sca-cpp/trunk/samples/store-vhost/uec2-start
index 2e59815637..ddf70975ef 100755
--- a/sca-cpp/trunk/samples/store-vhost/uec2-start
+++ b/sca-cpp/trunk/samples/store-vhost/uec2-start
@@ -21,23 +21,25 @@
if [ "$1" != "" ]; then
host=$1
else
- host="localhost"
+ # Default to dummy test domain
+ host="sca-store.com"
fi
# Ports 80, 443, 8090, 8453 need to be open
sudo ../../ubuntu/ip-redirect 80 8090
sudo ../../ubuntu/ip-redirect 443 8453
-../../modules/http/httpd-ca-conf tmp $host
-../../modules/http/httpd-cert-conf tmp $host
-../../modules/http/httpd-conf tmp $host 8090/80 htdocs
-../../modules/http/httpd-ssl-conf tmp $host 8453/443 htdocs
+../../modules/http/ssl-ca-conf tmp $host
+../../modules/http/ssl-cert-conf tmp $host server
+../../modules/http/ssl-cert-conf tmp "*.$host" vhost
+../../modules/http/httpd-conf tmp $host 8090/80 htdocs vhost
+../../modules/http/httpd-ssl-conf tmp $host 8453/443 htdocs vhost
../../modules/server/server-conf tmp
../../modules/python/python-conf tmp
cat >>tmp/conf/httpd.conf <<EOF
-# Configure SCA Composite
-SCAContribution `pwd`/
-SCAComposite store.composite
+# Configure SCA Composite for mass dynamic virtual Hosting
+SCAVirtualContribution `pwd`/domains/
+SCAVirtualComposite store.composite
EOF