Building apache modules

  • 968 views
Uploaded on

This presentation outlines the basics about building apache modules.

This presentation outlines the basics about building apache modules.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
968
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
19
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Building Apache ModulesMarian HackMan Marinov E-Mail: mm@1h.comFounder and CEO of 1H Ltd. Jabber: hackman@jabber.org
  • 2. Apache architecture➢ Request handling➢ Memory handling➢ Module architecture
  • 3. Request handling1. Just after reading the request (no parsing has been done)2. Resolve the file name that this URI is trying to access3. Parse the headers4. Check access (allow/deny IP/Net/Host)5. Check the authentication6. Only if authenticated7. Check and set the request MIME type8. Generic fixups9. Check which (module)function will handle the request10. Do something before the actual log is called
  • 4. Request handlingApache 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➢
  • 6. Module architecture➢ Options table➢ Access table➢ Authentication table➢ Handlers table
  • 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
  • 11. Module names#ifdef APACHE2module AP_MODULE_DECLARE_DATAexample_module;#elsemodule MODULE_VAR_EXPORT example_module;#endif
  • 12. Module definition➢ Apache 1.3➢ Apache 2.x
  • 13. Apache 1.3module MODULE_VAR_EXPORT example_module = { STANDARD_MODULE_STUFF, NULL, /* module initializer */ NULL, /* per-directory config creator */ NULL, /* dir config merger */ NULL, /* server config creator */ NULL, /* server config merger */ NULL, /* command table */ NULL, /* [9] list of handlers */ NULL, /* [2] filename-to-URI translation */ NULL, /* [5] check/validate user_id */
  • 14. Apache 1.3 NULL, /* [6] check user_id is valid *here* */ NULL, /* [4] check access by host address */ NULL, /* [7] MIME type checker/setter */ NULL, /* [8] fixups */ NULL, /* [10] logger */ NULL, /* [3] header parser */ NULL, /* process initializer */ NULL, /* process exit/cleanup */ NULL /* [1] post read_request handling */};
  • 15. Apache 2.xmodule 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
  • 18. Module configuration structuretypedef struct { double dummy_double; int dummy_int; char *dummy_char; array_header *dummy_array;} example_conf;
  • 19. Array handlingstruct 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.3static 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.xstatic 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
  • 24. Module command handlersstatic const char *set_examplecmd(cmd_parms *cmd, void *vconf, char *arg) { example_conf *conf = (example_conf *) vconf; if (cmd->path == NULL) { conf = (example_conf *) ap_get_module_config(cmd->server->module_config, &example_module);#ifdef DEBUG_OPTIONS fprintf(stderr, "mod_example: (%s:%d)Example (server)n", cmd->config_file->name, cmd->config_file->line_number); } else { fprintf(stderr, "mod_example: (%s:%d)RelaxPerms (dir)n", cmd->config_file->name, cmd->config_file->line_number);#endif } conf->dummy_char = ap_pstrdup(cmd->pool, arg); return NULL;}
  • 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
  • 27. Writing portable modules➢ Porting tricks #ifndef APACHE_RELEASE #define APACHE2 #endif➢ Apache common functions ➢ ap_palloc(1.3) -> apr_palloc(2.x)
  • 28. Additional resourceshttp://httpd.apache.org/docs/2.2/developer/
  • 29. Thank you??? Questions ??? Thank you