自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(676)
  • 收藏
  • 关注

原创 C++:std::is_convertible

【代码】C++:std::is_convertible。

2025-06-10 22:33:26 106

原创 人生随想:你不懂我,我不怪你

我对自己的要求一直都很高,我可以容忍别人的错误,但对于自己,从来都有着更为严格的要求。这一次,我的做法被别人作为反面例子嘲讽了...万万没想到,有一天,我也会成为反面例子。“你不懂我,我不怪你!

2025-06-10 21:43:35 23

原创 人生随想:六一,不管几岁,快乐万岁!

这期间,很幸运的遇到了好几位亦师亦友的领导,他(她)们愿意帮助我成长、让我意识到自己的不足,主动去做出改变。但我这个人比较的腼腆,可能也有些孤傲,从来不跟领导提什么条件,升职加薪的要求,还好他们的关照和包容,让该是我的也都给了我。昨天我妻子跟我说,现在的升职加薪所带来的快乐好像只有那么几分钟,因为要付出的代价也是巨大的,不论是过去还是将来...所以小孩子时的快乐才是真正的快乐,那时傻傻的玩,傻傻的笑,即使课间十分钟,也好像能玩挺长时间。现在工作起来,一年,眨眨眼就过去了,真正的开心时刻是什么?

2025-06-01 14:55:31 113

原创 nlohmann json:检查类型并取出数据

编译:$ g++ -o m1 m1.cpp -std=c++20。

2025-05-21 15:31:22 104

原创 sdbusplus:interface中使用variant类型

Add vv s 1 s 2 vv后需要通过s指定后面的参数1是string类型,然后再通过s指定后面的参数2也是string类型,所以完成的是"1" + "2" = "12"Add vv i 1 i 2 vv后需要通过i指定后面的参数1是int类型,然后再通过i指定后面的参数2也是int类型,所以完成的是1+2=3。可以看到Add的输入参数是两个可变类型vv,返回值也是可变类型v。

2025-05-20 21:08:31 74

原创 GCC:取消private访问限制

【代码】GCC:取消private访问限制。

2025-05-15 09:55:30 28

原创 GoogleTest:GMock2 EXPECT_CALL

EXPECT_CALL的第二个参数是对象的方法名,可以通过匹配参数器,指定期望传进来的参数,比如上例的EXPECT_CALL(person, setAge(20)),就是代表期望传递进函数setAge的参数是20,当然也可以使用一些预定义的宏,比如Ge,Eq,可以参考。需要说明的是不仅仅可以MOCK_METHOD定义重载的虚函数,普通函数也可以通过MOCK_METHOD定义,比如上面代码中的TEST(PersonMock, setAge20)如果参考可以是任何值,那么可以使用"_",参考setAge18;

2025-05-14 22:24:37 76

原创 GoogleTest:GMock1初识

项目通常是多人并行开发的,有的时候需要使用别人开发的接口,但是在测试的时候却不一定都已经开发完成了,这个时候可以使用GMock进行模拟。3.4通过EXPECT_CALL设置Mock对象的接口行为,比如上面WillRepeatedly表示会一直返回。3.2然后通过MOCK_METHOD0定义一个mock接口函数。3.1需要先通过类继承定义一个Mock类。3.5然后通过EXPECT_EQ完成测试项。3.3在TEST内部定义一个Mock对象。使用gmock需要包含以下头文件。编译gmock需要链接以下库。

2025-05-05 20:49:34 97

原创 GoogleTest:TEST_F

简单点说,就是需要先定义一个继承于testing::Test的类,然后有两个虚函数,SetUp()用于每次构建测试项时需要完成的准备工作,TearDown()用于每次完成测试项的收尾工作。可以看到每个测试项开始时都会构造TestT2对象,然后调用SetUp准备数据,即使同一个测试用例的不同测试项之间,TestT2对象也不是共享的,每个测试项都会构造自己的TestT2对象。1.构造TestT2的对象,而由于TestT2的对象有成员T2,所以T2也会被构造。5.析构TestT2的对象,同时析构成员T2。

2025-05-02 23:19:51 160

原创 GoogleTest:简单示例及ASSERT/EXPECT说明

TestItem用于定义某个测试项,比如上面针对int,float,string的测试项,多个测试项可以对应于同一个测试用例,比如TEST(Add, Int)和TEST(Add, String)5.1编写测试测试用例不需要写main函数,也不能有main函数,main函数其实是使用的定义在 libgtest_main.a中的静态函数。5.4.2 EXPECT的作用是如果当前的断言没有通过,那么会继续执行后面的语句,但是不会执行ASSERT和EXPECT语句。但是不会影响本测试用例的其他测试项。

2025-05-01 18:47:55 175

原创 GoogleTest:在Ubuntu22.04安装

1.首先克隆GoogleTest。

2025-04-28 21:46:38 165

