当前位置: 首页 > news >正文

重拾cgi——cgi dispatcher

java网页写多了,没事用c++写着玩。cgi,应该算是非常老了,它的最大好处,就是弄成可执行程序放进去就OK了。
因为平时只会用apache,这里使用的http服务器都是apache2。
为了使用类似java servlet方式,自己来绑定uri和执行方法,通过写一个dispatcher和rewrite来搞定。
首先,需要将所有访问重写到这个dispatcher上,这里是一个简单的rewrite规则:
[cce]
RewriteEngine On
RewriteRule ^/cgi-bin/(.*)$ /cgi-bin/cppweb/$1 [L,PT,QSA]
[/cce]
这里cppweb是一个编译出来的可执行程序,rewrite后面的参数:
L:最后一条匹配的规则
PT:执行完成后继续执行其他处理(这里主要是为了应用alias配置)
QSA:追加query string
这样,如果请求/cgi-bin/a,内部会被重写成/cgi-bin/cppweb/a。
后面就是cppweb的实现了。为了方便,对于cgi的处理,采用了gnu的cgicc库,它对很对cgi操作进行了封装。
大致实现:
[cce lang=”cpp”]
int main(int argc, char **argv) {
REGISTER_URL("/list", List, handle);
REGISTER_URL("/video/new", VideoNew, handle);

cgicc::Cgicc cgi;
cgicc::CgiEnvironment env = cgi.getEnvironment();
cgicc::CgiInput input = cgicc::CgiInput();
ctemplate::Template::SetTemplateRootDirectory(input.getenv("TEMPLATE_PATH"));

Context ctx = {cgi, input, std::cout};
Handler::instance().handleFunc(env.getPathInfo(), ctx);
return 0;
}
[/cce]
前面两行暂时忽略,是用来对url和处理的函数进行绑定用的,后面进行介绍。这里先创建cgicc对象,它主要封装了cgi环境变量和输入、输出。这里后面可以参考cgicc里面的实例,将cgi改造成fastcgi。刚刚重写的url,这里可以通过cgi中的环境变量path info来或者,cgicc中将这个环境变量封装成了一个独立的方法。如刚才重写后的url /cgi-bin/cppweb/a,这里获取到的path info就是/a,然后就可以通过/a和最终处理业务逻辑的函数绑定在一起就搞定了。
这里还介绍下自定义环境变量的用法。上面的代码里面获取了环境变量TEMPLATE_PATH,最为输出模板的查询根路径,直接在apache配置中增加:
[cce]
SetEnv TEMPLATE_PATH /tmp/mycppweb/templates
[/cce]
这样就能在运行时获取到这个模板路径了,网站可以通过类似的方式定义其他参数,类似j2ee里面的web.xml差不多吧。


转载自:https://coolex.info/blog/338.html

相关文章:

  • 从零搭建基于SpringBoot的秒杀系统(三):首页、详情页编写
  • 从零搭建基于SpringBoot的秒杀系统(四):雪花算法生成订单号以及抢购功能实现
  • 操作系统实验一 命令解释程序的编写
  • 从零搭建基于SpringBoot的秒杀系统(五):基于Shiro的人员登陆认证
  • 从零搭建基于SpringBoot的秒杀系统(六):使用RabbitMQ让订单指定时间后失效
  • 从零搭建基于SpringBoot的秒杀系统(七):高并发导致超卖问题分析处理
  • 从零搭建基于SpringBoot的秒杀系统(八):通过分布式锁解决多线程导致的问题
  • 读《世界是数字的》有感
  • 面试官问我:什么是静态代理?什么是动态代理?注解、反射你会吗?
  • redis入门到精通系列(十):springboot集成redis及redis工具类的编写
  • css3延时动画
  • redis入门到精通系列(十一):redis的缓存穿透、缓存击穿以及缓存雪崩详解
  • 子数组最大值设计02
  • redis入门到精通系列(十二):看完这一篇文章别再说不懂布隆过滤器
  • 如何用SpringBoot(2.3.3版本)快速搭建一个项目?文末有小彩蛋
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular2开发踩坑系列-生产环境编译
  • axios 和 cookie 的那些事
  • Gradle 5.0 正式版发布
  • HTTP 简介
  • JavaScript服务器推送技术之 WebSocket
  • java多线程
  • leetcode386. Lexicographical Numbers
  • magento2项目上线注意事项
  • Redis 懒删除(lazy free)简史
  • Solarized Scheme
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue2 SSR 的优化之旅
  • Yeoman_Bower_Grunt
  • 动态规划入门(以爬楼梯为例)
  • 给github项目添加CI badge
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前端临床手札——文件上传
  • 前端学习笔记之观察者模式
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用putty远程连接linux
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 责任链模式的两种实现
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Java数据解析之JSON
  • 阿里云重庆大学大数据训练营落地分享
  • ​520就是要宠粉,你的心头书我买单
  • ![CDATA[ ]] 是什么东东
  • # 安徽锐锋科技IDMS系统简介
  • #微信小程序:微信小程序常见的配置传值
  • (02)vite环境变量配置
  • (C语言)二分查找 超详细
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)ssm码农论坛 毕业设计 231126
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