Annotation of parser3/src/targets/apache/mod_parser3.c, revision 1.12

1.1       moko        1: /** @file
1.2       moko        2:        Parser: apache 1.3 and 2.2 module
1.1       moko        3: 
1.12    ! moko        4:        Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com)
1.1       moko        5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
                      6: */
                      7: 
                      8: #ifdef WIN32
                      9: #include <winsock2.h>
                     10: #endif
                     11: 
                     12: #include "httpd.h"
                     13: #include "http_config.h"
                     14: #include "http_core.h"
                     15: #include "http_log.h"
                     16: #include "http_main.h"
                     17: #include "http_protocol.h"
                     18: #include "util_script.h"
1.2       moko       19: 
                     20: #include "pa_httpd.h"
                     21: 
1.12    ! moko       22: volatile const char * IDENT_MOD_PARSER3_C="$Id: 2010-11-23 00:27:02 $" IDENT_PA_HTTPD_H;
        !            23: 
1.3       moko       24: #define PARSER3_HANDLER "parser3-handler"
                     25: 
1.2       moko       26: /*
                     27: * To Ease Compatibility
                     28: */
                     29: #ifdef STANDARD20_MODULE_STUFF
                     30: 
                     31: #include "apr_strings.h"
                     32: 
                     33: #define ap_pcalloc     apr_pcalloc
                     34: #define ap_pstrdup     apr_pstrdup
                     35: 
                     36: #define ap_table_get   apr_table_get
                     37: #define ap_table_elts  apr_table_elts
                     38: #define ap_table_addn  apr_table_addn
                     39: #define ap_table_do    apr_table_do
                     40: 
                     41: #else
                     42: 
1.1       moko       43: #include "ap_alloc.h"
                     44: 
1.2       moko       45: #define apr_pool_t pool
                     46: #define apr_table_t table
                     47: 
                     48: #endif /* STANDARD20_MODULE_STUFF */
1.1       moko       49: 
                     50: /*
                     51: * Declare ourselves so the configuration routines can find and know us.
                     52: * We'll fill it in at the end of the module.
                     53: */
1.2       moko       54: 
                     55: #ifdef STANDARD20_MODULE_STUFF
                     56: module AP_MODULE_DECLARE_DATA parser3_module;
                     57: #else
                     58: module MODULE_VAR_EXPORT parser3_module;
                     59: #endif
1.1       moko       60: 
                     61: /*
                     62: * Locate our directory configuration record for the current request.
                     63: */
                     64: static Parser_module_config *our_dconfig(request_rec *r) {
1.5       moko       65:        return (Parser_module_config *) ap_get_module_config(r->per_dir_config, &parser3_module);
1.1       moko       66: }
                     67: 
1.9       moko       68: static const char* cmd_parser_config(cmd_parms *cmd, void *mconfig, const char *file_spec) {
1.1       moko       69:        Parser_module_config *cfg = (Parser_module_config *) mconfig;
                     70:        cfg->parser_config_filespec=file_spec;
                     71:        return NULL;
                     72: }
                     73: 
                     74: /* 
1.2       moko       75: * Now let's declare routines for each of the callback phase in order.
1.1       moko       76: */
                     77: 
1.3       moko       78: static int parser_handler(request_rec *r) {
                     79: #ifdef STANDARD20_MODULE_STUFF
                     80:        if(strcmp(r->handler, PARSER3_HANDLER))
                     81:                return DECLINED;
                     82: #endif
                     83:        // converting to parser version
                     84:        pa_request_rec pr={
                     85:                r,
                     86:                r->pool,
                     87:                r->header_only,
                     88:                &r->status,
                     89:                r->method,
                     90:                r->headers_out,
                     91:                r->subprocess_env,
                     92:                &r->content_type,
                     93:                r->uri,
                     94:                r->filename,
                     95:                r->path_info,
                     96:                r->args,
                     97: #ifdef STANDARD20_MODULE_STUFF
                     98:                r->finfo.filetype == 0
                     99: #else          
                    100:                r->finfo.st_mode == 0
                    101: #endif
1.1       moko      102:        };
1.6       moko      103:        return pa_parser_handler(&pr, our_dconfig(r));
1.1       moko      104: }
                    105: 
                    106: /* 
1.4       moko      107: * This function is called during process initialisation.
1.1       moko      108: */
                    109: 