原创 CMake:设置编译C++的版本

如果设置为 `ON`,那么 CMake 会要求编译器必须支持CMAKE_CXX_STANDARD中设置的 C++ 版本,否则会配置失败。如果设置为OFF或者未设置,那么如果编译器不支持 CMAKE_CXX_STANDARD中设置的 C++ 版本,CMake 会回退到编译器支持的最新版本。CMake提供了CMAKE_CXX_STANDARD用于设置C++的版本,比如可以通过如下方式设置使用C++23。

2025-04-28 21:33:32 251

原创 OpenBMC:BmcWeb login创建session

完成cookie的设置后handleLogin设置了login的响应为asyncResp->res.jsonValue["token"] = session->sessionToken;根据生成的session信息,设置了cookie的XSRF-TOKEN为session的csrfToken,这只cookie的SESSION为session的sessionToken。完成用户的认证后,还需要为该用户创建session,从而为后续的rest api访问铺平道路。至此完成了session的创建。

2025-04-24 22:00:53 112

原创 OpenBMC:BmcWeb login认证

makeResponse比较之前保存在responseData的prompt,如果匹配则把当时保存在PasswordData内部的responseData中的密码保存在response.resp中。完成后pamFunctionConversation设置了pam_response获取了从pamAuthenticateUser中获取的密码。pamAuthenticateUser然后调用pam_authenticate完成用户的认证。调用pam_acct_mgmt完成用户的状态的确认(比如用户是否已过期等)

2025-04-24 21:38:37 201

原创 OpenBMC:BmcWeb http连接的限制

可以看到handleContentLengthError通过parser->content_length()检查接收到的http请求是否满足BmcWeb所能接收的最大的http请求的大小,如果过大,则关闭keepAlive,也就是关闭当前的http连接,以忽略后面的http数据。介绍了handleContentLengthError用于检查content length是否处于正常的返回内。现在来看看handleContentLengthError。

2025-04-21 10:00:00 45

原创 OpenBMC:BmcWeb log输出

可以看到vlog的第一个参数是BMCWEB_LOG_ERROR传递进来的crow::LogLevel::Error。说实话,个人觉得这一版的log函数有点炫技,使用起来也没有之前的版本方便,不过也还是值的参考一下。toSystemdLevel是把BmcWeb定义的log级转换为systemd的log级别。BMCWEB_LOG_ERROR类的构造函数又调用了模版函数crow::vlog。然后是BMCWEB_LOG_ERROR传递进来的模板参数。定义了一个BMCWEB_LOG_ERROR模版类。

2025-04-18 22:49:57 395

原创 C++(17):通过filesystem获取文件的大小

介绍了如何获取文件的大小。

2025-04-18 15:02:04 82

原创 Linux:通过ssh实现端口转发

通过以下命令查看进程号。

2025-04-18 11:10:23 175

原创 OpenBMC:BmcWeb 网页静态资源2 添加路由

所以当路由需要被处理时,最终调用到了传入的lambda函数,对于本文讨论的网页静态资源,也就是调用到了handleStaticAsset(req, asyncResp, file);它封装了文件的打开、关闭和文件描述符管理等操作,提供了一个跨平台的接口来处理文件,通过。在该运算符函数中,会基于步骤1中传入的lambda参数列表的数量,解构params参数,从而调用Wrapped::handler。app.routeDynamic通过返回的DynamicRule对象的()运算符进行了回调handle的设置。

2025-04-15 10:00:00 254

原创 OpenBMC:BmcWeb 关于Response

2.在调用completeResponseFields的最后通过res.write(res.jsonValue.dump(...)),将保存在res.jsonValue中响应json写入到了res中。1.在completeRequest中将AsyncResp对象设置的res传递给了Connection::res。介绍了AsyncResp对象在析构时实际上调用了Connect::completeRequest。而AsyncResp对象中有一个crow::Response res;

2025-04-15 10:00:00 120

原创 OpenBMC:BmcWeb 网页静态资源1 遍历文件

