📄 .#mod-xslt.c.1.4
字号:
xmlNodePtr deadchild = NULL; xmlOutputBufferPtr output; char **parameters = NULL; apr_table_t *cfg = NULL; apr_status_t resval; apr_bucket_brigade *resultbrigade = apr_brigade_create(f->r->pool,NULL); char *tmpstr; char *tmpkey; char *tmpval;#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: output brigade created!"); #endif xmlInitMemory(); xmlLineNumbersDefault(1);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: libxml/libxslt initialized!");#endif document = xmlParseMemory(inbuf->data, inbuf->length);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: input memory parsed!");#endif if (document == NULL) { APR_BRIGADE_INSERT_TAIL(resultbrigade, apr_bucket_transient_create(inbuf->data , inbuf->length,f->r->connection->bucket_alloc)); APR_BRIGADE_INSERT_TAIL(resultbrigade, apr_bucket_eos_create(f->r->connection->bucket_alloc)); resval = ap_pass_brigade(f->next, resultbrigade);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: document is not valid XML!");#endif } else {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: document is valid XML!");#endif document->URL = (xmlChar*)apr_pstrdup(f->r->pool,f->r->filename);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: document url set to %s!",(char*)document->URL);#endif parameters = urldecode(f->r->args);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: urlparameters set!");#endif addparam(¶meters,"xslt-useragent",apr_table_get(f->r->headers_in,"User-Agent")); addparam(¶meters,"xslt-version",MOD_XSLT_VERSION); addparam(¶meters,"xslt-author","philipp@dunkel.org"); addparam(¶meters,"xslt-document",document->URL); addparam(¶meters,"xslt-hostname",f->r->server->server_hostname); addparam(¶meters,"xslt-uri",f->r->uri); addparam(¶meters,"xslt-filename",f->r->filename); if (f->r->server->port > 0) { addparam(¶meters,"xslt-port",apr_psprintf(f->r->pool,"%d",f->r->server->port)); } else { addparam(¶meters,"xslt-port","80"); }#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: system parameters set!"); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: parameters are at %d!",parameters);#endif child = document->children; while (child){ if ((child->type == XML_PI_NODE) && (xmlStrEqual(child->name, BAD_CAST "xslt-base"))) {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: xslt-base has been found!");#endif tmpstr = getpiparam((char*)child->content, "mode"); if(tmpstr) { if (strcmp(tmpstr,"file://") == 0){ document->URL = (xmlChar*)apr_pstrdup(f->r->pool,f->r->filename); } else { if(f->r->server->port) { document->URL = (xmlChar*)apr_psprintf(f->r->pool,"http://%s:%d%s",f->r->server->server_hostname,f->r->server->port,f->r->unparsed_uri); } else { document->URL = (xmlChar*)apr_psprintf(f->r->pool,"http://%s%s",f->r->server->server_hostname,f->r->unparsed_uri); } }#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: document url set to %s!",(char*)document->URL);#endif free(tmpstr); } else { ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: xslt-base is missing argument mode=\"file://|http://\"!"); } } child = child->next; } child = document->children; while (child){ if ((child->type == XML_PI_NODE) && (xmlStrEqual(child->name, BAD_CAST "xslt-param"))) {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: xslt-param has been found!");#endif tmpkey = getpiparam((char*)child->content, "name"); tmpval = getpiparam((char*)child->content, "select"); if (tmpkey) { if(tmpval) { addparam(¶meters,tmpkey,tmpval); free(tmpval); } free(tmpkey); } else { ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: xslt-param is missing argument name!"); if(tmpval) { free(tmpval); } } } child = child->next; } apr_table_set(f->r->notes, "XSLT-INVALID", "FALSE"); xmlSetGenericErrorFunc((void*)(f->r), xslt_error); xsltSetGenericErrorFunc((void*)(f->r), xslt_error); stylesheet = modxsltLoadStylesheetPI(document, apr_table_get(f->r->headers_in,"User-Agent"));#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: stylesheet loading attempted!");#endif if (stylesheet == NULL) {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: stylesheet loading from apache-config attempted!");#endif cfg = (apr_table_t *) ap_get_module_config(f->r->per_dir_config, &xslt_module); stylesheet = modxsltLoadStylesheetFile(document, (xmlChar *)apr_table_get(cfg,f->r->content_type)); if (stylesheet == NULL) { ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: config loading %s -> %s !",f->r->content_type, apr_table_get(cfg,f->r->content_type) ); } } xmlSetGenericErrorFunc(NULL, NULL); xsltSetGenericErrorFunc(NULL, NULL); conststr = apr_table_get(f->r->notes,"XSLT-INVALID"); if ((stylesheet == NULL)||(strcmp(conststr,"TRUE")==0)) {#ifdef MOD_XSLT_DEBUG if (stylesheet!=NULL) { ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: stylesheet contained errors!"); } else { ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: no stylesheet associated or could not load stylesheet!"); }#endif APR_BRIGADE_INSERT_TAIL(resultbrigade, apr_bucket_transient_create(inbuf->data,inbuf->length,f->r->connection->bucket_alloc));#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: original data has been put into brigade!");#endif APR_BRIGADE_INSERT_TAIL(resultbrigade, apr_bucket_eos_create(f->r->connection->bucket_alloc));#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: brigade terminated!");#endif resval = ap_pass_brigade(f->next, resultbrigade);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: brigade passed!"); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: no stylesheet associated or could not load stylesheet!");#endif } if ((stylesheet != NULL)&&(strcmp(conststr,"TRUE")!=0)) {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: stylesheet loaded!");#endif#ifdef MOD_XSLT_DEBUG show_parameters(f,parameters);#endif xmlSetGenericErrorFunc((void*)(f->r), xslt_error); xsltSetGenericErrorFunc((void*)(f->r), xslt_error); result = xsltApplyStylesheet(stylesheet, document, (const char **)parameters); xmlSetGenericErrorFunc(NULL, NULL); xsltSetGenericErrorFunc(NULL, NULL); if (result == NULL) {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: Parsing failed!");#endif APR_BRIGADE_INSERT_TAIL(resultbrigade, apr_bucket_transient_create(inbuf->data,inbuf->length,f->r->connection->bucket_alloc));#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: original data has been put into brigade!");#endif APR_BRIGADE_INSERT_TAIL(resultbrigade, apr_bucket_eos_create(f->r->connection->bucket_alloc));#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: brigade terminated!");#endif resval = ap_pass_brigade(f->next, resultbrigade);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: brigade passed!");#endif } else {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: content has been transformed!");#endif f->ctx = resultbrigade; output = xsltOutputBufferCreate(f, xmlFindCharEncodingHandler((const char*)stylesheet->encoding)); xsltSaveResultTo(output,result,stylesheet);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: result put into brigade!");#endif APR_BRIGADE_INSERT_TAIL(resultbrigade, apr_bucket_eos_create(f->r->connection->bucket_alloc)); if (stylesheet->encoding){ apr_table_set(f->r->headers_out, "charset", (const char*)stylesheet->encoding); } else { apr_table_set(f->r->headers_out, "charset", "UTF-8"); } f->r->content_encoding=apr_table_get(f->r->headers_out, "charset");#ifdef MEDIATYPEPATCH modxsltGetMediaType(stylesheet);#endif if (stylesheet->mediaType){ apr_table_set(f->r->headers_out, "Content-Type", apr_psprintf(f->r->pool,"%s; charset=%s",(const char*)stylesheet->mediaType,f->r->content_encoding)); } else { if (stylesheet->method){ if (strcmp((char*)stylesheet->method,"xml") == 0){ apr_table_set(f->r->headers_out, "Content-Type", apr_psprintf(f->r->pool,"%s; charset=%s","text/xml",f->r->content_encoding)); } else if (strcmp((char*)stylesheet->method,"html") == 0){ apr_table_set(f->r->headers_out, "Content-Type", apr_psprintf(f->r->pool,"%s; charset=%s","text/html",f->r->content_encoding)); }else if (strcmp((char*)stylesheet->method,"text") == 0){ apr_table_set(f->r->headers_out, "Content-Type", apr_psprintf(f->r->pool,"%s; charset=%s","text/plain",f->r->content_encoding)); } else { apr_table_set(f->r->headers_out, "Content-Type", apr_psprintf(f->r->pool,"%s; charset=%s","text/html",f->r->content_encoding)); } } else { apr_table_set(f->r->headers_out, "Content-Type", apr_psprintf(f->r->pool,"%s; charset=%s","text/html",f->r->content_encoding)); } } f->r->content_type=apr_table_get(f->r->headers_out, "Content-Type"); } resval = ap_pass_brigade(f->next, resultbrigade);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: result has been passed on!");#endif } freeparams(¶meters);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: parameters freed!");#endif } if (result) { xmlFreeDoc(result); } if (stylesheet) { xsltFreeStylesheet(stylesheet); } if (document) { document->URL = NULL; xmlFreeDoc(document); } xmlCleanupParser(); xmlMemoryDump(); return resval;}/*static int printitem(void *data, const char *key, const char *value){ request_rec *r = (request_rec*)data; ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r, "mod-xslt-headers: \"%s\" = \"%s\"",key,value); return 1;}*/static apr_status_t xslt_filter(ap_filter_t *f, apr_bucket_brigade *brigade){ datastore_t *inbuf; datastore_t *outbuf; apr_status_t result; apr_table_unset(f->r->headers_out, "Content-Length"); /* apr_table_do(&printitem,(void *)f->r,f->r->headers_in,NULL); apr_table_do(&printitem,(void *)f->r,f->r->headers_out,NULL); apr_table_do(&printitem,(void *)f->r,f->r->notes,NULL); */ if (f->ctx) { inbuf=(datastore_t*)f->ctx; } else { inbuf = (datastore_t*)f->ctx = malloc(sizeof(*inbuf)); inbuf->data=NULL; inbuf->length=0; }#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: f->r->filename: %s",f->r->filename); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: f->r->unparsed_uri: %s",f->r->unparsed_uri); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: f->r->uri: %s",f->r->uri); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: f->r->path_info: %s",f->r->path_info); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: f->r->parsed_uri: %s",f->r->parsed_uri); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: f->r->server->server_hostname: %s",f->r->server->server_hostname); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: f->r->server->port: %d",f->r->server->port); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: server(constructed): %s",ap_construct_server(f->r->pool,f->r->server->server_hostname,f->r->server->port,f->r)); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: http-url(constructed): %s%s",ap_construct_server(f->r->pool,f->r->server->server_hostname,f->r->server->port,f->r),f->r->unparsed_uri);#endif if (retrievedata(f->r,brigade,inbuf)) {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: data retrieved completely!");#endif apr_brigade_destroy(brigade);#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: input brigade destroyed!");#endif result = xsltparse(f,inbuf); f->r->content_encoding= NULL; /* for remove Content-Encoding */#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: content_encoding = NULL"); ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: parsing done!");#endif if (inbuf->data) { free(inbuf->data); } free(inbuf); f->ctx=NULL; return result; } else {#ifdef MOD_XSLT_DEBUG ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, f->r, "mod-xslt: data retrieved partially!");#endif return APR_SUCCESS; }}static void xslt_register_hooks(apr_pool_t *p){ ap_register_output_filter("XSLT", xslt_filter, NULL, AP_FTYPE_RESOURCE);}static void *create_xslt_dir_config(apr_pool_t *p, char *dir){ return apr_table_make(p, 0);}static void *merge_xslt_dir_config(apr_pool_t *p, void *basev, void *overridesv) { return apr_table_overlay(p,(apr_table_t*)overridesv,(apr_table_t*)basev);}static const char *set_stylesheet(cmd_parms *cmd, void *pcfg, const char *mime, const char *style) { apr_table_t *cfg = (apr_table_t*) pcfg; apr_table_set(cfg, mime, style); return NULL;}static const char *unset_stylesheet(cmd_parms *cmd, void *pcfg, const char *mime) { apr_table_t *cfg = (apr_table_t*) pcfg; apr_table_unset(cfg, mime); return NULL;}static const char *set_debugfile(cmd_parms *cmd, void *pcfg, const char *filename) { apr_table_t *cfg = (apr_table_t*) pcfg; apr_table_set(cfg, "XSLTDebug", filename); return NULL;}static const command_rec xslt_cmds[] ={ AP_INIT_TAKE2("XSLTSetStylesheet", set_stylesheet, NULL, OR_OPTIONS, "XSLTSetStylesheet <MimeType> <Stylesheet>"), AP_INIT_TAKE1("XSLTSetXSLTDebug", set_debugfile, NULL, OR_OPTIONS, "XSLTSetXSLTDebug TRUE|FALSE"), AP_INIT_TAKE1("XSLTUnSetStylesheet", unset_stylesheet, NULL, OR_OPTIONS, "XSLTUnSetStylesheet <MimeType>"), {NULL}};/* Dispatch list for API hooks */module AP_MODULE_DECLARE_DATA xslt_module = { STANDARD20_MODULE_STUFF, create_xslt_dir_config, /* create per-dir config structures */ merge_xslt_dir_config, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ xslt_cmds, /* table of config file commands */ xslt_register_hooks /* register hooks */};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -