2020-09-21 referer字符串切分 boost gateway代码组织层次

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;}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值