重拾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

目录
相关文章
|
4月前
|
数据采集 缓存 前端开发
前端知识笔记(三十五)———http代理如何设置手机上网?http代理起到了哪些作用
前端知识笔记(三十五)———http代理如何设置手机上网?http代理起到了哪些作用
52 0
|
10月前
|
存储 缓存 JSON
36.从入门到精通:CGI环境变量 GET和POST方法 GET方法 POST方法 CGI中使用Cookie Cookie设置 检索Cookie信息
36.从入门到精通:CGI环境变量 GET和POST方法 GET方法 POST方法 CGI中使用Cookie Cookie设置 检索Cookie信息
|
10月前
|
移动开发 应用服务中间件 Linux
35.从入门到精通:Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部
35.从入门到精通:Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部
|
前端开发 网络协议 数据安全/隐私保护
【前端 · 面试 】HTTP 总结(十二)—— URL 和 URI
最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流。
86 0
【前端 · 面试 】HTTP 总结(十二)—— URL 和 URI
URL URI傻傻分不清楚,dart告诉你该怎么用
URL URI傻傻分不清楚,dart告诉你该怎么用
|
JavaScript 前端开发 .NET
艾伟:重提URL Rewrite(3):在URL Rewrite后保持PostBack地址
  在进行了URL Rewrite之后,经常会遇到的问题就是页面中PostBack的目标地址并非客户端请求的地址,而是URL Rewrite之后的地址。以上一篇文章中的重写为例:     rewriter>   当用户请求“/User/jeffz”之后,页面中的出现的代码却会是 ,这是因为在生成代码时,页面会使用当前Request.Url.PathAndQuery的值来得到form元素的action。
1009 0
|
.NET
艾伟:重提URL Rewrite(2):使用已有组件进行URL Rewrite
  可能已经没有人会使用上一篇文章中的方法进行URL Rewrite了,因为提供URL Rewrite的组件早已铺天盖地了。   ASP.NET级别的URL Rewrite组件的原理很简单,其实只是监听BeginRequest事件,并且根据配置来决定目标URL。
1223 0
|
Web App开发 .NET
艾伟:重提URL Rewrite(1):IIS与ASP.NET
  之前觉得这个话题已经被谈滥了。URL Rewrite早已经被广大开发人员所接受,网上关于URL Rewrite的组件和文章也层出不穷,但是总是让我感觉意犹未尽,于是最终还是忍不住提笔写了这系列文章。
935 0
|
网络协议 数据格式 JSON
动手做webserver的核心之http解析
简介         webserver往小里说核心功能就是socket管理、url处理、http协议处理、业务dll管理等;下面简介绍一下http协议:超文本传输协议(HTTP)是一种通信协议,当时就是为web传输设计的一个基于tcp的协议;基于这个字面上理解,可以简单的点说就是用tcp来传输文本、数据的一种编解码格式。
1623 0