⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod-xslt.c

📁 Here are some short instructions for use of mod-xslt. The stylesheet is specified using the Proce
💻 C
📖 第 1 页 / 共 2 页
字号:
	xmlDocPtr result = NULL;	xsltStylesheetPtr stylesheet = NULL;    	xmlNodePtr child = NULL;	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_DEBUG, 0, f->r, "mod-xslt: output brigade created!");	#endif	xmlInitMemory();	xmlLineNumbersDefault(1);#ifdef MOD_XSLT_DEBUG	ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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_DEBUG, 0, f->r, "mod-xslt: document is not valid XML!");#endif	} else {#ifdef MOD_XSLT_DEBUG		ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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_DEBUG, 0, f->r, "mod-xslt: urlparameters set!");#endif		addparam(&parameters,"xslt-useragent",apr_table_get(f->r->headers_in,"User-Agent"));		addparam(&parameters,"xslt-version",MOD_XSLT_VERSION);		addparam(&parameters,"xslt-author","philipp@dunkel.org");		addparam(&parameters,"xslt-document",document->URL);		addparam(&parameters,"xslt-hostname",f->r->server->server_hostname);		addparam(&parameters,"xslt-uri",f->r->uri);		addparam(&parameters,"xslt-filename",f->r->filename);		if (f->r->server->port > 0) {			addparam(&parameters,"xslt-port",apr_psprintf(f->r->pool,"%d",f->r->server->port));		} else {			addparam(&parameters,"xslt-port","80");		}#ifdef MOD_XSLT_DEBUG		ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: system parameters set!");		ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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_DEBUG, 0, f->r, "mod-xslt: document url set to %s!",(char*)document->URL);#endif					free(tmpstr);				} else {					ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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(&parameters,tmpkey,tmpval);						free(tmpval);					}					free(tmpkey);				} else {					ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 0, f->r, "mod-xslt: stylesheet loading attempted!");#endif		if (stylesheet == NULL) {#ifdef MOD_XSLT_DEBUG			ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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_DEBUG, 0, f->r, "mod-xslt: stylesheet contained errors!");			} else {				ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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_DEBUG, 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_DEBUG, 0, f->r, "mod-xslt: brigade passed!");			ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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_DEBUG, 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_DEBUG, 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_DEBUG, 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_DEBUG, 0, f->r, "mod-xslt: brigade passed!");#endif						} else {				const char* cset = "UTF-8";#ifdef MOD_XSLT_DEBUG				ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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){					cset = (const char*)stylesheet->encoding;				}				f->r->content_encoding = NULL; /* instead of cset */#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,cset));				} 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",cset));						} 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",cset));						}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", cset));						} else {							apr_table_set(f->r->headers_out, "Content-Type", apr_psprintf(f->r->pool,"%s; charset=%s","text/html",cset));						}            					} else {						apr_table_set(f->r->headers_out, "Content-Type", apr_psprintf(f->r->pool,"%s; charset=%s","text/html",cset));					}				}				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_DEBUG, 0, f->r, "mod-xslt: result has been passed on!");#endif		}		freeparams(&parameters);#ifdef MOD_XSLT_DEBUG		ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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_unset(f->r->headers_out, "Content-Encoding");	/*	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_DEBUG, 0, f->r, "mod-xslt: f->r->filename: %s",f->r->filename);	ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: f->r->unparsed_uri: %s",f->r->unparsed_uri);	ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: f->r->uri: %s",f->r->uri);	ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: f->r->path_info: %s",f->r->path_info);	ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: f->r->parsed_uri: %s",f->r->parsed_uri);	ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: f->r->server->server_hostname: %s",f->r->server->server_hostname);	ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: f->r->server->port: %d",f->r->server->port);	ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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_DEBUG, 0, f->r, "mod-xslt: data retrieved completely!");#endif		apr_brigade_destroy(brigade);#ifdef MOD_XSLT_DEBUG		ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: input brigade destroyed!");#endif		result = xsltparse(f,inbuf);#ifdef MOD_XSLT_DEBUG		ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 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_DEBUG, 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 + -