On 2013-05-11 08:22, Sindhi Sindhi wrote:
Thankyou.
Had one more question. What is the right way of handling this - in which
location in Apache server directory should I be keeping my filter specific
files?
As of now the XML and other files that are read by my filter are placed in
a new folder say "MyFilter" inside "httpd-2.4.4-win64\Apache24\htdocs". Is
this the right way of doing it?
I think a more "elegant" solution would be to have the location
configurable.
For that, you define a module-specific configuration directive. (I am
not familiar with apache 2.4, all my advice is based on apache 2.2, but
I suppose there is a sufficient degree of backwards compatibility.)
For defining configuration directives, you have to take the following steps:
1. You define one or two callback functions, create_dir_config and/or
create_server_config. You put their addresses in the corresponing places
in your module structure. These callback functions are called when
apache starts up and they should create and return an
application-specific configuration object that is opaque for apache; it
sees it as a void pointer.
The server-wide configuration object (created by create_server_config)
contains configuration data that apply to the whole virtual host.
The directory-wide configuration object (created by create_dir_config)
contains configuration data that apply to a <Location> or <Directory>.
So, if you have a server with 3 virtual hosts, you have 3 server
configuration objects per module. However you may have many more
directory configuration objects, depending on your Locations and
Directories.
2. You add one entry to the cmds array of your module structure for each
configuration directive that you want to define. Each cmds array entry
has a placeholder for your configuration directive-specific callback.
The callback function is invoked by apache when it parses the
configuration and it encounters the configuration directive specified by
your module.
3. You define the configuration directive callback. The callback gets
the arguments of the configuration directive. What the callback should
do is to retrieve somehow the configuration object created by the
callback in step 1 and initialise it with the arguments passed by apache
(the configuration values).
The directory-wide configuration object is passed in the second argument
of the configuration callback. You just have to cast the void pointer to
a pointer to the type of your configuration object.
The server-wide configuration object is retrieved as follows:
ap_get_module_config(params->server->module_config, &my_module)
where params is the cmd_parms argument of the configuration directive
callback and my_module is the name of your module structure object.
Note that you don't need to use both a server-wide and a directory-wide
configuration object. The simplest is to use a server-wide. However, a
directory-wide gives you more configuration flexibility.
The callbacks in steps 1-3 are not called as part of request processing.
It's more an apache startup and configuration thing. Once apache starts
processing the requests, it is properly configured and the values of
your configuration directives are stored in the configuration objects.
During request processing you'll just have to retrieve these values from
the configuration objects. This is done is step 4:
4. You retrieve the configuration object of your module from the
request_rec stucture.
For the server-wide:
MyConf *cnf = (MyConf *)ap_get_module_config(r->server->module_config,
&my_module);
For the directory-wide:
MyConf *cnf = (MyConf *)ap_get_module_config(r->per_dir_config, &my_module);
Also, I have downloaded the 64-bit HTTP server from -
http://www.apachelounge.com/download/win64/httpd-2.4.4-win64.zip<http://www.apachelounge.com/download/win64/>
Is this the right official website to download Apache server?
I think the official builds are downloaded from here:
http://httpd.apache.org/download.cgi
On Wed, May 8, 2013 at 11:04 PM, Sorin Manolache <sor...@gmail.com> wrote:
On 2013-05-08 17:02, Sindhi Sindhi wrote:
Hi,
I have written a C++ Apache module that performs filtering of HTML
content.
There are some XML files which are read by this filter when it does the
filtering. During run-time when this filter is invoked, I'd want the
filter
pick up these XML files and read them. I was thinking these XML files can
be placed in the server location "C:\Program
Files\httpd-2.4.4-win64\**Apache24\htdocs\MyFilter\". where MyFilter
folder
will contain all the XML files needed by my filter. How do I access this
location programatically during run-time when the filter is invoked?
How can I get the absolute path of the server installation loacation
(C:\Program Files\httpd-2.4.4-win64\**Apache24\htdocs\) so that I can
append
"MyFilter\" to the same to get the location of the XML files?
I have specified the below in httpd.conf file:
DocumentRoot "C:/Program Files/httpd-2.4.4-win64/**Apache24/htdocs"
ServerRoot "C:/Program Files/httpd-2.4.4-win64/**Apache24"
The signature of my filter looks like this -
static apr_status_t myHtmlFilter(ap_filter_t *f, apr_bucket_brigade
*pbbIn)
I will need the document root or server root or any other path variable
that I can access from my filter that will give me the absolute path
"C:/Program Files/httpd-2.4.4-win64/**Apache24"
const char *ap_server_root in http_main.h (apache 2.2. It could be similar
in 2.4) contains the ServerRoot.
ap_server_root_relative in http_config.h allows you to compose paths
relative to the ServerRoot.
Sorin
Thanks.