如果该父路径为空或者不是以'/'结尾的,那么将webpath保存到webroutes::routes中,然后为webpath的尾部加上'/',这其实是为了设置类似于index.html为根路径'/',然后将file.renamed = true;5.生成文件的etag(<filename>.<hash>.<extension>,比如app.63e2c453.css)保存在file.etag。8.根据文件的扩展名设置了file.contentType,类似于{".html", "text/html;

2025-04-14 09:19:24 306

原创 Boost:callable_traits::args_t

是 Boost CallableTraits 库中的一个模板工具,用于提取可调用对象(如函数、函数指针、成员函数指针或 lambda 表达式)的参数类型列表,并将其表示为一个。

2025-04-14 09:00:00 40

原创 C++(17):通过filesytem遍历目录

而且recursive_directory_iterator还是一个运行时迭代器,会在运行时逐步访问目录中的文件和子目录,而不是一次性加载所有内容。这意味着当调用该函数时,迭代器将不会进入当前目录的子目录,而是跳过它们,继续处理下一个目录或文件。recursive_directory_iterator会从指定的目录开始,递归地访问该目录中的所有文件和子目录,直到遍历完整个目录树。recursive_directory_iterator是一个迭代器,用于递归地遍历指定目录及其所有子目录中的文件和子目录。

2025-04-12 22:06:43 358

原创 OpenBMC:BmcWeb 处理http请求7 完成http请求

上面说的特点其实是其析构函数,当最后一个被捕获的shared_ptr析构时(也就是完成了所有的响应数据的设置后),shared_ptr会调用AsyncResp的析构函数,也就是调用了res.end();其实 AsyncResp类很简单,里面有一个crow::Response类型,用于保存响应数据。说过,由于AsyncResp设计的特点,需要捕获asyncResp的值[asyncResp]可以看到asyncResp是一个shared_ptr。1.AsyncResp类。构造了asyncResp。

2025-04-09 22:03:54 287

原创 OpenBMC:BmcWeb 处理http请求6 调用路由处理函数

可以看到handle函数会根据TaggedRule模版参数的个数分解传入的params参数,然后传入handler函数。而对于用户自定义处理函数,通常是从dbus的service上获取数据,然后将响应传递到asyncResp->res中。检查完权限后,调用了rule.handle(*req, asyncResp, params);也就是通过BMCWEB_ROUTE设置的用户自定义处理函数。而handler函数是通过。

2025-04-09 21:23:14 99

原创 OpenBMC:BmcWeb 处理http请求5 检查权限

通过populateUserInfo设置了session.userRole,session.isConfigureSelfOnly,session.userGroups。afterGetUserInfoValidate,权限匹配返回true,会调用callback(),也就是lambda(1)遍历privilegesSet,然后按位比较权限,如果匹配,说明当前的session和url所需的权限匹配,返回true。调用时又把lambda包装了一层(2),做为参数传入了requestUserInfo。

2025-04-08 21:42:28 197

原创 OpenBMC:BmcWeb 处理http请求4 处理路由对象

3.如果路由字典树和notFoundRoutes以及methodNotAllowedRoutes字典树下都找不到匹配的url路由对象,那么直接返回http响应。那么会继续在notFoundRoutes或methodNotAllowedRoutes字典树下找寻匹配url的路由对象。5.如果找到了session那么先通过validatePrivilege验证权限是否匹配。中没找到了session,那么直接rule.handle处理路由。2.根据allowHeader设置响应的http header。

2025-04-08 00:12:02 103

原创 OpenBMC:BmcWeb 处理http请求3 字典树查找节点

2.findHelper中,如果存在<string>通配符节点,则取出通配符所匹配的字符串放入params中,然后以该通配符节点为根节点,递归调用findHelper查找url后面的部分。可以看到在查找路由对象时,是优先匹配通配符<string>,所以即使有添加路由"/user/name",在查找"/user/name"时也会将其匹配给"/user/<str>"4.findHelper中,如果步骤2和3没有查找到对应的路由对象,则从children中遍历子节点进行匹配查找。

2025-03-31 23:08:56 236

原创 OpenBMC:BmcWeb 处理http请求2 查找路由对象

findRoute首先遍历perMethods[i],尝试取出支持该url的所有method的集合,将其放入findRoute.allowHeader中。然后在对应的http method,也就是perMethods[reqMethodIndex]中查找路由对象。当接收到http请求,并且完成解析后,调用了App::handle处理请求。如果找到了,则将其放入findRoute.route中。保存在每个method对象的rules中的路由对象。rule保存了,查到的路由对象,也就是。

2025-03-31 21:53:24 111

原创 OpenBMC:BmcWeb 生效路由5 优化trie

2.首先遍历到o,节点0不是个简单node(不代表一个具体的路由,没有通配符子node),所以merged["o"] = to路由对象的索引;5.while(true)的含义是如果做了一次merge,那么继续对节点t进行merge尝试,也就是对ea, ed, en的子节点进行尝试merge。4.然后将t的children设置为merged对象,也就是去掉了节点e,直接将o,ea, ed, en做为了t的子节点。可以看到通过优化后,去除了没有路由对象的子节点,从而可以为后续的路由查询提供更高的效率。

2025-03-29 21:01:17 256

原创 OpenBMC:BmcWeb 生效路由4 将路由添加到Trie中

也就是说如果url是/about/,那么会将/about/和/about两个url都加入到trie中,所对应的索引都是同一个路由对象。可以看到,在internalAdd中路由url以及该url在rules中所对应的索引,会被加入到trie中。也就是如果通过url匹配到了某个路由,那么就可以基于这个索引,在rules找到路由对象。介绍了internalAdd会把路由对象加入到PerMethod::rules中。还可以看到,如果url是以/结尾的,那么会被去掉/再次加入到trie中。

2025-03-29 19:04:49 121

原创 OpenBMC:BmcWeb 生效路由3 Trie字典树添加节点

3.3如果有找到这个字母的子节点,那么取出这个子节点在nodes的索引,以这个子节点为跟继续完成后面的字符的匹配及子节点的创建。1.经过了上述的过程,每个节点都是一个字母,节点有字母子节点或stringParamChild/pathParamChild两种通配符子节点。所以每个节点的children都是一个字母,以及该子节点在nodes的索引的结合。设置当前子节点为下次遍历的根节点继续后面的节点创建过程。2.不管是字母子节点还是通配符子节点都可以有自己的字母孙子节点和通配符孙子节点。4.如果是以<开头的。

2025-03-27 22:59:52 321

原创 OpenBMC:BmcWeb 生效路由2 Trie字典树

Trie也叫字典树、前缀树、单词查找树等等,它常用来存储单词(和语种无关),相比于HashMap等操作,Trie能在存储多个具有相同前缀的键时,使用较少的空间。可以看到确实如字典树的方式,每个节点是一个字母,节点下的子节点是另一个字母或通配符<str>,而节点的值就是add时出入的值。根节点不包含字符,除根节点外的每个节点都包含一个字符。(2)从根节点到某一节点的路径上经过的字符连接起来,即为该节点对应的字符串。(3)每个节点可能有多个子节点,每个子节点对应一个不同的字符。

2025-03-27 22:15:00 543

原创 OpenBMC:BmcWeb添加路由5 设置handler函数

而处理函数是通过()运算符进行设置的,可以看到构造TaggedRule时的模版可变参数Args与handler函数中的可变参数是对应的。handler是TaggedRule类的成员,用于保存路由的处理函数。至此,我们已经把设置一个路由对象的方式做了解释。

2025-03-25 22:21:11 118

原创 OpenBMC:BmcWeb 生效路由1 基于method分类路由

所以经过internalAddRuleObject后,每个路由对象都基于该对象所对应的method,其指针被加入了method的数据结构PerMethod::rules中。所以internalAddRuleObject会对比路由对象所支持的method,如果匹配,就将该对象加入perMethods[method]中。经过这几步,路由对象已经被添加到了allRules中了,在完成等待http请求前,还需要做一些工作。rule->validate()目前的实现中也没有做什么有意义的事,可以忽略。

2025-03-24 21:49:09 130

原创 C++:通用的log输出

可以看到通过nlohmann可以较方便的将数据结构转换为字符串,我们可以利用这个方式实现一个较为方便且通用的log输出。编译:g++ -o m ./main.cpp -std=c++20。可以看到直接输出复杂的数据结构,比较方便直接输出调试信息。

2025-03-24 17:07:43 175

原创 OpenBMC:BmcWeb添加路由4 设置method

通过设置了权限和method后,一个TaggedRule<T>对象所对应的url method就设置好了。httpVerbFromBoost获取了位所在的值。然后设置methodsBitfield 对应的位。可以看到methods会递归调用。

2025-03-19 20:24:36 104

原创 OpenBMC:BmcWeb添加路由3 设置权限

Privileges在构造函数中通过调用setSinglePrivilege将传入的权限名称与privilegeNames数组内的名称比较,找到了,就根据索引设置成员privilegeBitset的比特位。然后通过权限字符串构造一个redfish::Privileges对象,将保存在TaggedRule的基类BaseRule成员privilegesSet。经过了以上的操作,一个位于allRules中的TaggedRule<T>对象,就将该url所需要的权限保存到了对象privilegesSet中。

2025-03-15 14:44:47 381

原创 OpenBMC:BmcWeb添加路由2 route

该函数就是根据参数数量NumArgs,构造了类型unique_ptr<RuleT>的对象,然后将对象保存在了allRules中(也就是BaseRule的意义),返回RuleT的对象引用。可以看出来TaggedRule的构造并不复杂,主要就是构造了一个BaseRule的基类,然后将TaggedRule<Args...>声明为RuleParameterTraits的友元。可以看到unique_ptr对象被移动到了va中,然后通过pa获取的指针也是指向了va中的对象的。

2025-03-15 11:39:29 304

原创 OpenBMC:BmcWeb添加路由1 getParameterTag

BmcWeb实际是只是统计了url里有几个<str>,<string>,<path>2.模版参数crow::utility::getParameterTag(url)其中app就是App类对象,url是http请求的url。BMCWEB_ROUTE实际上调用的就是这个route函数。1.BMCWEB_ROUTE注册路由。不过BmcWeb做了适当的简化。这个实现跟Crow是不太一样的。可以通过以下程序验证。

2025-03-15 10:05:42 92

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除