tars源码漫谈第32篇------tc_parsepara.h/tc_parsepara.cpp(http式参数的parse)

2024-02-06 11:08

本文主要是介绍tars源码漫谈第32篇------tc_parsepara.h/tc_parsepara.cpp(http式参数的parse),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     最近要开发一个需求, 涉及到http参数的处理, 我居然还自己去写string到map和map到string的转换, 当看到tc_parsepara后, 深感痛心, 原来, tars的基础库早就实现了这些功能, 来看一下:

/*** Tencent is pleased to support the open source community by making Tars available.** Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.** Licensed under the BSD 3-Clause License (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at** https://opensource.org/licenses/BSD-3-Clause** Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License.*/#include "util/tc_parsepara.h"namespace tars
{#define ENCODE_TABLE "=&%\r\n"TC_Parsepara::TC_Parsepara(const string &sParam)
{load(sParam);
}TC_Parsepara::TC_Parsepara(const map<string, string> &mpParam)
{load(mpParam);
}TC_Parsepara::TC_Parsepara(const TC_Parsepara ¶)
{_param = para._param;
}TC_Parsepara &TC_Parsepara::operator=(const TC_Parsepara ¶)
{if(this != ¶){clear();_param = para._param;}return *this;
}bool TC_Parsepara::operator==(const TC_Parsepara ¶)
{return _param == para._param;
}const TC_Parsepara TC_Parsepara::operator+(const TC_Parsepara ¶)
{map<string, string> mpParam;mpParam = _param;mpParam.insert(para._param.begin(), para._param.end());return TC_Parsepara(mpParam);
}TC_Parsepara& TC_Parsepara::operator+=(const TC_Parsepara ¶)
{_param.insert(para._param.begin(), para._param.end());return *this;
}TC_Parsepara::~TC_Parsepara()
{clear();
}void TC_Parsepara::clear()
{_param.clear();
}string TC_Parsepara::encodeMap(const map<string, string> &mpParam) const
{string sParsepara("");map<string, string>::const_iterator it = mpParam.begin();while(it != mpParam.end()){sParsepara += encodestr((*it).first) + "=" + encodestr((*it).second);it++;if(it != mpParam.end()){sParsepara += "&";}}return sParsepara;
}void TC_Parsepara::decodeMap(const string &sParam, map<string, string> &mpParam) const
{int iFlag = 0;char ch1 = '=';char ch2 = '&';string sName;string sValue;string sBuffer;if (sParam.length() == 0){mpParam.clear();return ;}string::size_type pos = 0;while( pos <= sParam.length()){if(sParam[pos] == ch1)                                    //中间分隔符,前面读入是name{sName = decodestr(sBuffer);sBuffer = "";iFlag = 1;}else if(sParam[pos] == ch2 || pos == sParam.length())    //结束符,读入的是值{sValue = decodestr(sBuffer);sBuffer = "";if(sName.length() > 0 && iFlag){mpParam[sName] = decodestr(sValue);iFlag = 0;}}else{sBuffer += sParam[pos];}pos++;}
}void TC_Parsepara::load(const string &sParam)
{clear();decodeMap(sParam, _param);
}void TC_Parsepara::load(const map<string, string> &mpParam)
{_param = mpParam;
}string TC_Parsepara::tostr() const
{return encodeMap(_param);
}string &TC_Parsepara::operator[](const string &sName)
{return _param[sName];
}string TC_Parsepara::getValue(const string &sName) const
{string sValue;map<string, string>::const_iterator it;if((it = _param.find(sName)) != _param.end()){sValue = it->second;}return sValue;
}void TC_Parsepara::setValue(const string &sName, const string &sValue)
{_param[sName] = sValue;
}map<string,string> &TC_Parsepara::toMap()
{return _param;
}const map<string,string> &TC_Parsepara::toMap() const
{return _param;
}void TC_Parsepara::traverse(TC_ParseparaTraverseFunc func,void *pParam)
{map<string, string>::iterator it  = _param.begin();map<string, string>::iterator itEnd  = _param.end();while(it != itEnd){func(it->first, it->second, pParam);++it;}
}char TC_Parsepara::x2c(const string &sWhat)
{register char digit;if(sWhat.length() < 2){return '\0';}digit = (sWhat[0] >= 'A' ? ((sWhat[0] & 0xdf) - 'A')+10 : (sWhat[0] - '0'));digit *= 16;digit += (sWhat[1] >= 'A' ? ((sWhat[1] & 0xdf) - 'A')+10 : (sWhat[1] - '0'));return(digit);
}string TC_Parsepara::decodestr(const string &sParam)
{string sBuffer("");string::size_type pos = 0;while( pos < sParam.length()){if(sParam[pos] == '%'){if (pos >= sParam.length() - 2){break;}sBuffer += x2c(sParam.substr(pos + 1));pos += 3;}else{sBuffer += sParam[pos];pos++;}}return sBuffer;
}string TC_Parsepara::encodestr(const string &sParam)
{string sBuffer("");static char sHexTable[17] = "0123456789ABCDEF";string::size_type pos = 0;while( pos < sParam.length()){if(string(ENCODE_TABLE).find_first_of(sParam[pos]) != string::npos){sBuffer += '%';sBuffer += sHexTable[(sParam[pos]>>4)&0x0f];sBuffer += sHexTable[sParam[pos]&0x0f];}else{sBuffer += sParam[pos];}pos++;}return sBuffer;
}}

        简单测试玩了一下, 非常好用。 上述类中函数相当简单, 一看就懂, 无非就是字符串的变换而已, 不需要多说。

 

 

这篇关于tars源码漫谈第32篇------tc_parsepara.h/tc_parsepara.cpp(http式参数的parse)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684121

相关文章

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。