#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/regx/RegularExpression.hpp>
+using shibspconstants::SHIB2SPCONFIG_NS;
using namespace shibsp;
using namespace xmltooling;
using namespace std;
class Override : public DOMPropertySet, public DOMNodeFilter
{
public:
- Override() : m_acl(nullptr) {}
- Override(const DOMElement* e, Category& log, const Override* base=nullptr);
+ Override(bool unicodeAware=false) : m_unicodeAware(unicodeAware), m_acl(nullptr) {}
+ Override(bool unicodeAware, const DOMElement* e, Category& log, const Override* base=nullptr);
~Override();
// Provides filter to exclude special config elements.
protected:
void loadACL(const DOMElement* e, Category& log);
+ bool m_unicodeAware;
map<string,Override*> m_map;
vector< pair<RegularExpression*,Override*> > m_regexps;
vector< pair< pair<string,RegularExpression*>,Override*> > m_queries;
}
}
-Override::Override(const DOMElement* e, Category& log, const Override* base) : m_acl(nullptr)
+Override::Override(bool unicodeAware, const DOMElement* e, Category& log, const Override* base)
+ : m_unicodeAware(unicodeAware), m_acl(nullptr)
{
try {
// Load the property set.
delete[] namebuf;
}
- Override* o=new Override(path,log,this);
- pair<bool,const char*> name=o->getString("name");
- char* dup=strdup(name.second);
- for (char* pch=dup; *pch; pch++)
- *pch=tolower(*pch);
+ char* dup = nullptr;
+ Override* o = new Override(m_unicodeAware, path, log, this);
+ if (m_unicodeAware) {
+ dup = toUTF8(o->getXMLString("name").second, true /* use malloc */);
+ }
+ else {
+ dup = strdup(o->getString("name").second);
+ for (char* pch = dup; *pch; ++pch)
+ *pch = tolower(*pch);
+ }
if (m_map.count(dup)) {
log.warn("skipping duplicate Path element (%s)",dup);
free(dup);
delete o;
continue;
}
- m_map[dup]=o;
+ m_map[dup] = o;
log.debug("added Path mapping (%s)", dup);
free(dup);
}
continue;
}
- auto_ptr<Override> o(new Override(path,log,this));
+ auto_ptr<Override> o(new Override(m_unicodeAware, path, log, this));
const XMLCh* flag=path->getAttributeNS(nullptr,ignoreCase);
try {
auto_ptr_char ntemp(n);
const XMLCh* v=path->getAttributeNS(nullptr,regex);
- auto_ptr<Override> o(new Override(path,log,this));
+ auto_ptr<Override> o(new Override(m_unicodeAware, path, log, this));
try {
RegularExpression* re = nullptr;
if (v && *v)
if (*path == '/')
path++;
- // Now we copy the path, chop the query string, and lower case it.
+ // Now we copy the path, chop the query string, and possibly lower case it.
char* dup=strdup(path);
char* sep=strchr(dup,'?');
if (sep)
*sep=0;
- for (char* pch=dup; *pch; pch++)
- *pch=tolower(*pch);
+ if (!m_unicodeAware) {
+ for (char* pch=dup; *pch; pch++)
+ *pch=tolower(*pch);
+ }
// Default is for the current object to provide settings.
const Override* o=this;
#ifdef _DEBUG
xmltooling::NDC ndc("XMLRequestMapperImpl");
#endif
+ static const XMLCh _default[] = UNICODE_LITERAL_7(d,e,f,a,u,l,t);
+ static const XMLCh _id[] = UNICODE_LITERAL_2(i,d);
+ static const XMLCh _RequestMap[] = UNICODE_LITERAL_10(R,e,q,u,e,s,t,M,a,p);
+
+ if (!XMLHelper::isNodeNamed(e, SHIB2SPCONFIG_NS, _RequestMap))
+ throw ConfigurationException("XML RequestMapper requires conf:RequestMap at root of configuration.");
// Load the property set.
load(e,nullptr,this);
+ // Inject "default" app ID if not explicit.
+ if (!getString("applicationId").first)
+ setProperty("applicationId", "default");
+
// Load any AccessControl provider.
loadACL(e,log);
+ pair<bool,bool> unicodeAware = getBool("unicodeAware");
+ m_unicodeAware = (unicodeAware.first && unicodeAware.second);
+
// Loop over the HostRegex elements.
const DOMElement* host = XMLHelper::getFirstChildElement(e,HostRegex);
for (int i=1; host; ++i, host=XMLHelper::getNextSiblingElement(host,HostRegex)) {
continue;
}
- auto_ptr<Override> o(new Override(host,log,this));
+ auto_ptr<Override> o(new Override(m_unicodeAware, host, log, this));
const XMLCh* flag=host->getAttributeNS(nullptr,ignoreCase);
try {
continue;
}
- Override* o=new Override(host,log,this);
+ Override* o=new Override(m_unicodeAware, host, log, this);
pair<bool,const char*> name=o->getString("name");
pair<bool,const char*> scheme=o->getString("scheme");
pair<bool,const char*> port=o->getString("port");