设为首页 收藏本站
查看: 242|回复: 0

[经验分享] Apache模块-下载文件-性能测试打靶用的靶子

[复制链接]

尚未签到

发表于 2017-1-10 10:03:43 | 显示全部楼层 |阅读模式
  apache模块,
  下载某一个文件,
  性能测试打靶用,
  当靶子。

/*
**  mod_preview.c -- Apache sample preview module
**  [Autogenerated via ``apxs -n preview -g'']
**
**  To play with this sample module first compile it into a
**  DSO file and install it into Apache's modules directory
**  by running:
**
**    $ apxs -c -i mod_preview.c
**
**  Then activate it in Apache's httpd.conf file for instance
**  for the URL /preview in as follows:
**
**    #   httpd.conf
**    LoadModule preview_module modules/mod_preview.so
**    <Location /preview>
**    SetHandler preview
**    </Location>
**
**  Then after restarting Apache via
**
**    $ apachectl restart
**
**  you immediately can request the URL /preview and watch for the
**  output of this module. This can be achieved for instance via:
**
**    $ lynx -mime_header http://localhost/preview
**
**  The output should be similar to the following one:
**
**    HTTP/1.1 200 OK
**    Date: Tue, 31 Mar 1998 14:42:22 GMT
**    Server: Apache/1.3.4 (Unix)
**    Connection: close
**    Content-Type: text/html
**  
**    The page from mod_preview.c
*/
#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                      */
};

  编译:
  apxs -c mod_preview.c
  安装:
  apxs -ia mod_preview.la
  配置:
  vim httpd.conf
  添加:
  <Location /preview>

        SetHandler preview

</Location>
  注意apache进程的用户权限和被访问文件的权限
  URL参数:
  const char *regex = "filename=([^\\&]*)(.*)";
  正则扣取filename后面的文件绝对路径。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-326411-1-1.html 上篇帖子: Apache启用GZIP压缩优化网站(GZIP、网站优化) 下篇帖子: Apache+Tomcat负载平衡设置实例详解 (1)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表