mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-14 19:57:17 +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.
149 lines
5.7 KiB
Plaintext
149 lines
5.7 KiB
Plaintext
POCO ApacheConnector User Guide
|
|
POCO ApacheConnector
|
|
|
|
!!!Introduction
|
|
ApacheConnector (<[mod_poco]>) is an Apache module that allows one to write Apache server extensions using
|
|
the POCO Net HTTPServer framework. Almost any subclass of Poco::Net::HTTPRequestHandler written
|
|
for Poco::Net::HTTPServer can be used with ApacheConnector. For this to work, the request handler
|
|
subclass, together with its factory (Poco::Net::HTTPRequestHandlerFactory) must be contained
|
|
in a shared library. The ApacheConnector uses the Poco::ClassLoader to load request handler
|
|
factories from shared libraries.
|
|
|
|
!!!Adding ApacheConnector to Apache
|
|
ApacheConnector is implemented as an ordinary Apache 2 module, named <[mod_poco]>.
|
|
To add <[mod_poco]> to Apache, add the following entry to the Apache configuration
|
|
file (usually <[httpd.conf]>):
|
|
|
|
LoadModule poco_module modules/mod_pocod.so
|
|
----
|
|
|
|
!!!Configuring ApacheConnector
|
|
ApacheConnector must be able to find shared libraries containing request handler, as well
|
|
as optional configuration files. ApacheConnector provides an Poco::Util::Application class
|
|
to request handlers that can be used to access configuration data, loaded from configuration
|
|
files.
|
|
|
|
!!Request Handler Configuration
|
|
|
|
To have the ApacheConnector load a request handler class, the <[AddPocoRequestHandler]> directive
|
|
is used in the Apache configuration file:
|
|
|
|
AddPocoRequestHandler <FactoryClass> <SharedLibrary> <Path>...
|
|
----
|
|
|
|
The first argument specifies the name of the request handler factory class. The second argument
|
|
contains the path of the shared library containing the request handler.
|
|
The third (and optionally following) argument(s) specify the URI paths handled by the
|
|
request handler. For example:
|
|
|
|
AddPocoRequestHandler TimeRequestHandlerFactory p:/Poco/ApacheConnector/samples/TimeServer/bin/TimeServerd.dll /time
|
|
----
|
|
|
|
loads the TimeRequestHandlerFactory from TimeServerd.dll. Whenever a request for a URI starting with "/time"
|
|
is sent by a client, this request will be handled by the TimeRequestHandler.
|
|
|
|
!!Configuration Files
|
|
ApacheConnector can also load POCO configuration files (.ini, .properties or .xml) for later use by
|
|
request handlers. This is done using the <[AddPocoConfig]> directive:
|
|
|
|
AddPocoConfig <Path>
|
|
----
|
|
|
|
where <Path> specifies the full path to the configuration file.
|
|
|
|
In a request handler, the configuration properties loaded this way can be accessed using:
|
|
|
|
Poco::Util::Application& app = Poco::Util::Application::instance();
|
|
std::string myProp = app.config().getString("MyProperty");
|
|
----
|
|
|
|
!!!Logging in Request Handlers
|
|
ApacheConnector provides a special logging channel that logs to Apache's error log file.
|
|
This channel is set as the root channel when the ApacheConnector is loaded, so every
|
|
logger will automatically inherit this channel.
|
|
|
|
|
|
!!!A Sample Request Handler
|
|
Following is a sample for a request handler implementation. The complete sample project can be found in the
|
|
<[samples]> subdirectory of the ApacheConnector directory.
|
|
|
|
#include "Poco/Net/HTTPServer.h"
|
|
#include "Poco/Net/HTTPRequestHandler.h"
|
|
#include "Poco/Net/HTTPRequestHandlerFactory.h"
|
|
#include "Poco/Net/HTTPServerRequest.h"
|
|
#include "Poco/Net/HTTPServerResponse.h"
|
|
#include "Poco/Timestamp.h"
|
|
#include "Poco/DateTimeFormatter.h"
|
|
#include "Poco/DateTimeFormat.h"
|
|
#include "Poco/ClassLibrary.h"
|
|
|
|
|
|
using Poco::Net::HTTPRequestHandler;
|
|
using Poco::Net::HTTPRequestHandlerFactory;
|
|
using Poco::Net::HTTPServerRequest;
|
|
using Poco::Net::HTTPServerResponse;
|
|
using Poco::Timestamp;
|
|
using Poco::DateTimeFormatter;
|
|
using Poco::DateTimeFormat;
|
|
|
|
|
|
class TimeRequestHandler: public HTTPRequestHandler
|
|
/// Return a HTML document with the current date and time.
|
|
{
|
|
public:
|
|
TimeRequestHandler()
|
|
{
|
|
}
|
|
|
|
void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
|
|
{
|
|
Timestamp now;
|
|
std::string dt(DateTimeFormatter::format(now, DateTimeFormat::SORTABLE_FORMAT));
|
|
|
|
response.setChunkedTransferEncoding(true);
|
|
response.setContentType("text/html");
|
|
|
|
std::ostream& ostr = response.send();
|
|
ostr << "<html><head><title>TimeServer powered by POCO ApacheConnector</title>";
|
|
ostr << "<meta http-equiv=\"refresh\" content=\"1\"></head>";
|
|
ostr << "<body><p style=\"text-align: center; font-size: 48px;\">";
|
|
ostr << dt;
|
|
ostr << "</p></body></html>";
|
|
}
|
|
};
|
|
|
|
|
|
class TimeRequestHandlerFactory: public HTTPRequestHandlerFactory
|
|
{
|
|
public:
|
|
TimeRequestHandlerFactory()
|
|
{
|
|
}
|
|
|
|
HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request)
|
|
{
|
|
return new TimeRequestHandler;
|
|
}
|
|
};
|
|
|
|
|
|
POCO_BEGIN_MANIFEST(HTTPRequestHandlerFactory)
|
|
POCO_EXPORT_CLASS(TimeRequestHandlerFactory)
|
|
POCO_END_MANIFEST
|
|
----
|
|
|
|
Both the TimeRequestHandler class and the TimeRequestHandlerFactory class are the same as for
|
|
an ordinary Poco::Net::HTTPServer. The only addition in this sample is the definition
|
|
of the class loader manifest, which allows the ApacheConnector to load the TimeRequestHandlerFactory
|
|
class from the shared library.
|
|
|
|
To run this sample, the following directives must be added to the Apache configuration files:
|
|
|
|
LoadModule poco_module p:/Poco/ApacheConnector/bin/mod_poco.so
|
|
AddPocoRequestHandler TimeRequestHandlerFactory p:/Poco/ApacheConnector/samples/TimeServer/bin/TimeServer.dll /time
|
|
----
|
|
|
|
You'll have to change the paths to <[mod_poco.so]> and <[TimeServer.dll]> to match your
|
|
own environment.
|
|
To test the sample, simply direct your favorite web browser to <http://localhost/time>.
|