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

相关文章

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

史上最全nginx详细参数配置

《史上最全nginx详细参数配置》Nginx是一个轻量级高性能的HTTP和反向代理服务器,同时也是一个通用代理服务器(TCP/UDP/IMAP/POP3/SMTP),最初由俄罗斯人IgorSyso... 目录基本命令默认配置搭建站点根据文件类型设置过期时间禁止文件缓存防盗链静态文件压缩指定定错误页面跨域问题

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整