library mod_hello; // The mode must be objfpc on this unit because the unix code uses // some extensions introduced on Free Pascal //insert into httpd.conf (Windows: xampp\apache\conf\ Linux: /opt/lampp/etc/) // LoadModule hello_module modules/mod_hello.so // // SetHandler hello-handler // {$ifdef fpc} {$mode objfpc}{$H+} {$endif} {$IFDEF WIN32} {$DEFINE WINDOWS} {$ENDIF} {$define Apache2_2} uses SysUtils, httpd {$ifndef Apache1_3}, apr{$endif}; var hello_module: module; public name 'hello_module'; default_module_ptr: Pmodule; const MODULE_NAME = 'mod_hello.so'; // Free Pascal only supports exporting variables on Windows exports hello_module name 'hello_module'; // Handles apache requests function DefaultHandler(r: Prequest_rec): Integer; cdecl; var RequestedHandler: string; begin RequestedHandler := r^.handler; // We decline to handle a request if hello-handler is not the value of r->handler if not SameText(RequestedHandler, 'hello-handler') then begin Result := DECLINED; Exit; end; // The following line just prints a message to the errorlog // ap_log_error(MODULE_NAME, 54, APLOG_NOERRNO or APLOG_NOTICE, // {$ifndef Apache1_3}0,{$endif} r^.server, // 'mod_hello: %s', [PChar('Before content is output')]); // We set the content type before doing anything else {$ifdef Apache1_3} r^.content_type := 'text/html'; // ap_send_http_header(r); {$else} ap_set_content_type(r, 'text/html'); {$endif} // If the request is for a header only, and not a request for the whole content, // then return OK now. We don't have to do anything else. if (r^.header_only <> 0) then begin Result := OK; Exit; end; // Now we just print the contents of the document using the ap_rputs and // ap_rprintf functions. More information about the use of these can be found // in http_protocol.inc } ap_rputs('' + LineEnding, r); ap_rputs('' + LineEnding, r); ap_rputs('Hello There' + LineEnding, r); ap_rputs('' + LineEnding, r); ap_rputs('' + LineEnding ,r); ap_rputs('

Hello world

' + LineEnding, r); ap_rputs('This is the first Apache Module working with the new binding from Free Pascal' + LineEnding, r); // ap_rprintf(r, '
A sample line generated by ap_rprintf
' + LineEnding, []); ap_rputs('' + LineEnding, r); // We can either return OK or DECLINED at this point. If we return // * OK, then no other modules will attempt to process this request Result := OK; end; // Registers the hooks {$ifdef apache1_3} procedure hw_init(s: PServer_rec; p: PPool); cdecl; begin end; var hw_handlers: array[0..0] of handler_rec = ( (content_type: 'hw_app'; handler: @DefaultHandler) ); {$else} procedure RegisterHooks(p: Papr_pool_t); cdecl; begin ap_hook_handler(@DefaultHandler, nil, nil, APR_HOOK_MIDDLE); end; {$endif} // Library initialization code {$ifdef WINDOWS}{$R *.res}{$endif} begin default_module_ptr := @hello_module; FillChar(default_module_ptr^, SizeOf(default_module_ptr^), 0); {$ifdef apache1_3} STANDARD_MODULE_STUFF(hello_module); with hello_module do begin name := MODULE_NAME; init := @hw_init; handlers := hw_handlers; end; {$else} STANDARD20_MODULE_STUFF(hello_module); with hello_module do begin name := MODULE_NAME; register_hooks := @RegisterHooks; end; {$endif} end.