/*
Copyright (C) 2002 Philipp Dunkel philipp@dunkel.org This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version. This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
const char* g_mod_xslt_ver = "$Build: "
#include "build.date"
" $";
#define MOD_XSLT_DEBUG
#define XSLT_LOG "/usr/local/apache/logs/xslt.log"
#define MOD_XSLT_VERSION "1.0.5a"
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
#include "http_log.h"
#include "apr_buckets.h"
#include "util_filter.h"
#include "apr_strings.h"
#include "apr_hash.h"
#include "apr_lib.h"
#include <libxml/uri.h>
#include <libxslt/xslt.h>
#include <libxslt/xsltInternals.h>
#include <libxslt/transform.h>
#include <libxslt/xsltutils.h>
module AP_MODULE_DECLARE_DATA xslt_module;
typedef struct {
char *data;
apr_size_t length;
} datastore_t;
static int retrievedata(request_rec *r, apr_bucket_brigade *bb, datastore_t *buffer) {
char *tbuf;
char *nbuf;
apr_size_t tlen;
apr_size_t npos;
apr_bucket *b = APR_BRIGADE_FIRST(bb);
apr_bucket *free_bucket;
while (b!=APR_BRIGADE_SENTINEL(bb) && !APR_BUCKET_IS_EOS(b)) {
if (apr_bucket_read(b, (const char**)&tbuf, &tlen, APR_BLOCK_READ) == APR_SUCCESS) {
nbuf = (char*)malloc(buffer->length + tlen);
npos = 0;
for(npos=0;npos < buffer->length;npos++) {
nbuf[npos] = buffer->data[npos];
}
for(npos=0;npos < tlen;npos++) {
nbuf[buffer->length + npos] = tbuf[npos];
}
buffer->length+=tlen;
if (buffer->data) {
free(buffer->data);
}
buffer->data = nbuf;
} else {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "mod-xslt: Failed to read bucket!");
}
free_bucket = b;
b=APR_BUCKET_NEXT(b);
apr_bucket_delete(free_bucket);
}
if (APR_BUCKET_IS_EOS(b)) {
return 1;
} else {
return 0;
}
}
#define IS_BLANK(val) ((((val)==32) || ((val)==8) || ((val)==10) || ((val)==13))? 1 : 0)
static char *getpiparam(char *content, const char *name) {
char *tempstr=strdup(content);
char *cur, tmp, *start;
char *retval=NULL;
cur = tempstr;
if (cur){
while (*cur > 0) {
while(IS_BLANK(*cur)) {
cur++;
}
if (strncmp(cur,name,strlen(name)) == 0){
cur += strlen(name);
if (*cur != '=') continue;
cur++;
tmp = *cur;
cur ++;
start = cur;
while ((*cur > 0) && (*cur != tmp)) cur++;
if (*cur != tmp) {
continue;
}
*cur = 0;
retval = strdup(start);
break;
} else {
while(!IS_BLANK(*cur) && (*cur > 0)) {
cur++;
}
}
cur++;
}
}
free(tempstr);
return retval;
}
int xsltOutputBufferWrite(void * context, const char * buffer, int len){
ap_filter_t *filter = (ap_filter_t*)context;
apr_bucket_brigade *brigade = (apr_bucket_brigade *)filter->ctx;
char *temp = apr_palloc(filter->r->pool,len);
memcpy(temp,buffer,len);
APR_BRIGADE_INSERT_TAIL(brigade, apr_bucket_transient_create(temp,len,filter->r->connection->bucket_alloc));
return len;
}
static xmlOutputBufferPtr xsltOutputBufferCreate(ap_filter_t *f, xmlCharEncodingHandlerPtr encoder) {
xmlOutputBufferPtr ret;
if (f == NULL) return(NULL);
ret = xmlAllocOutputBuffer(encoder);
if (ret != NULL) {
ret->written = 0;
ret->context = (void*)f;
ret->writecallback = xsltOutputBufferWrite;
ret->closecallback = NULL; /* No close callback */
}
return(ret);
}
static void decode(char *urlstr) {
char *mov = urlstr;
char *tmpstr = NULL;
while (*mov > 0) {
if (*mov == '+') {
*mov = ' ';
}
if (*mov == '%') {
tmpstr = (char*)malloc(3 * sizeof(char));
tmpstr[0] = *(mov + 1);
tmpstr[1] = *(mov + 2);
tmpstr[2] = 0;
*mov = (char)strtol(tmpstr,NULL,16);
free(tmpstr);
mov++;
*mov = 0;
mov += 2;
strcat(urlstr,mov);
mov -= 3;
}
mov++;
}
}
static void addparam(char ***params,const char *key, const char* value) {
int paramcnt=0;
char **mover;
if (*params == NULL) {
*params = (char**)malloc(2 * sizeof(char**));
(*params)[0]=NULL;
(*params)[1]=NULL;
}
if (key==NULL || value==NULL) {
return;
}
if(strchr(key,'\'')||strchr(value,'\'')) {
return;
}
mover = *params;
while (*mover) {
if(strcmp(*mover,key) == 0) {
free(mover[1]);
mover[1] = (char*)malloc(strlen(value) + 3);
strcpy(mover[1],"'");
strcat(mover[1],value);
strcat(mover[1],"'");
return;
}
paramcnt+=2;
mover+=2;
}
mover = *params = (char**)realloc(*params,(paramcnt + 4) * sizeof(char**));
while (*mover) {
mover++;
}
mover[0] = strdup(key);
mover[1] = (char*)malloc(strlen(value) + 3);
strcpy(mover[1],"'");
strcat(mover[1],value);
strcat(mover[1],"'");
mover[2] = NULL;
mover[3] = NULL;
}
static char **urldecode(const char* querystr) {
char **params = NULL;
char *query = NULL;
char *mov = NULL;
char *key = NULL;
char *value = NULL;
if (querystr == NULL) {
return NULL;
}
query = strdup(querystr);
mov = query;
while (*mov > 0) {
if (key == NULL) {
key == mov;
}
if (key && !value && (*mov == '=')) {
*mov = 0;
value = mov + 1;
}
if (key && value && *mov == '&') {
*mov = 0;
decode(key);
decode(value);
addparam(¶ms,key,value);
key=NULL;
value=NULL;
}
mov++;
}
free(query);
return params;
}
static void freeparams(char *** params) {
char **mover = *params;
if (params==NULL) {
return;
}
if (*params == NULL) {
return;
}
while (*mover) {
free(*mover);
mover++;
}
free(*params);
}
#ifdef MOD_XSLT_DEBUG
static void show_parameters(ap_filter_t *f,char **params) {
char **mover = params;
while (*mover) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, "mod-xslt: parameter(%s=%s)",*mover,*(mover+1));
mover+=2;
}
}
#endif
void xslt_error(void *ctx, const char *msg, ...) {
request_rec *context = (request_rec*)ctx;
char *temp = NULL;
int tmplen = 0;
va_list args;
va_start(args,msg);
tmplen = vsnprintf(temp,tmplen,msg,args);
va_end(args);
temp = (char*)malloc((tmplen + 1) *sizeof(char));
va_start(args,msg);
tmplen = vsnprintf(temp,tmplen,msg,args);
va_end;
temp[tmplen] = 0;
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, context, "mod-xslt: XSLT -> %s",temp);
apr_table_set(context->notes, "XSLT-INVALID", "TRUE");
free(temp);
return;
}
xsltStylesheetPtr modxsltLoadStylesheetFile(xmlDocPtr doc, xmlChar *href) {
xmlURIPtr URI;
xsltStylesheetPtr ret = NULL;
if (href != NULL) {
URI = xmlParseURI((const char *) href);
if (URI == NULL) {
xmlFree(href);
return(NULL);
}
if ((URI->fragment != NULL) && (URI->scheme == NULL) &&
(URI->opaque == NULL) && (URI->authority == NULL) &&
(URI->server == NULL) && (URI->user == NULL) &&
(URI->path == NULL) && (URI->query == NULL)) {
xmlAttrPtr ID;
if (URI->fragment[0] == '#')
ID = xmlGetID(doc, (const xmlChar *) &(URI->fragment[1]));
else
ID = xmlGetID(doc, (const xmlChar *) URI->fragment);
if (ID) {
xmlDocPtr fake;
xmlNodePtr subtree;
subtree = ID->parent;
fake = xmlNewDoc(NULL);
if (fake != NULL) {
xmlUnlinkNode(subtree);
xmlAddChild((xmlNodePtr) fake, subtree);
ret = xsltParseStylesheetDoc(fake);
if (ret == NULL)
xmlFreeDoc(fake);
}
}
} else {
xmlChar *URL, *base;
base = xmlNodeGetBase(doc, (xmlNodePtr) doc);
URL = xmlBuildURI(href, base);
if (URL != NULL) {
ret = xsltParseStylesheetFile(URL);
xmlFree(URL);
} else {
ret = xsltParseStylesheetFile(href);
}
if (base != NULL)
xmlFree(base);
}
xmlFreeURI(URI);
xmlFree(href);
}
没有合适的资源?快使用搜索试试~ 我知道了~
mod_xslt.tar.gz_MOD_xml xsl_xsl_xslt
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 90 浏览量
2022-09-14
14:35:53
上传
评论
收藏 127KB GZ 举报
温馨提示
共18个文件
authors:1个
changelog:1个
mk:1个
Here are some short instructions for use of mod-xslt. The stylesheet is specified using the Processing Instruction <?xml-stylesheet type="text/xsl" href="URL-OF-YOUR-STYLESHEET"?> or now new <?xslt-stylesheet agent="THE-USER-AGENT-STRING-OF-THE-BROWSER" href="URL-OF-YOUR-STYLESHEET"?> This now enables you to use different Stylesheets for different browsers. (For example Netscape & IE) (or Web & WAP for that matter)
资源推荐
资源详情
资源评论
收起资源包目录
mod_xslt.tar.gz (18个子文件)
mod_xslt
THANKS 670B
.deps 0B
mod-xslt.c 24KB
Makefile2 398B
modules.mk 148B
.#mod-xslt.c.1.4 25KB
LICENSE 18KB
CVS
Root 19B
Entries 523B
Repository 9B
mod-xslt.o 127KB
README 2KB
INSTALL 2KB
AUTHORS 181B
mod_xslt.so 229KB
Makefile 931B
NEWS 255B
ChangeLog 1KB
共 18 条
- 1
资源评论
weixin_42653672
- 粉丝: 93
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功