重拾cgi——uri绑定

简介: 前面两篇博客讲了从uri到模板输出,还没有提到中间处理参数的部分。 首先,参数绑定简单的放在一个map中,这里用的是boost的unordered_map(也就是hashmap),其实已经可以使用c++11提供的unordered_map了。 [cce lang=”cpp”] boost::u
前面两篇博客讲了从uri到模板输出,还没有提到中间处理参数的部分。
首先,参数绑定简单的放在一个map中,这里用的是boost的unordered_map(也就是hashmap),其实已经可以使用c++11提供的unordered_map了。
[cce lang=”cpp”]
boost::unordered::unordered_map<std::string, RequestHandleFunc> _mapping;
[/cce]
这个map的value,是一个functor,具体定义为:
[cce lang=”cpp”]
typedef boost::function<void (Context &context)> RequestHandleFunc;
[/cce]
也就是没有返回值,参数是Context的函数。
Context结构非常简单,主要是封装了输入和输出,也就是cgi、ostream、dict等对象,没有进行太多的抽象。
[cce lang=”cpp”]
struct Context
{
cgicc::Cgicc &cgi;
cgicc::CgiInput &input;
std::ostream &ostream;
boost::shared_ptr<ctemplate::TemplateDictionary> dict;
};
[/cce]
这里增加了cgiInput,主要是因为cgicc封装了常用cgi环境变量,没法取到自定义环境变量(前一篇博客介绍过)。
绑定函数非常简单,就是直接插入,需要注意的是,unordered_map非线程安全,没有线程类似java的concurrent hashmap(google了下intel tbb库有类似的数据结构),所以采用了boost thread库中的互斥变量:
[cce lang=”cpp”]
void bind(const std::string &path, RequestHandleFunc func)
{
boost::unique_lock<boost::shared_mutex> lock(_mutex);
_mapping.insert(std::pair<std::string, RequestHandleFunc>(path, func));
}
[/cce]
注意,boost的锁分为unique_lock和shared_lock,这里是“写者”,所以需要独占锁。
处理方法前文已经贴了代码了,同样要注意的是,需要在搜索map的时候加锁。这里是“读者”,所以使用shared_lock即可:
[cce lang=”cpp”]
boost::shared_lock<boost::shared_mutex> lock(_mutex);
[/cce]
为了方便绑定,写了个宏,直接绑定。
[cce lang=”cpp”]
#define REGISTER_URL(URL, CLASS, METHOD) \
CLASS c##CLASS; Handler::instance().bind(URL, boost::bind(&CLASS::METHOD, &c##CLASS, _1))

[/cce]


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

目录
相关文章
|
小程序 前端开发 PHP
PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
238 0
|
7月前
|
数据采集 缓存 安全
http代理在seo优化中起到了什么作用呢?
HTTP代理在SEO优化中扮演多重角色:助力账号管理,实现精确关键词搜索,制定竞争策略,调整网站排名,以及安全爬取数据。注意合理合法使用代理IP,选择稳定快速的优质代理,并保持IP缓存的更新以优化网站排名。正确运用http代理IP可有效提升SEO效果。
53 0
http代理在seo优化中起到了什么作用呢?
|
存储 缓存 JSON
36.从入门到精通:CGI环境变量 GET和POST方法 GET方法 POST方法 CGI中使用Cookie Cookie设置 检索Cookie信息
36.从入门到精通:CGI环境变量 GET和POST方法 GET方法 POST方法 CGI中使用Cookie Cookie设置 检索Cookie信息
|
7月前
|
数据采集 缓存 前端开发
前端知识笔记(三十五)———http代理如何设置手机上网?http代理起到了哪些作用
前端知识笔记(三十五)———http代理如何设置手机上网?http代理起到了哪些作用
108 0
|
移动开发 应用服务中间件 Linux
35.从入门到精通:Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部
35.从入门到精通:Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部
|
应用服务中间件 nginx
【Nginx】第二十二节 redirect跟permanent区别
【Nginx】第二十二节 redirect跟permanent区别
635 0
PHP技术分享——POST之常规方法
PHP技术分享——POST之常规方法
|
网络协议 数据格式 JSON
动手做webserver的核心之http解析
简介         webserver往小里说核心功能就是socket管理、url处理、http协议处理、业务dll管理等;下面简介绍一下http协议:超文本传输协议(HTTP)是一种通信协议,当时就是为web传输设计的一个基于tcp的协议;基于这个字面上理解,可以简单的点说就是用tcp来传输文本、数据的一种编解码格式。
1705 0