[cpp-sp] branch main updated: Excise metadata generation and some related code from handlers.
Scott Cantor
cantor.2 at osu.edu
Fri Nov 1 18:24:35 UTC 2024
This is an automated email from the git hooks/post-receive script.
scantor pushed a commit to branch main
in repository cpp-sp.
View the commit online:
http://git.shibboleth.net/view/?p=cpp-sp.git;a=commit;h=401ffbe2b7625ed672aeef722bc26c5b45caafd2
The following commit(s) were added to refs/heads/main by this push:
new 401ffbe2 Excise metadata generation and some related code from handlers.
401ffbe2 is described below
commit 401ffbe2b7625ed672aeef722bc26c5b45caafd2
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Fri Nov 1 14:24:31 2024 -0400
Excise metadata generation and some related code from handlers.
---
shibsp/handler/AssertionConsumerService.h | 3 --
shibsp/handler/Handler.h | 30 ------------
shibsp/handler/LogoutInitiator.h | 4 --
shibsp/handler/SessionInitiator.h | 35 --------------
shibsp/handler/impl/AssertionConsumerService.cpp | 59 -----------------------
shibsp/handler/impl/ChainingLogoutInitiator.cpp | 6 ---
shibsp/handler/impl/ChainingSessionInitiator.cpp | 7 ---
shibsp/handler/impl/ExternalAuthHandler.cpp | 5 --
shibsp/handler/impl/LogoutHandler.cpp | 35 --------------
shibsp/handler/impl/LogoutInitiator.cpp | 7 ---
shibsp/handler/impl/SAML2Consumer.cpp | 5 --
shibsp/handler/impl/SAML2Logout.cpp | 28 -----------
shibsp/handler/impl/SAML2SessionInitiator.cpp | 6 ---
shibsp/handler/impl/SAMLDSSessionInitiator.cpp | 43 -----------------
shibsp/handler/impl/SessionInitiator.cpp | 61 ------------------------
shibsp/handler/impl/StatusHandler.cpp | 2 +-
16 files changed, 1 insertion(+), 335 deletions(-)
diff --git a/shibsp/handler/AssertionConsumerService.h b/shibsp/handler/AssertionConsumerService.h
index 1bb6f944..2edbb026 100644
--- a/shibsp/handler/AssertionConsumerService.h
+++ b/shibsp/handler/AssertionConsumerService.h
@@ -118,8 +118,6 @@ namespace shibsp {
) const;
#ifndef SHIBSP_LITE
- void generateMetadata(opensaml::saml2md::SPSSODescriptor& role, const char* handlerURL) const;
-
/**
* Returns a profile identifier to inject into the SecurityPolicy created
* by the base class.
@@ -198,7 +196,6 @@ namespace shibsp {
) const;
public:
- const char* getType() const;
const XMLCh* getProtocolFamily() const;
#endif
private:
diff --git a/shibsp/handler/Handler.h b/shibsp/handler/Handler.h
index b5825060..2e647fc2 100644
--- a/shibsp/handler/Handler.h
+++ b/shibsp/handler/Handler.h
@@ -30,14 +30,6 @@
#include <shibsp/SPRequest.h>
#include <shibsp/util/PropertySet.h>
-#ifndef SHIBSP_LITE
-namespace opensaml {
- namespace saml2md {
- class SAML_API SPSSODescriptor;
- };
-};
-#endif
-
namespace xmltooling {
class XMLTOOL_API HTTPRequest;
class XMLTOOL_API HTTPResponse;
@@ -134,25 +126,6 @@ namespace shibsp {
*/
virtual std::pair<bool,long> run(SPRequest& request, bool isHandler=true) const=0;
-#ifndef SHIBSP_LITE
- /**
- * Generates and/or modifies metadata reflecting the Handler.
- *
- * <p>The default implementation does nothing.
- *
- * @param role metadata role to decorate
- * @param handlerURL base location of handler's endpoint
- */
- virtual void generateMetadata(opensaml::saml2md::SPSSODescriptor& role, const char* handlerURL) const;
-
- /**
- * Returns the "type" of the Handler plugin.
- *
- * @return a Handler type
- */
- virtual const char* getType() const;
-#endif
-
/**
* Get the type of event, as input to error handling in response to errors raised by this handler.
*
@@ -164,9 +137,6 @@ namespace shibsp {
/** Registers Handler implementations. */
void SHIBSP_API registerHandlers();
- /** Handler for SAML 1.x SSO. */
- #define SAML1_ASSERTION_CONSUMER_SERVICE "SAML1"
-
/** Handler for SAML 2.0 SSO. */
#define SAML20_ASSERTION_CONSUMER_SERVICE "SAML2"
diff --git a/shibsp/handler/LogoutInitiator.h b/shibsp/handler/LogoutInitiator.h
index 2144bf42..b50049df 100644
--- a/shibsp/handler/LogoutInitiator.h
+++ b/shibsp/handler/LogoutInitiator.h
@@ -40,10 +40,6 @@ namespace shibsp {
LogoutInitiator();
public:
virtual ~LogoutInitiator();
-
-#ifndef SHIBSP_LITE
- const char* getType() const;
-#endif
};
/** Registers LogoutInitiator implementations. */
diff --git a/shibsp/handler/SessionInitiator.h b/shibsp/handler/SessionInitiator.h
index ab3a6d06..0f9be37a 100644
--- a/shibsp/handler/SessionInitiator.h
+++ b/shibsp/handler/SessionInitiator.h
@@ -35,8 +35,6 @@
namespace shibsp {
- class SHIBSP_API AuthnRequestEvent;
-
/**
* Pluggable runtime functionality that handles initiating sessions.
*
@@ -65,19 +63,6 @@ namespace shibsp {
*/
bool checkCompatibility(SPRequest& request, bool isHandler) const;
-#ifndef SHIBSP_LITE
- /**
- * Creates a new AuthnRequestEvent for the event log.
- *
- * @param application the Application associated with the event
- * @param request the HTTP client request associated with the event, or nullptr
- * @return a fresh AuthnRequestEvent, prepopulated by the input parameters, or nullptr if an error occurs
- */
- virtual AuthnRequestEvent* newAuthnRequestEvent(
- const Application& application, const xmltooling::HTTPRequest* request=nullptr
- ) const;
-#endif
-
public:
virtual ~SessionInitiator();
@@ -104,20 +89,6 @@ namespace shibsp {
std::pair<bool,long> run(SPRequest& request, bool isHandler=true) const;
const char* remap(const char* src, xmltooling::logging::Category& log) const;
-
-#ifndef SHIBSP_LITE
- const char* getType() const;
- void generateMetadata(opensaml::saml2md::SPSSODescriptor& role, const char* handlerURL) const;
-
- /**
- * Generates RequestInitiator metadata when instructed. Allows subclasses to decide whether it's
- * appropriate to do so instead of requiring them to override the method to stop it.
- *
- * @param role role object to inject metadata into
- * @param handlerURL base of endpoint to generate metadata with
- */
- void doGenerateMetadata(opensaml::saml2md::SPSSODescriptor& role, const char* handlerURL) const;
-#endif
};
/** Registers SessionInitiator implementations. */
@@ -131,12 +102,6 @@ namespace shibsp {
/** SessionInitiator that supports SAML Discovery Service protocol. */
#define SAMLDS_SESSION_INITIATOR "SAMLDS"
-
- /** SessionInitiator that supports Shibboleth V1 AuthnRequest redirects. */
- #define SHIB1_SESSION_INITIATOR "Shib1"
-
- /** SessionInitiator that supports Shibboleth V1 WAYF redirects when no IdP is supplied. */
- #define WAYF_SESSION_INITIATOR "WAYF"
/** SessionInitiator that attempts a sequence of transforms of an input until an entityID is found. */
#define TRANSFORM_SESSION_INITIATOR "Transform"
diff --git a/shibsp/handler/impl/AssertionConsumerService.cpp b/shibsp/handler/impl/AssertionConsumerService.cpp
index 450dc560..976ccc28 100644
--- a/shibsp/handler/impl/AssertionConsumerService.cpp
+++ b/shibsp/handler/impl/AssertionConsumerService.cpp
@@ -348,41 +348,6 @@ const XMLCh* AssertionConsumerService::getProtocolFamily() const
return m_decoder ? m_decoder->getProtocolFamily() : nullptr;
}
-const char* AssertionConsumerService::getType() const
-{
- return "AssertionConsumerService";
-}
-
-void AssertionConsumerService::generateMetadata(SPSSODescriptor& role, const char* handlerURL) const
-{
- // Initial guess at index to use.
- pair<bool,unsigned int> ix = pair<bool,unsigned int>(false,0);
- if (!strncmp(handlerURL, "https", 5))
- ix = getUnsignedInt("sslIndex", shibspconstants::ASCII_SHIBSPCONFIG_NS);
- if (!ix.first)
- ix = getUnsignedInt("index");
- if (!ix.first)
- ix.second = 1;
-
- // Find maximum index in use and go one higher.
- const vector<saml2md::AssertionConsumerService*>& services = const_cast<const SPSSODescriptor&>(role).getAssertionConsumerServices();
- if (!services.empty() && ix.second <= services.back()->getIndex().second)
- ix.second = services.back()->getIndex().second + 1;
-
- const char* loc = getString("Location").second;
- string hurl(handlerURL);
- if (*loc != '/')
- hurl += '/';
- hurl += loc;
- auto_ptr_XMLCh widen(hurl.c_str());
-
- saml2md::AssertionConsumerService* ep = saml2md::AssertionConsumerServiceBuilder::buildAssertionConsumerService();
- ep->setLocation(widen.get());
- ep->setBinding(getXMLString("Binding").second);
- ep->setIndex(ix.second);
- role.getAssertionConsumerServices().push_back(ep);
-}
-
namespace {
class SHIBSP_DLLLOCAL DummyContext : public ResolutionContext
{
@@ -604,30 +569,6 @@ void AssertionConsumerService::extractMessageDetails(const Assertion& assertion,
}
}
-LoginEvent* AssertionConsumerService::newLoginEvent(const Application& application, const HTTPRequest& request) const
-{
- if (!SPConfig::getConfig().isEnabled(SPConfig::Logging))
- return nullptr;
- try {
- auto_ptr<TransactionLog::Event> event(SPConfig::getConfig().EventManager.newPlugin(LOGIN_EVENT, nullptr, false));
- LoginEvent* login_event = dynamic_cast<LoginEvent*>(event.get());
- if (login_event) {
- login_event->m_request = &request;
- login_event->m_app = &application;
- login_event->m_binding = getString("Binding").second;
- event.release();
- return login_event;
- }
- else {
- m_log.warn("unable to audit event, log event object was of an incorrect type");
- }
- }
- catch (const std::exception& ex) {
- m_log.warn("exception auditing event: %s", ex.what());
- }
- return nullptr;
-}
-
#endif
void AssertionConsumerService::maintainHistory(
diff --git a/shibsp/handler/impl/ChainingLogoutInitiator.cpp b/shibsp/handler/impl/ChainingLogoutInitiator.cpp
index 3fec878d..31caf0c0 100644
--- a/shibsp/handler/impl/ChainingLogoutInitiator.cpp
+++ b/shibsp/handler/impl/ChainingLogoutInitiator.cpp
@@ -56,12 +56,6 @@ namespace shibsp {
pair<bool,long> run(SPRequest& request, bool isHandler=true) const;
-#ifndef SHIBSP_LITE
- void generateMetadata(opensaml::saml2md::SPSSODescriptor& role, const char* handlerURL) const {
- for_each(m_handlers.begin(), m_handlers.end(), boost::bind(&Handler::generateMetadata, _1, boost::ref(role), handlerURL));
- }
-#endif
-
private:
ptr_vector<Handler> m_handlers;
};
diff --git a/shibsp/handler/impl/ChainingSessionInitiator.cpp b/shibsp/handler/impl/ChainingSessionInitiator.cpp
index b2c6f669..c9231c68 100644
--- a/shibsp/handler/impl/ChainingSessionInitiator.cpp
+++ b/shibsp/handler/impl/ChainingSessionInitiator.cpp
@@ -56,13 +56,6 @@ namespace shibsp {
pair<bool,long> run(SPRequest& request, string& entityID, bool isHandler=true) const;
-#ifndef SHIBSP_LITE
- void generateMetadata(opensaml::saml2md::SPSSODescriptor& role, const char* handlerURL) const {
- doGenerateMetadata(role, handlerURL); // assumes all chains support the RequestInitiator protocol
- for_each(m_handlers.begin(), m_handlers.end(), boost::bind(&SessionInitiator::generateMetadata, _1, boost::ref(role), handlerURL));
- }
-#endif
-
private:
ptr_vector<SessionInitiator> m_handlers;
};
diff --git a/shibsp/handler/impl/ExternalAuthHandler.cpp b/shibsp/handler/impl/ExternalAuthHandler.cpp
index e8750192..92760583 100644
--- a/shibsp/handler/impl/ExternalAuthHandler.cpp
+++ b/shibsp/handler/impl/ExternalAuthHandler.cpp
@@ -86,10 +86,6 @@ namespace shibsp {
pair<bool,long> run(SPRequest& request, bool isHandler=true) const;
void receive(DDF& in, ostream& out);
- const char* getType() const {
- return "ExternalAuth";
- }
-
private:
pair<bool,long> processMessage(
const Application& application,
@@ -99,7 +95,6 @@ namespace shibsp {
const DDF* respDDF=nullptr
) const;
#ifndef SHIBSP_LITE
- LoginEvent* newLoginEvent(const Application& application, const HTTPRequest& request) const;
ResolutionContext* resolveAttributes(
const Application& application,
const GenericRequest* request,
diff --git a/shibsp/handler/impl/LogoutHandler.cpp b/shibsp/handler/impl/LogoutHandler.cpp
index 4e0b3574..e5d41019 100644
--- a/shibsp/handler/impl/LogoutHandler.cpp
+++ b/shibsp/handler/impl/LogoutHandler.cpp
@@ -284,38 +284,3 @@ bool LogoutHandler::notifyBackChannel(
out = application.getServiceProvider().getListenerService()->send(in);
return (out.integer() == 1);
}
-
-#ifndef SHIBSP_LITE
-
-LogoutEvent* LogoutHandler::newLogoutEvent(
- const Application& application, const xmltooling::HTTPRequest* request, const Session* session
- ) const
-{
- if (!SPConfig::getConfig().isEnabled(SPConfig::Logging))
- return nullptr;
- try {
- auto_ptr<TransactionLog::Event> event(SPConfig::getConfig().EventManager.newPlugin(LOGOUT_EVENT, nullptr, false));
- LogoutEvent* logout_event = dynamic_cast<LogoutEvent*>(event.get());
- if (logout_event) {
- logout_event->m_request = request;
- logout_event->m_app = &application;
- logout_event->m_binding = getString("Binding").second;
- logout_event->m_session = session;
- if (session) {
- logout_event->m_nameID = session->getNameID();
- logout_event->m_sessions.push_back(session->getID());
- }
- event.release();
- return logout_event;
- }
- else {
- Category::getInstance(SHIBSP_LOGCAT ".Logout").warn("unable to audit event, log event object was of an incorrect type");
- }
- }
- catch (std::exception& ex) {
- Category::getInstance(SHIBSP_LOGCAT ".Logout").warn("exception auditing event: %s", ex.what());
- }
- return nullptr;
-}
-
-#endif
diff --git a/shibsp/handler/impl/LogoutInitiator.cpp b/shibsp/handler/impl/LogoutInitiator.cpp
index ed4636c4..30ee28a1 100644
--- a/shibsp/handler/impl/LogoutInitiator.cpp
+++ b/shibsp/handler/impl/LogoutInitiator.cpp
@@ -54,10 +54,3 @@ LogoutInitiator::LogoutInitiator()
LogoutInitiator::~LogoutInitiator()
{
}
-
-#ifndef SHIBSP_LITE
-const char* LogoutInitiator::getType() const
-{
- return "LogoutInitiator";
-}
-#endif
diff --git a/shibsp/handler/impl/SAML2Consumer.cpp b/shibsp/handler/impl/SAML2Consumer.cpp
index 5f1d970e..077d53ba 100644
--- a/shibsp/handler/impl/SAML2Consumer.cpp
+++ b/shibsp/handler/impl/SAML2Consumer.cpp
@@ -80,11 +80,6 @@ namespace shibsp {
virtual ~SAML2Consumer() {}
#ifndef SHIBSP_LITE
- void generateMetadata(SPSSODescriptor& role, const char* handlerURL) const {
- AssertionConsumerService::generateMetadata(role, handlerURL);
- role.addSupport(samlconstants::SAML20P_NS);
- }
-
private:
const char* getProfile() const {
return m_paos ? samlconstants::SAML20_PROFILE_SSO_ECP : samlconstants::SAML20_PROFILE_SSO_BROWSER;
diff --git a/shibsp/handler/impl/SAML2Logout.cpp b/shibsp/handler/impl/SAML2Logout.cpp
index f9d3abd3..77c89572 100644
--- a/shibsp/handler/impl/SAML2Logout.cpp
+++ b/shibsp/handler/impl/SAML2Logout.cpp
@@ -79,25 +79,6 @@ namespace shibsp {
void receive(DDF& in, ostream& out);
pair<bool,long> run(SPRequest& request, bool isHandler=true) const;
-#ifndef SHIBSP_LITE
- void generateMetadata(SPSSODescriptor& role, const char* handlerURL) const {
- const char* loc = getString("Location").second;
- string hurl(handlerURL);
- if (*loc != '/')
- hurl += '/';
- hurl += loc;
- auto_ptr_XMLCh widen(hurl.c_str());
- SingleLogoutService* ep = SingleLogoutServiceBuilder::buildSingleLogoutService();
- ep->setLocation(widen.get());
- ep->setBinding(getXMLString("Binding").second);
- role.getSingleLogoutServices().push_back(ep);
- role.addSupport(samlconstants::SAML20P_NS);
- }
-
- const char* getType() const {
- return "SingleLogoutService";
- }
-#endif
const XMLCh* getProtocolFamily() const {
return samlconstants::SAML20P_NS;
}
@@ -119,15 +100,6 @@ namespace shibsp {
bool front
) const;
- LogoutEvent* newLogoutEvent(
- const Application& application, const HTTPRequest* request=nullptr, const Session* session=nullptr
- ) const {
- LogoutEvent* e = LogoutHandler::newLogoutEvent(application, request, session);
- if (e)
- e->m_protocol = m_protocol.get();
- return e;
- }
-
scoped_ptr<MessageDecoder> m_decoder;
vector<string> m_bindings;
map< string,boost::shared_ptr<MessageEncoder> > m_encoders;
diff --git a/shibsp/handler/impl/SAML2SessionInitiator.cpp b/shibsp/handler/impl/SAML2SessionInitiator.cpp
index fed5b401..c6d5c148 100644
--- a/shibsp/handler/impl/SAML2SessionInitiator.cpp
+++ b/shibsp/handler/impl/SAML2SessionInitiator.cpp
@@ -89,12 +89,6 @@ namespace shibsp {
return samlconstants::SAML20P_NS;
}
-#ifndef SHIBSP_LITE
- void generateMetadata(saml2md::SPSSODescriptor& role, const char* handlerURL) const {
- doGenerateMetadata(role, handlerURL);
- }
-#endif
-
private:
pair<bool,long> doRequest(
const Application& application,
diff --git a/shibsp/handler/impl/SAMLDSSessionInitiator.cpp b/shibsp/handler/impl/SAMLDSSessionInitiator.cpp
index fdbb1c0b..2b9703bb 100644
--- a/shibsp/handler/impl/SAMLDSSessionInitiator.cpp
+++ b/shibsp/handler/impl/SAMLDSSessionInitiator.cpp
@@ -61,49 +61,6 @@ namespace shibsp {
pair<bool,long> run(SPRequest& request, string& entityID, bool isHandler=true) const;
-#ifndef SHIBSP_LITE
- void generateMetadata(SPSSODescriptor& role, const char* handlerURL) const {
- // Initial guess at index to use.
- pair<bool,unsigned int> ix = getUnsignedInt("index");
- if (!ix.first)
- ix.second = 1;
-
- // Find maximum index in use and go one higher.
- if (role.getExtensions()) {
- const vector<XMLObject*>& exts = const_cast<const Extensions*>(role.getExtensions())->getUnknownXMLObjects();
- for (vector<XMLObject*>::const_reverse_iterator i = exts.rbegin(); i != exts.rend(); ++i) {
- const DiscoveryResponse* sub = dynamic_cast<DiscoveryResponse*>(*i);
- if (sub) {
- pair<bool,int> val = sub->getIndex();
- if (val.first) {
- if (ix.second <= val.second)
- ix.second = val.second + 1;
- break;
- }
- }
- }
- }
-
- const char* loc = getString("Location").second;
- string hurl(handlerURL);
- if (*loc != '/')
- hurl += '/';
- hurl += loc;
- auto_ptr_XMLCh widen(hurl.c_str());
-
- DiscoveryResponse* ep = DiscoveryResponseBuilder::buildDiscoveryResponse();
- ep->setLocation(widen.get());
- ep->setBinding(samlconstants::IDP_DISCOVERY_PROTOCOL_NS);
- ep->setIndex(ix.second);
- Extensions* ext = role.getExtensions();
- if (!ext) {
- ext = ExtensionsBuilder::buildExtensions();
- role.setExtensions(ext);
- }
- ext->getUnknownXMLObjects().push_back(ep);
- }
-#endif
-
private:
const char* m_url;
const char* m_returnParam;
diff --git a/shibsp/handler/impl/SessionInitiator.cpp b/shibsp/handler/impl/SessionInitiator.cpp
index 5fdd0401..64148986 100644
--- a/shibsp/handler/impl/SessionInitiator.cpp
+++ b/shibsp/handler/impl/SessionInitiator.cpp
@@ -77,40 +77,6 @@ const char* SessionInitiator::remap(const char* src, Category& log) const
}
}
-#ifndef SHIBSP_LITE
-const char* SessionInitiator::getType() const
-{
- return "SessionInitiator";
-}
-
-void SessionInitiator::generateMetadata(SPSSODescriptor& role, const char* handlerURL) const
-{
- // In case any plugins were directly calling this before, we stub it out.
-}
-
-void SessionInitiator::doGenerateMetadata(SPSSODescriptor& role, const char* handlerURL) const
-{
- if (getParent())
- return;
- const char* loc = getString("Location").second;
- string hurl(handlerURL);
- if (*loc != '/')
- hurl += '/';
- hurl += loc;
- auto_ptr_XMLCh widen(hurl.c_str());
-
- RequestInitiator* ep = RequestInitiatorBuilder::buildRequestInitiator();
- ep->setLocation(widen.get());
- ep->setBinding(samlconstants::SP_REQUEST_INIT_NS);
- Extensions* ext = role.getExtensions();
- if (!ext) {
- ext = ExtensionsBuilder::buildExtensions();
- role.setExtensions(ext);
- }
- ext->getUnknownXMLObjects().push_back(ep);
-}
-#endif
-
const set<string>& SessionInitiator::getSupportedOptions() const
{
return m_supportedOptions;
@@ -212,30 +178,3 @@ pair<bool,long> SessionInitiator::run(SPRequest& request, bool isHandler) const
throw;
}
}
-
-#ifndef SHIBSP_LITE
-
-AuthnRequestEvent* SessionInitiator::newAuthnRequestEvent(const Application& application, const xmltooling::HTTPRequest* request) const
-{
- if (!SPConfig::getConfig().isEnabled(SPConfig::Logging))
- return nullptr;
- try {
- auto_ptr<TransactionLog::Event> event(SPConfig::getConfig().EventManager.newPlugin(AUTHNREQUEST_EVENT, nullptr, false));
- AuthnRequestEvent* ar_event = dynamic_cast<AuthnRequestEvent*>(event.get());
- if (ar_event) {
- ar_event->m_request = request;
- ar_event->m_app = &application;
- event.release();
- return ar_event;
- }
- else {
- Category::getInstance(SHIBSP_LOGCAT ".SessionInitiator").warn("unable to audit event, log event object was of an incorrect type");
- }
- }
- catch (exception& ex) {
- Category::getInstance(SHIBSP_LOGCAT ".SessionInitiator").warn("exception auditing event: %s", ex.what());
- }
- return nullptr;
-}
-
-#endif
diff --git a/shibsp/handler/impl/StatusHandler.cpp b/shibsp/handler/impl/StatusHandler.cpp
index 88c53ebe..9f7cb254 100644
--- a/shibsp/handler/impl/StatusHandler.cpp
+++ b/shibsp/handler/impl/StatusHandler.cpp
@@ -440,7 +440,7 @@ pair<bool,long> StatusHandler::processMessage(
application.getHandlers(handlers);
for (indirect_iterator<vector<const Handler*>::const_iterator> h = make_indirect_iterator(handlers.begin());
h != make_indirect_iterator(handlers.end()); ++h) {
- s << "<Handler type='" << h->getType() << "' Location='" << h->getString("Location").second << "'";
+ s << "<Handler Location='" << h->getString("Location").second << "'";
if (h->getString("Binding").first)
s << " Binding='" << h->getString("Binding").second << "'";
s << "/>";
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list