3. Request handling
1. Just after reading the request (no parsing has been done)
2. Resolve the file name that this URI is trying to access
3. Parse the headers
4. Check access (allow/deny IP/Net/Host)
5. Check the authentication
6. Only if authenticated
7. Check and set the request MIME type
8. Generic fixups
9. Check which (module)function will handle the request
10. Do something before the actual log is called
4. Request handling
Apache 2.x has two additional hooks:
➢ map_to_storage – runs just before the header
parser
➢ Reads the per-directory configuration
➢ insert_filter – runs just before the handlers
➢ Insert content filter
5. Apache memory pools
➢ Apache allocate memory on pools, which are shared
across all modules within the same child
process/thread.
➢ malloc/free is handled by Apache
➢ configuration is copied across all child processes
➢ misbehaving modules within Apache(mod_php)
➢ Apache common functions
➢ Apache 1.3 - palloc()
➢ Apaceh 2.x – palloc(), string handling
➢
7. How to start
➢ mod_example
➢ Apache 1.3
src/modules/example/mod_example.c
➢ Apache 2.x
modules/experimental/mod_example.c
➢ Include files
8. Structure of a module
➢ Includes
➢ Module name
➢ Module definition
➢ Module commands (options)
➢ Module configuration
9. Includes
➢ httpd.h - the main include (consider it as, stdio.h)
➢ conn_rec, server_rec, request_rec, apache common
functions
➢ http_config.h - configuration
➢ module command definitions
➢ additional functions related to the apache
configuration
➢ http_request.h - request handling functions
➢ http_protocol.h - low level direct manipulation of
the request
10. Includes
➢ http_core.h - this file gives you everything that is
actually provided by mod_core
➢ http_main.h - apache server handling
➢ http_log.h - logging facilities
➢ For Apache 2.0 and 2.2
➢ some apache common functions are moved in apr_strings.h
➢ in order to use the request and protocol functionality you would
need also http_connection.h
➢ if you need server implementation functions you need ap_mpm.h
➢ These are not all includes that you may need in your
modules
15. Apache 2.x
module AP_MODULE_DECLARE_DATA example_module = {
STANDARD20_MODULE_STUFF,
NULL, /* per-directory config creator */
NULL, /* dir config merger */
NULL, /* server config creator */
NULL, /* server config merger */
NULL, /* command table */
NULL, /* set up other request processing hooks */
};
static void register_hooks(apr_pool_t *p) {
static const char * const aszPost[] = { "mod_setenvif.c", NULL };
/* 19 different processing hooks available */
}
16. Module initialization
➢ Apache 1.3
➢ startup and live
➢ the function is called two times
➢ Apache 2.0/2.2 module structure
➢ pre-config
➢ post-config
17. Creating new configuration
directives
➢ Define them in the module configuration
structure
➢ Define new module commands(options)
➢ Create functions to actually set the options,
when found in the config
19. Array handling
struct ip_range *net;
char *proxies[] = IP_RANGES;
pool *p;
conf->nets = ap_make_array(p, IP_RANGES_COUNT,
sizeof(struct ip_range));
for (i = 0; i < IP_RANGES_COUNT; i++) {
net = (struct ip_range *) ap_push_array(conf->nets);
parse_ip( p, proxies[ i ], net );
}
20. Module commands(options)
➢ Apache 1.3
static const command_rec example_cmds[] = {
{
"Example",
cmd_example,
NULL, /* argument to include in call */
OR_OPTIONS,
NO_ARGS,
"Example directive - no arguments"
},
{NULL}
};
21. Module commands(options)
➢ Apache 2.x
static const command_rec x_cmds[] = {
AP_INIT_NO_ARGS(
"Example",
cmd_example,
NULL, /* argument to include in call */
OR_OPTIONS,
"Example directive - no arguments"
),
{NULL}
};
22. Possible arguments
➢ FLAG => One of 'On' or 'Off'
➢ NO_ARGS => No args at all, e.g. </Directory>
➢ RAW_ARGS => cmd_func parses command line itself
➢ TAKE1 => one argument only
➢ TAKE2 => two arguments only
➢ ITERATE => one argument, occuring multiple times
➢ ITERATE2 => two arguments, 2nd occurs multiple times
➢ TAKE12 => one or two arguments
➢ TAKE3 => three arguments only
➢ TAKE23 => two or three arguments
➢ TAKE123 => one, two or three arguments
➢ TAKE13 => one or three arguments
23. Allowed locations for
configuration directives
➢ RSRC_CONF => *.conf outside <Directory> or <Location>
➢ ACCESS_CONF => *.conf inside <Directory> or <Location>
➢ OR_AUTHCFG) => *.conf inside <Directory> or <Location>
and .htaccess when AllowOverride AuthConfig
➢ OR_LIMIT) => *.conf inside <Directory> or <Location>
and .htaccess when AllowOverride Limit
➢ OR_OPTIONS) => *.conf anywhere
and .htaccess when AllowOverride Options
➢ OR_FILEINFO) => *.conf anywhere
and .htaccess when AllowOverride FileInfo
➢ OR_INDEXES) => *.conf anywhere
and .htaccess when AllowOverride Indexes
25. Handling configuration directives
➢ Global vs. Vhost configuration
➢ Per directory/files/location
➢ Merge of the global and per-vhost configuration
➢ Initialization of the configuration
26. Logging
➢ ap_log_error(APLOG_MARK, APLOG_INFO,
r->server, "Some string");
➢ ap_log_rerror(APLOG_MARK, APLOG_INFO,
r, "Some string");
➢ Apache 2.x
➢ Added ap_log_cerror() for conn_rec handling
➢ Added ap_log_perror() for everything that is not server,
record or connection related
➢ Added status code between the server and level