mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-01-31 09:57:14 +01:00
4a6bfc086c
Switched to POCO library for unified platform/library interface. Deprecated the external module API. It was creating more problems than solving. Removed most built-in libraries in favor of system libraries for easier maintenance. Cleaned and secured code with help from static analyzers.
115 lines
2.8 KiB
C++
115 lines
2.8 KiB
C++
//
|
|
// ApacheRequestHandlerFactory.cpp
|
|
//
|
|
// Copyright (c) 2006-2011, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#include "ApacheRequestHandlerFactory.h"
|
|
#include "ApacheConnector.h"
|
|
#include "Poco/Net/HTTPRequestHandler.h"
|
|
#include "Poco/StringTokenizer.h"
|
|
#include "Poco/Manifest.h"
|
|
#include "Poco/File.h"
|
|
#include <vector>
|
|
|
|
|
|
using Poco::StringTokenizer;
|
|
using Poco::FastMutex;
|
|
|
|
|
|
ApacheRequestHandlerFactory::ApacheRequestHandlerFactory()
|
|
{
|
|
}
|
|
|
|
|
|
ApacheRequestHandlerFactory::~ApacheRequestHandlerFactory()
|
|
{
|
|
}
|
|
|
|
|
|
Poco::Net::HTTPRequestHandler* ApacheRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest& request)
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
// only if the given uri is found in _uris we are
|
|
// handling this request.
|
|
RequestHandlerFactories::iterator it = _requestHandlers.begin();
|
|
RequestHandlerFactories::iterator itEnd = _requestHandlers.end();
|
|
std::string uri = request.getURI();
|
|
|
|
// if any uri in our map is found at the beginning of the given
|
|
// uri -> then we handle it!!
|
|
for (; it != itEnd; it++)
|
|
{
|
|
if (uri.find(it->first) == 0 || it->first.find(uri) == 0)
|
|
{
|
|
return it->second->createRequestHandler(request);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void ApacheRequestHandlerFactory::handleURIs(const std::string& uris)
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
StringTokenizer st(uris, " ", StringTokenizer::TOK_TRIM);
|
|
StringTokenizer::Iterator it = st.begin();
|
|
StringTokenizer::Iterator itEnd = st.end();
|
|
std::string factoryName = (*it);
|
|
it++;
|
|
std::string dllName = (*it);
|
|
it++;
|
|
|
|
for (; it != itEnd; it++)
|
|
{
|
|
addRequestHandlerFactory(dllName, factoryName, *it);
|
|
}
|
|
}
|
|
|
|
|
|
void ApacheRequestHandlerFactory::addRequestHandlerFactory(const std::string& dllPath, const std::string& factoryName, const std::string& uri)
|
|
{
|
|
try
|
|
{
|
|
_loader.loadLibrary(dllPath);
|
|
Poco::Net::HTTPRequestHandlerFactory* pFactory = _loader.classFor(factoryName).create();
|
|
_requestHandlers.insert(std::make_pair(uri, pFactory));
|
|
}
|
|
catch (Poco::Exception& exc)
|
|
{
|
|
ApacheConnector::log(__FILE__, __LINE__, ApacheConnector::PRIO_ERROR, 0, exc.displayText().c_str());
|
|
}
|
|
}
|
|
|
|
|
|
bool ApacheRequestHandlerFactory::mustHandle(const std::string& uri)
|
|
{
|
|
FastMutex::ScopedLock lock(_mutex);
|
|
|
|
// only if the given uri is found in _uris we are
|
|
// handling this request.
|
|
RequestHandlerFactories::iterator it = _requestHandlers.begin();
|
|
RequestHandlerFactories::iterator itEnd = _requestHandlers.end();
|
|
|
|
// if any uri in our map is found at the beginning of the given
|
|
// uri -> then we handle it!!
|
|
for (; it != itEnd; it++)
|
|
{
|
|
// dealing with both cases:
|
|
// handler is registered with: /download
|
|
// uri: /download/xyz
|
|
// uri: /download
|
|
if (uri.find(it->first) == 0 || it->first.find(uri) == 0)
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|