IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 蓝桥ROS机器人之现代C++学习笔记 第6章正则表达式习题 -> 正文阅读

[C++知识库]蓝桥ROS机器人之现代C++学习笔记 第6章正则表达式习题

完全不会做,只能记录一下了。


CXX = g++
EXEC_HTTP = server.http
EXEC_HTTPS = server.https

SOURCE_HTTP = main.http.cpp
SOURCE_HTTPS = main.https.cpp

OBJECTS_HTTP = main.http.o
OBJECTS_HTTPS =  main.https.o

LDFLAGS_COMMON = -std=c++2a -O3 -pthread -lboost_system
LDFLAGS_HTTP =
LDFLAGS_HTTPS = -lssl -lcrypto

LPATH_COMMON = -I/usr/include/boost
LPATH_HTTP =
LPATH_HTTPS = -I/usr/local/opt/openssl/include

LLIB_COMMON = -L/usr/lib
LLIB_HTTPS = -L/usr/local/opt/openssl/lib

all:
	make http
	make https

http:
	$(CXX) $(SOURCE_HTTP) $(LDFLAGS_COMMON) $(LDFLAGS_HTTP) $(LPATH_COMMON) $(LPATH_HTTP) $(LLIB_COMMON) $(LLIB_HTTP) -o $(EXEC_HTTP)
https:
	$(CXX) $(SOURCE_HTTPS) $(LDFLAGS_COMMON) $(LDFLAGS_HTTPS) $(LPATH_COMMON) $(LPATH_HTTPS) $(LLIB_COMMON) $(LLIB_HTTPS) -o $(EXEC_HTTPS)

clean:
	rm -f $(EXEC_HTTP) $(EXEC_HTTPS) *.o

修改2a为17。

shiyanlou:Code/ $ unzip 6.zip                                        [21:48:31]
Archive:  6.zip
  inflating: 6/handler.hpp           
  inflating: 6/main.http.cpp         
  inflating: 6/main.https.cpp        
  inflating: 6/Makefile              
  inflating: 6/server.base.hpp       
  inflating: 6/server.http.hpp       
  inflating: 6/server.https.hpp      
   creating: 6/www/
  inflating: 6/www/index.html        
  inflating: 6/www/test.html         
shiyanlou:Code/ $ cd 6                                               [21:48:35]
shiyanlou:6/ $ make                                                  [21:50:39]
make http
make[1]: Entering directory '/home/shiyanlou/Code/6'
g++ main.http.cpp -std=c++17 -O3 -pthread -lboost_system  -I/usr/include/boost  -L/usr/lib  -o server.http
make[1]: Leaving directory '/home/shiyanlou/Code/6'
make https
make[1]: Entering directory '/home/shiyanlou/Code/6'
g++ main.https.cpp -std=c++17 -O3 -pthread -lboost_system -lssl -lcrypto -I/usr/include/boost -I/usr/local/opt/openssl/include -L/usr/lib -L/usr/local/opt/openssl/lib -o server.https
make[1]: Leaving directory '/home/shiyanlou/Code/6'
shiyanlou:6/ $                                                       [21:50:56]

效果如下:

http

稍作修改:?

?


?

?

正则表达式本身,然后根据使用正则表达式的主要需求,通过一个实际的例子介绍了正则表达式库的使用。

习题

  1. 在 Web 服务器开发中,我们通常希望服务某些满足某个条件的路由。正则表达式便是完成这一目标的工具之一。

给定如下请求结构:

struct Request {
 ? ?// request method, POST, GET; path; HTTP version
 ? ?std::string method, path, http_version;
 ? ?// use smart pointer for reference counting of content
 ? ?std::shared_ptr<std::istream> content;
 ? ?// hash container, key-value dict
 ? ?std::unordered_map<std::string, std::string> header;
 ? ?// use regular expression for path match
 ? ?std::smatch path_match;
};

请求的资源类型:

typedef std::map<
 ? ?std::string, std::unordered_map<
 ? ? ? ?std::string,std::function<void(std::ostream&, Request&)>>> resource_type;

以及服务端模板:

template <typename socket_type>
class ServerBase {
public:
 ? ?resource_type resource;
 ? ?resource_type default_resource;
?
 ? ?void start() {
 ? ? ? ?// TODO
 ?  }
protected:
 ? ?Request parse_request(std::istream& stream) const {
 ? ? ? ?// TODO
 ?  }
}

请实现成员函数 start()parse_request。使得服务器模板使用者可以如下指定路由:

template<typename SERVER_TYPE>
void start_server(SERVER_TYPE &server) {
?
 ? ?// process GET request for /match/[digit+numbers], e.g. GET request is /match/abc123, will return abc123
 ? ?server.resource["fill_your_reg_ex"]["GET"] = [](ostream& response, Request& request) {
 ? ? ? ?string number=request.path_match[1];
 ? ? ? ?response << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number;
 ?  };
?
 ? ?// peocess default GET request; anonymous function will be called if no other matches
 ? ?// response files in folder web/
 ? ?// default: index.html
 ? ?server.default_resource["fill_your_reg_ex"]["GET"] = [](ostream& response, Request& request) {
 ? ? ? ?string filename = "www/";
?
 ? ? ? ?string path = request.path_match[1];
?
 ? ? ? ?// forbidden use `..` access content outside folder web/
 ? ? ? ?size_t last_pos = path.rfind(".");
 ? ? ? ?size_t current_pos = 0;
 ? ? ? ?size_t pos;
 ? ? ? ?while((pos=path.find('.', current_pos)) != string::npos && pos != last_pos) {
 ? ? ? ? ? ?current_pos = pos;
 ? ? ? ? ? ?path.erase(pos, 1);
 ? ? ? ? ? ?last_pos--;
 ? ? ?  }
?
 ? ? ? ?// (...)
 ?  };
?
 ? ?server.start();
}

参考原作者答案。


  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 10:41:58  更:2022-04-23 10:42:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:18:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码