Apache模块 请大家帮忙分析下哪里有问题?
时间:2011-08-11
来源:互联网
关于正则匹配的地方详细说下(http://localhost/preview?filename=a.dat)有什么方法把a.dat直接取出来给fn。
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
#include "ap_regex.h"
#include "http_log.h"
/* The content handler */
static int preview_handler(request_rec *r)
{
char *fn;// = "/usr/local/httpd-2.3.8/include/httpd.h";
apr_file_t *f = NULL;
apr_status_t rv;
apr_size_t sz;
ap_regex_t *preg;
const char *regex = "filename=([^\\&]*)(.*)";
int regRet = AP_REG_NOMATCH;
int nmatch = AP_MAX_REG_MATCH;
ap_regmatch_t pmatch[nmatch];
if(strlen(r->args) == 0){
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"No args.");
return HTTP_INTERNAL_SERVER_ERROR;
}else{
if(ap_regcomp(preg,regex,0) == 0){
regRet = ap_regexec(preg,r->args,nmatch,pmatch,AP_REG_EXTENDED|AP_REG_ICASE);
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"Compile a regular expression. %s",regex);
}
else{
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server," Compile regular expression fail.");
ap_rputs("ap_regexec error.",r);
return DONE;
}
if(regRet == 0){
fn = (char *)calloc(pmatch[1].rm_eo - pmatch[1].rm_so + 1,sizeof(char));
memcpy(fn,r->args+pmatch[1].rm_so,pmatch[1].rm_eo - pmatch[1].rm_so);
rv = apr_file_open(&f,fn,APR_READ|APR_SENDFILE_ENABLED,APR_OS_DEFAULT,r->pool);
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"Get matched parameter : %s",fn);
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"File open status : %d",rv);
}else{
ap_rprintf(r,"Reguler Expression is not matched %s.\n",r->args);
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"Reguler Expression is not matched.");
return DONE;
}
}
if (strcmp(r->handler, "preview")) {
return DECLINED;
}
r->content_type = "text/html";
if (!r->header_only){
if(rv == APR_SUCCESS){
apr_finfo_t info;
apr_stat(&info,fn,APR_FINFO_SIZE,r->pool);
apr_size_t size = (apr_size_t)info.size;
if (APR_SUCCESS != ap_send_fd(f, r, 0, size, &sz)) {
return HTTP_INTERNAL_SERVER_ERROR;
}
apr_off_t fpos = sz;
while (1) {
/* flush output first */
ap_flush_conn(r->connection);
if (fpos < size) {
/* file grew by finfo.size - fpos */
if (APR_SUCCESS != ap_send_fd(f, r, fpos, size - fpos, &sz)) {
return HTTP_INTERNAL_SERVER_ERROR;
}
fpos += sz;
} else {
break;
}
}
apr_file_close(f);
return OK;
}else{
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"Open %s error!\n args : %s\n", fn,r->args);
return DONE;
}
}
return OK;
}
static void preview_register_hooks(apr_pool_t *p)
{
ap_hook_handler(preview_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA preview_module = {
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
NULL, /* table of config file commands */
preview_register_hooks /* register hooks */
};
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
#include "ap_regex.h"
#include "http_log.h"
/* The content handler */
static int preview_handler(request_rec *r)
{
char *fn;// = "/usr/local/httpd-2.3.8/include/httpd.h";
apr_file_t *f = NULL;
apr_status_t rv;
apr_size_t sz;
ap_regex_t *preg;
const char *regex = "filename=([^\\&]*)(.*)";
int regRet = AP_REG_NOMATCH;
int nmatch = AP_MAX_REG_MATCH;
ap_regmatch_t pmatch[nmatch];
if(strlen(r->args) == 0){
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"No args.");
return HTTP_INTERNAL_SERVER_ERROR;
}else{
if(ap_regcomp(preg,regex,0) == 0){
regRet = ap_regexec(preg,r->args,nmatch,pmatch,AP_REG_EXTENDED|AP_REG_ICASE);
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"Compile a regular expression. %s",regex);
}
else{
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server," Compile regular expression fail.");
ap_rputs("ap_regexec error.",r);
return DONE;
}
if(regRet == 0){
fn = (char *)calloc(pmatch[1].rm_eo - pmatch[1].rm_so + 1,sizeof(char));
memcpy(fn,r->args+pmatch[1].rm_so,pmatch[1].rm_eo - pmatch[1].rm_so);
rv = apr_file_open(&f,fn,APR_READ|APR_SENDFILE_ENABLED,APR_OS_DEFAULT,r->pool);
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"Get matched parameter : %s",fn);
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"File open status : %d",rv);
}else{
ap_rprintf(r,"Reguler Expression is not matched %s.\n",r->args);
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"Reguler Expression is not matched.");
return DONE;
}
}
if (strcmp(r->handler, "preview")) {
return DECLINED;
}
r->content_type = "text/html";
if (!r->header_only){
if(rv == APR_SUCCESS){
apr_finfo_t info;
apr_stat(&info,fn,APR_FINFO_SIZE,r->pool);
apr_size_t size = (apr_size_t)info.size;
if (APR_SUCCESS != ap_send_fd(f, r, 0, size, &sz)) {
return HTTP_INTERNAL_SERVER_ERROR;
}
apr_off_t fpos = sz;
while (1) {
/* flush output first */
ap_flush_conn(r->connection);
if (fpos < size) {
/* file grew by finfo.size - fpos */
if (APR_SUCCESS != ap_send_fd(f, r, fpos, size - fpos, &sz)) {
return HTTP_INTERNAL_SERVER_ERROR;
}
fpos += sz;
} else {
break;
}
}
apr_file_close(f);
return OK;
}else{
ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,r->server,"Open %s error!\n args : %s\n", fn,r->args);
return DONE;
}
}
return OK;
}
static void preview_register_hooks(apr_pool_t *p)
{
ap_hook_handler(preview_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA preview_module = {
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
NULL, /* table of config file commands */
preview_register_hooks /* register hooks */
};
作者: lixingxing35 发布时间: 2011-08-11
没看懂。不过,这位朋友能多给些注释吗?好多函数和变量都只能看单词的意思。可是这里面又都是简写,是在是看的我云里雾里的。
作者: biosman 发布时间: 2011-08-11
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28