1*960d34c7SStefan Bühler================ 2*960d34c7SStefan BühlerPlugin Interface 3*960d34c7SStefan Bühler================ 4*960d34c7SStefan Bühler 5*960d34c7SStefan Bühler------------ 6*960d34c7SStefan BühlerModule: core 7*960d34c7SStefan Bühler------------ 8*960d34c7SStefan Bühler 9*960d34c7SStefan Bühler:Author: Jan Kneschke 10*960d34c7SStefan Bühler:Date: $Date: 2004/08/01 07:01:29 $ 11*960d34c7SStefan Bühler:Revision: $Revision: 1.1 $ 12*960d34c7SStefan Bühler 13*960d34c7SStefan Bühler:abstract: 14*960d34c7SStefan Bühler The plugin interface is an integral part of lighttpd which 15*960d34c7SStefan Bühler provides a flexible way to add specific functionality to lighttpd. 16*960d34c7SStefan Bühler 17*960d34c7SStefan Bühler.. meta:: 18*960d34c7SStefan Bühler :keywords: lighttpd, plugins 19*960d34c7SStefan Bühler 20*960d34c7SStefan Bühler.. contents:: Table of Contents 21*960d34c7SStefan Bühler 22*960d34c7SStefan BühlerDescription 23*960d34c7SStefan Bühler=========== 24*960d34c7SStefan Bühler 25*960d34c7SStefan BühlerPlugins allow you to enhance the functionality of lighttpd without 26*960d34c7SStefan Bühlerchanging the core of the webserver. They can be loaded at startup time 27*960d34c7SStefan Bühlerand can change virtually any aspect of the behaviour of the webserver. 28*960d34c7SStefan Bühler 29*960d34c7SStefan BühlerPlugin Entry Points 30*960d34c7SStefan Bühler------------------- 31*960d34c7SStefan Bühler 32*960d34c7SStefan Bühlerlighttpd has 16 hooks which are used in different states of the 33*960d34c7SStefan Bühlerexecution of the request: 34*960d34c7SStefan Bühler 35*960d34c7SStefan BühlerServerwide hooks 36*960d34c7SStefan Bühler```````````````` 37*960d34c7SStefan Bühler 38*960d34c7SStefan Bühler:init_: 39*960d34c7SStefan Bühler called when the plugin is loaded 40*960d34c7SStefan Bühler:cleanup_: 41*960d34c7SStefan Bühler called when the plugin is unloaded 42*960d34c7SStefan Bühler:set_defaults_: 43*960d34c7SStefan Bühler called when the configuration has to be processed 44*960d34c7SStefan Bühler:handle_trigger_: 45*960d34c7SStefan Bühler called once a second 46*960d34c7SStefan Bühler:handle_sighup_: 47*960d34c7SStefan Bühler called when the server received a SIGHUP 48*960d34c7SStefan Bühler 49*960d34c7SStefan BühlerConnectionwide hooks 50*960d34c7SStefan Bühler```````````````````` 51*960d34c7SStefan Bühler 52*960d34c7SStefan BühlerMost of these hooks are called in ``http_response_prepare()`` after some 53*960d34c7SStefan Bühlerfields in the connection structure are set. 54*960d34c7SStefan Bühler 55*960d34c7SStefan Bühler:handle_uri_raw_: 56*960d34c7SStefan Bühler called after uri.path_raw, uri.authority and uri.scheme are set 57*960d34c7SStefan Bühler:handle_uri_clean_: 58*960d34c7SStefan Bühler called after uri.path (a clean URI without .. and %20) is set 59*960d34c7SStefan Bühler:handle_docroot_: 60*960d34c7SStefan Bühler called at the end of the logical path handle to get a docroot 61*960d34c7SStefan Bühler:handle_subrequest_start_: 62*960d34c7SStefan Bühler called if the physical path is set up and checked 63*960d34c7SStefan Bühler:handle_subrequest_: 64*960d34c7SStefan Bühler called at the end of ``http_response_prepare()`` 65*960d34c7SStefan Bühler:handle_physical_path_: 66*960d34c7SStefan Bühler called after the physical path is created and no other handler is 67*960d34c7SStefan Bühler found for this request 68*960d34c7SStefan Bühler:handle_request_done_: 69*960d34c7SStefan Bühler called when the request is done 70*960d34c7SStefan Bühler:handle_connection_close_: 71*960d34c7SStefan Bühler called if the connection has to be closed 72*960d34c7SStefan Bühler:handle_joblist_: 73*960d34c7SStefan Bühler called after the connection_state_engine is left again and plugin 74*960d34c7SStefan Bühler internal handles have to be called 75*960d34c7SStefan Bühler:connection_reset_: 76*960d34c7SStefan Bühler called if the connection structure has to be cleaned up 77*960d34c7SStefan Bühler 78*960d34c7SStefan Bühler 79*960d34c7SStefan BühlerPlugin Interface 80*960d34c7SStefan Bühler---------------- 81*960d34c7SStefan Bühler 82*960d34c7SStefan Bühler\*_plugin_init 83*960d34c7SStefan Bühler`````````````` 84*960d34c7SStefan Bühler 85*960d34c7SStefan BühlerEvery plugin has a uniquely-named function which is called after the 86*960d34c7SStefan Bühlerplugin is loaded. It is used to set up the ``plugin`` structure with 87*960d34c7SStefan Bühlersome useful data: 88*960d34c7SStefan Bühler 89*960d34c7SStefan Bühler- name of the plugin ``name`` 90*960d34c7SStefan Bühler- all hooks 91*960d34c7SStefan Bühler 92*960d34c7SStefan BühlerThe field ``data`` and ``lib`` should not be touched in the init function. 93*960d34c7SStefan Bühler``lib`` is the library handler from dlopen and ``data`` will be the storage 94*960d34c7SStefan Bühlerof the internal plugin data. 95*960d34c7SStefan Bühler 96*960d34c7SStefan Bühler:returns: 97*960d34c7SStefan Bühler 0 (not handled) 98*960d34c7SStefan Bühler 99*960d34c7SStefan Bühlerinit 100*960d34c7SStefan Bühler```` 101*960d34c7SStefan Bühler 102*960d34c7SStefan BühlerThe first real call of a plugin function is the init hook which is used 103*960d34c7SStefan Bühlerto set up the internal plugin data. The internal plugin is assigned the 104*960d34c7SStefan Bühler``data`` field mentioned in the \*_plugin_init description. 105*960d34c7SStefan Bühler 106*960d34c7SStefan Bühler:returns: 107*960d34c7SStefan Bühler a pointer to the internal plugin data. 108*960d34c7SStefan Bühler 109*960d34c7SStefan Bühlercleanup 110*960d34c7SStefan Bühler``````` 111*960d34c7SStefan Bühler 112*960d34c7SStefan BühlerThe cleanup hook is called just before the plugin is unloaded. It is meant 113*960d34c7SStefan Bühlerto free all buffers allocated in ``init`` or somewhere else in the plugin 114*960d34c7SStefan Bühlerwhich are still not freed and to close all handles which were opened and 115*960d34c7SStefan Bühlerare not closed yet. 116*960d34c7SStefan Bühler 117*960d34c7SStefan Bühler:returns: 118*960d34c7SStefan Bühler HANDLER_GO_ON if ok (not handled) 119*960d34c7SStefan Bühler 120*960d34c7SStefan Bühlerset_defaults 121*960d34c7SStefan Bühler```````````` 122*960d34c7SStefan Bühler 123*960d34c7SStefan Bühlerset_defaults is your entry point into the configfile parsing. It should 124*960d34c7SStefan Bühlerpass a list of options to ``config_insert_values`` and check if 125*960d34c7SStefan Bühlerthe plugin configuration is valid. If it is not valid yet, it should 126*960d34c7SStefan Bühlerset useful defaults or return with HANDLER_ERROR and an error message. 127*960d34c7SStefan Bühler 128*960d34c7SStefan Bühler:returns: 129*960d34c7SStefan Bühler HANDLER_GO_ON if ok 130*960d34c7SStefan Bühler 131*960d34c7SStefan Bühler HANDLER_ERROR will terminate lighttpd 132*960d34c7SStefan Bühler 133*960d34c7SStefan Bühlerconnection_reset 134*960d34c7SStefan Bühler```````````````` 135*960d34c7SStefan Bühler 136*960d34c7SStefan Bühlercalled at the end of each request 137*960d34c7SStefan Bühler 138*960d34c7SStefan Bühler:returns: 139*960d34c7SStefan Bühler HANDLER_GO_ON if ok 140*960d34c7SStefan Bühler 141*960d34c7SStefan Bühler HANDLER_ERROR on error 142*960d34c7SStefan Bühler 143*960d34c7SStefan Bühlerhandle_trigger 144*960d34c7SStefan Bühler`````````````` 145*960d34c7SStefan Bühler 146*960d34c7SStefan Bühlercalled once a second 147*960d34c7SStefan Bühler 148*960d34c7SStefan Bühler:returns: 149*960d34c7SStefan Bühler HANDLER_GO_ON if ok 150*960d34c7SStefan Bühler 151*960d34c7SStefan Bühler HANDLER_ERROR on error 152*960d34c7SStefan Bühler 153*960d34c7SStefan Bühlerhandle_sighup 154*960d34c7SStefan Bühler````````````` 155*960d34c7SStefan Bühler 156*960d34c7SStefan Bühlercalled if a SIGHUP is received (cycling logfiles, ...) 157*960d34c7SStefan Bühler 158*960d34c7SStefan Bühler:returns: 159*960d34c7SStefan Bühler HANDLER_GO_ON if ok 160*960d34c7SStefan Bühler 161*960d34c7SStefan Bühler HANDLER_ERROR on error 162*960d34c7SStefan Bühler 163*960d34c7SStefan Bühlerhandle_uri_raw 164*960d34c7SStefan Bühler`````````````` 165*960d34c7SStefan Bühler 166*960d34c7SStefan Bühlercalled after uri_raw is set 167*960d34c7SStefan Bühler 168*960d34c7SStefan Bühler:returns: 169*960d34c7SStefan Bühler HANDLER_GO_ON if ok 170*960d34c7SStefan Bühler HANDLER_FINISHED if the final output is prepared 171*960d34c7SStefan Bühler 172*960d34c7SStefan Bühler HANDLER_ERROR on error 173*960d34c7SStefan Bühler 174*960d34c7SStefan Bühlerhandle_uri_clean 175*960d34c7SStefan Bühler```````````````` 176*960d34c7SStefan Bühler 177*960d34c7SStefan Bühlercalled after uri.path is set 178*960d34c7SStefan Bühler 179*960d34c7SStefan Bühler:returns: 180*960d34c7SStefan Bühler HANDLER_GO_ON if ok 181*960d34c7SStefan Bühler HANDLER_FINISHED if the final output is prepared 182*960d34c7SStefan Bühler 183*960d34c7SStefan Bühler HANDLER_ERROR on error 184*960d34c7SStefan Bühler 185*960d34c7SStefan Bühlerhandle_docroot 186*960d34c7SStefan Bühler`````````````` 187*960d34c7SStefan Bühler 188*960d34c7SStefan Bühlercalled when a docroot is needed 189*960d34c7SStefan Bühler 190*960d34c7SStefan Bühler:returns: 191*960d34c7SStefan Bühler HANDLER_GO_ON if ok 192*960d34c7SStefan Bühler HANDLER_FINISHED if the final output is prepared 193*960d34c7SStefan Bühler 194*960d34c7SStefan Bühler HANDLER_ERROR on error 195*960d34c7SStefan Bühler 196*960d34c7SStefan Bühlerhandle_subrequest_start 197*960d34c7SStefan Bühler``````````````````````` 198*960d34c7SStefan Bühler 199*960d34c7SStefan Bühlercalled after physical.path is set 200*960d34c7SStefan Bühler 201*960d34c7SStefan Bühler:returns: 202*960d34c7SStefan Bühler HANDLER_GO_ON if ok 203*960d34c7SStefan Bühler HANDLER_FINISHED if the final output is prepared 204*960d34c7SStefan Bühler 205*960d34c7SStefan Bühler HANDLER_ERROR on error 206*960d34c7SStefan Bühler 207*960d34c7SStefan Bühlerhandle_subrequest 208*960d34c7SStefan Bühler````````````````` 209*960d34c7SStefan Bühler 210*960d34c7SStefan Bühlercalled if subrequest_start requested a COMEBACK or a WAIT_FOR_EVENT 211*960d34c7SStefan Bühler 212*960d34c7SStefan Bühler:returns: 213*960d34c7SStefan Bühler HANDLER_GO_ON if ok 214*960d34c7SStefan Bühler HANDLER_FINISHED if the final output is prepared 215*960d34c7SStefan Bühler 216*960d34c7SStefan Bühler HANDLER_ERROR on error 217*960d34c7SStefan Bühler 218*960d34c7SStefan Bühlerhandle_physical_path 219*960d34c7SStefan Bühler```````````````````` 220*960d34c7SStefan Bühler 221*960d34c7SStefan Bühlercalled after physical.path is set 222*960d34c7SStefan Bühler 223*960d34c7SStefan Bühler:returns: 224*960d34c7SStefan Bühler HANDLER_GO_ON if ok 225*960d34c7SStefan Bühler HANDLER_FINISHED if the final output is prepared 226*960d34c7SStefan Bühler 227*960d34c7SStefan Bühler HANDLER_ERROR on error 228*960d34c7SStefan Bühler 229*960d34c7SStefan Bühler 230*960d34c7SStefan Bühlerhandle_request_done 231*960d34c7SStefan Bühler``````````````````` 232*960d34c7SStefan Bühler 233*960d34c7SStefan Bühlercalled at the end of the request (logging, statistics, ...) 234*960d34c7SStefan Bühler 235*960d34c7SStefan Bühler:returns: 236*960d34c7SStefan Bühler HANDLER_GO_ON if ok 237*960d34c7SStefan Bühler 238*960d34c7SStefan Bühler HANDLER_ERROR on error 239*960d34c7SStefan Bühler 240*960d34c7SStefan Bühlerhandle_connection_close 241*960d34c7SStefan Bühler``````````````````````` 242*960d34c7SStefan Bühler 243*960d34c7SStefan Bühlercalled if the connection is terminated 244*960d34c7SStefan Bühler 245*960d34c7SStefan Bühler:returns: 246*960d34c7SStefan Bühler HANDLER_GO_ON if ok 247*960d34c7SStefan Bühler 248*960d34c7SStefan Bühler HANDLER_ERROR on error 249*960d34c7SStefan Bühler 250*960d34c7SStefan Bühlerhandle_joblist 251*960d34c7SStefan Bühler`````````````` 252*960d34c7SStefan Bühler 253*960d34c7SStefan Bühlercalled if the state of the connection has changed 254*960d34c7SStefan Bühler 255*960d34c7SStefan Bühler:returns: 256*960d34c7SStefan Bühler HANDLER_GO_ON if ok 257*960d34c7SStefan Bühler 258*960d34c7SStefan Bühler HANDLER_ERROR on error 259*960d34c7SStefan Bühler 260*960d34c7SStefan Bühler 261