1.3       moko      110: #ifdef STANDARD20_MODULE_STUFF
1.10      moko      111: static void parser_child_init(apr_pool_t *p, server_rec *s) {
1.3       moko      112: #else
1.2       moko      113: static void parser_module_init(server_rec *s, apr_pool_t *p) {
1.1       moko      114: #endif 
1.3       moko      115:        ap_log_perror(APLOG_MARK, APLOG_EMERG, 0, p, "parser inited %d", getpid());
1.1       moko      116:        pa_setup_module_cells();
                    117: }
                    118: 
                    119: /* 
1.2       moko      120: * All our process-death routine does is add its trace to the log.
                    121: */
                    122: static void parser_module_done(server_rec *s, apr_pool_t *p) {
1.1       moko      123:        pa_destroy_module_cells();
                    124: }
                    125: 
                    126: /*
1.2       moko      127: * This function gets called to create a per-directory configuration record.
1.1       moko      128: */
1.2       moko      129: static void *parser_create_dir_config(apr_pool_t *p, char *dirspec) {
1.6       moko      130:        Parser_module_config *cfg= ap_pcalloc(p, sizeof(Parser_module_config));
                    131:        cfg->parser_config_filespec=NULL;
                    132:        return cfg;
1.1       moko      133: }
                    134: 
                    135: /*
1.2       moko      136: * This function gets called to create a per-server configuration record.
1.1       moko      137: */
1.2       moko      138: static void *parser_create_server_config(apr_pool_t *p, server_rec *s) {
1.6       moko      139:        Parser_module_config *cfg= ap_pcalloc(p, sizeof(Parser_module_config));
                    140:        cfg->parser_config_filespec=NULL;
                    141:        return cfg;
1.1       moko      142: }
                    143: 
                    144: /* 
                    145: * List of directives specific to our module.
                    146: */
                    147: static const command_rec parser_cmds[] =
                    148: {
1.11      moko      149:        {"ParserConfig", (const char *(*)())cmd_parser_config, 0, OR_OPTIONS, TAKE1, "Parser config filespec"},
1.10      moko      150:        {NULL}
1.1       moko      151: };
                    152: 
                    153: /*--------------------------------------------------------------------------*/
                    154: /* Now the list of content handlers available from this module.             */
                    155: /*--------------------------------------------------------------------------*/
1.2       moko      156: 
                    157: #ifndef STANDARD20_MODULE_STUFF
1.1       moko      158: static const handler_rec parser_handlers[] =
                    159: {
1.3       moko      160:        {PARSER3_HANDLER, parser_handler},
1.1       moko      161:        {NULL}
                    162: };
1.2       moko      163: #endif
1.1       moko      164: 
                    165: /*--------------------------------------------------------------------------*/
                    166: /* Finally, the list of callback routines and data structures that          */
                    167: /* provide the hooks into our module from the other parts of the server.    */
                    168: /*--------------------------------------------------------------------------*/
1.2       moko      169: 
                    170: #ifdef STANDARD20_MODULE_STUFF
                    171: 
1.1       moko      172: /* 
1.2       moko      173: * register hooks.
1.1       moko      174: */
1.2       moko      175: static void parser_register_hooks(apr_pool_t* pool)
                    176: {
                    177:        ap_hook_handler(parser_handler, NULL, NULL, APR_HOOK_MIDDLE);
1.10      moko      178:        ap_hook_child_init(parser_child_init, NULL, NULL, APR_HOOK_MIDDLE);
1.2       moko      179: };
                    180: 
                    181: module AP_MODULE_DECLARE_DATA parser3_module =
                    182: {
                    183:        STANDARD20_MODULE_STUFF,
                    184: #else
1.1       moko      185: module MODULE_VAR_EXPORT parser3_module =
                    186: {
                    187:        STANDARD_MODULE_STUFF,
1.5       moko      188:        parser_module_init,             /* module initializer */
1.2       moko      189: #endif
1.5       moko      190:        parser_create_dir_config,       /* per-directory config creator */
1.6       moko      191:        0,                              /* dir config merger */
1.5       moko      192:        parser_create_server_config,    /* server config creator */
1.6       moko      193:        0,                              /* server config merger */
1.5       moko      194:        parser_cmds,                    /* command apr_table_t */
1.2       moko      195: #ifdef STANDARD20_MODULE_STUFF
1.5       moko      196:        parser_register_hooks           /* register hooks */
1.2       moko      197: #else
1.5       moko      198:        parser_handlers,                /* [9] list of handlers */
                    199:        0,                              /* [2] filename-to-URI translation */
                    200:        0,                              /* [5] check/validate user_id */
                    201:        0,                              /* [6] check user_id is valid *here* */
                    202:        0,                              /* [4] check access by host address */
                    203:        0,                              /* [7] MIME type checker/setter */
                    204:        0,                              /* [8] fixups */
                    205:        0,                              /* [10] logger */
                    206:        0,                              /* [3] header parser */
                    207:        0,                              /* process initializer */
                    208:        parser_module_done              /* process exit/cleanup */
1.2       moko      209: #endif // STANDARD20_MODULE_STUFF
1.1       moko      210: };
                    211: 
                    212: #if defined(_MSC_VER)
                    213: #      define APACHE_WIN32_SRC "../../../../win32/apache13/src"
                    214: #      ifdef _DEBUG
                    215: #              pragma comment(lib, APACHE_WIN32_SRC "/CoreD/ApacheCore.lib")
                    216: #      else
                    217: #              pragma comment(lib, APACHE_WIN32_SRC "/CoreR/ApacheCore.lib")
                    218: #      endif
                    219: #endif
                    220: 
                    221: 
                    222: // interface to C++
                    223: 
1.2       moko      224: void pa_ap_log_rerror(const char *file, int line, int level, const pa_request_rec *s, const char *fmt, ...) {
1.1       moko      225:        const char* str;
                    226:        va_list l;
                    227:        va_start(l, fmt); 
                    228:        str=va_arg(l, const char*);
                    229:        va_end(l); 
                    230: 
                    231:        ap_log_rerror(file, line, level,
1.2       moko      232: #ifdef STANDARD20_MODULE_STUFF
1.10      moko      233:                        0,
1.2       moko      234: #endif
1.10      moko      235:                        (request_rec*)s->real_request_rec, "%s", str);
1.1       moko      236: }
                    237: 
                    238: 
1.2       moko      239: void pa_ap_log_error(const char *file, int line, int level, const pa_server_rec *s, const char *fmt, ...) {
1.1       moko      240:        const char* str;
                    241:        va_list l;
                    242:        va_start(l, fmt); 
                    243:        str=va_arg(l, const char*);
                    244:        va_end(l); 
                    245: 
                    246:        ap_log_error(file, line, level,
1.2       moko      247: #ifdef STANDARD20_MODULE_STUFF
1.10      moko      248:                        0,
1.2       moko      249: #endif
1.10      moko      250:                        (server_rec*)s, "%s", str);
1.1       moko      251: }
                    252: 
                    253: // ap_alloc.h
                    254: 
                    255: const char* pa_ap_table_get(const pa_table *t, const char *name) {
1.2       moko      256:        return ap_table_get((const apr_table_t*)t, name);
1.1       moko      257: }
                    258: void pa_ap_table_addn(pa_table *t, const char *name, const char *val) {
1.2       moko      259:        ap_table_addn((apr_table_t*)t, name, val);
1.1       moko      260: }
                    261: 
                    262: int pa_ap_table_size(const pa_table *t) {
1.2       moko      263:        return ap_table_elts((const apr_table_t*)t)->nelts;
1.1       moko      264: }
                    265: 
1.2       moko      266: void pa_ap_table_do(int (*comp) (void *, const char *, const char *), void *rec, const pa_table *t, ...) {
                    267:        ap_table_do(comp, rec, (apr_table_t*)t, 0);
1.1       moko      268: }
                    269: 
                    270: char * pa_ap_pstrdup(pa_pool *p, const char *s) {
1.2       moko      271:        return ap_pstrdup((apr_pool_t*)p, s);
1.1       moko      272: }
                    273: 
                    274: // http_protocol.h
                    275: 
                    276: int pa_ap_setup_client_block(pa_request_rec *r, int read_policy) {
                    277:        return ap_setup_client_block((request_rec*)r->real_request_rec,
                    278:                read_policy);
                    279: }
                    280: int pa_ap_should_client_block(pa_request_rec *r) {
                    281:        return ap_should_client_block((request_rec*)r->real_request_rec);
                    282: }
                    283: long pa_ap_get_client_block(pa_request_rec *r, char *buffer, int bufsiz) {
                    284:        return ap_get_client_block((request_rec*)r->real_request_rec,
                    285:                buffer, bufsiz);
                    286: }
                    287: void pa_ap_send_http_header(pa_request_rec *r) {
1.2       moko      288: // Apache2 send headers before body automatically
                    289: #ifndef STANDARD20_MODULE_STUFF
1.1       moko      290:        ap_send_http_header((request_rec*)r->real_request_rec);
1.2       moko      291: #endif
1.1       moko      292: }
                    293: int pa_ap_rwrite(const void *buf, int nbyte, pa_request_rec *r) {
                    294:        return ap_rwrite(buf, nbyte, (request_rec*)r->real_request_rec);
                    295: }
                    296: 
                    297: // http_main.h
                    298: 
1.7       moko      299: void pa_ap_hard_timeout(const char *s, pa_request_rec *r) {
1.2       moko      300: // Apache 2 uses non-blocking I/O
                    301: #ifndef STANDARD20_MODULE_STUFF
1.11      moko      302:        ap_hard_timeout((char *)s, (request_rec*)r->real_request_rec);
1.2       moko      303: #endif
1.1       moko      304: }
                    305: void pa_ap_reset_timeout(pa_request_rec *r) {
1.2       moko      306: #ifndef STANDARD20_MODULE_STUFF
1.1       moko      307:        ap_reset_timeout((request_rec*)r->real_request_rec);
1.2       moko      308: #endif
1.1       moko      309: }
                    310: void pa_ap_kill_timeout(pa_request_rec *r) {
1.2       moko      311: #ifndef STANDARD20_MODULE_STUFF
1.1       moko      312:        ap_kill_timeout((request_rec*)r->real_request_rec);
1.2       moko      313: #endif
1.1       moko      314: }
                    315: 
                    316: // util_script.h
                    317: 
                    318: void pa_ap_add_cgi_vars(pa_request_rec *r) {
                    319:        ap_add_cgi_vars((request_rec*)r->real_request_rec);
                    320: }
                    321: void pa_ap_add_common_vars(pa_request_rec *r) {
                    322:        ap_add_common_vars((request_rec*)r->real_request_rec);
                    323: }
                    324: 
1.2       moko      325: #ifndef WIN32
1.1       moko      326: // signal.h
                    327: 
                    328: void (*pa_signal (int sig, void (*disp)(int)))(int) {
                    329:        if(sig==PA_SIGPIPE && disp==PA_SIG_IGN)
                    330:                return signal(SIGPIPE, SIG_IGN);
                    331: 
                    332:        return 0;
                    333: }
1.5       moko      334: #endif

E-mail: