gateway的referer流量验证
字符串切分的优化
上一篇中的字符串用空格分割的代码,可以用boost::split()替代。
boost::split()函数原型:
template<typename SequenceSequenceT, typename RangeT, typename PredicateT>
SequenceSequenceT &
split(SequenceSequenceT & Result, RangeT && Input, PredicateT Pred,
token_compress_mode_type eCompress = token_compress_off);
说人话就是(输出,输入,用来切分的字符,是否把用来切分的相邻字符压缩成一个用于切分的单位)
//test_boost.cpp
//-----------------------
#include <iostream>
#include <vector>
#include <boost/algorithm/string.hpp>
bool IsRefererInBlacklist(const std::string& header_referer) {
std::string header_referer_black_list = "";
header_referer_black_list = "https://www.baidu.com/ https://www.hhh.com/ goajgopahdoj a";
std::vector<std::string> urls;
boost::split(urls, header_referer_black_list, boost::is_any_of(" "));
int num=urls.size();
for(int i=0;i<num;i++){//std::string url : urls) {
std::string url=urls[i];
if (header_referer == url) {
return true;
}
}
return false;
}
int main()
{
std::cout << IsRefererInBlacklist("https://www.baidu.com/") << std::endl;
std::cout << IsRefererInBlacklist("https://www.hhh.com/") << std::endl;
std::cout << IsRefererInBlacklist("goajgopahdoj") << std::endl;
std::cout << IsRefererInBlacklist("a") << std::endl;
std::cout << IsRefererInBlacklist("https://www.bai.com/") << std::endl;
}
其他注意
referer的url是经过encode的,所有黑名单中也应该存encode后的url
目录结构
test_project
BLADE_ROOT(空)
thirdparty
boost(boost源码,直接从gateway中copy过来的)
source
BUILD(代码在下边)
test_boost.cpp(代码在上边)
# BUILD
# 只有头文件就不用写deps了,blade会让工程知道#include是从BLADE_ROOT开始找路径的
# ---------------
cc_binary(
name = 'test_boost',
srcs = [
'test_boost.cpp',
],
)
拓展:安装boost:
boost大都是header only的。
只要把boost源码放到thirdparty文件夹中即可
gateway组织结构
namespace gateway{
class BidRequestHandler()
// 调用结构
ProcessBidRequest()
//想插入在这,应该把ProcessBidRequest重载吗
shared_ptr<BidRequest> bid_request = handler->ParseBidRequest();
bool ret = handler->CallServices(request, bid_request, ads_req, ads_resp, fill_data_arr, err_msg);
err_msg = PrepareCallAds(request, bid_request, ads_req);
ads_req = GetAdsRequest(*bid_request);
ads_resp = GetAdsResponse(ads_req);
shared_ptr<FillData> fill_data = RenderCallbackData(*bid_request,*ads_req,*ads_resp,i);
handler->WriteBidResponse(fill_data_arr, response)
// 声明
public:
static bool ProcessBidRequest(const shared_ptr<HttpRequest> request, shared_ptr<HttpResponse> response);
virtual shared_ptr<BidRequest> ParseBidRequest() = 0;
virtual bool CallServices(const shared_ptr<HttpRequest> request,shared_ptr<BidRequest>& bid_request,shared_ptr<rtb::AdsRequest>& ads_req,shared_ptr<rtb::AdsResponse>& ads_resp, std::vector<shared_ptr<FillData> >& fill_data_arr,string& err_msg);
protect:
std::string PrepareCallAds(const shared_ptr<HttpRequest> request,shared_ptr<BidRequest> bid_request,shared_ptr<rtb::AdsRequest>& ads_req);
public:
virtual shared_ptr<rtb::AdsRequest> GetAdsRequest(const BidRequest& bid_request);
virtual shared_ptr<rtb::AdsResponse> GetAdsResponse(shared_ptr<rtb::AdsRequest> ad_server_req_arr);
virtual shared_ptr<FillData> RenderCallbackData(BidRequest& bid_request,rtb::AdsRequest& ads_request,rtb::AdsResponse& ads_response,size_t index);
virtual bool WriteBidResponse(vector<shared_ptr<FillData> > fill_data_arr,shared_ptr<HttpResponse> http_response) = 0;
class RecommendRequestHandler : public BidRequestHandler
public:
shared_ptr<BidRequest> ParseBidRequest();
bool WriteBidResponse(vector<shared_ptr<FillData> > fill_datas,shared_ptr<HttpResponse> http_response) {return true;}
}