libevent的http服务详解

libeventhttp服务详解

即远程调用,得到一个call ID然后验证外部远程参数

evrpc_request_cb(struct evhttp_request *req, void *arg)
{
    struct evrpc *rpc = arg; // 用来自动解析缓冲区数据的,外部验证参数也是从这里过来的
	struct evrpc_req_generic *rpc_state = NULL;
    // 会模拟一个钩子,在等待事件的到来
    if (req->type != EVHTTP_REQ_POST ||
	    evbuffer_get_length(req->input_buffer) <= 0)
		goto error;
}
  • 利用struct evrpc来验证外部参数
  • 只能验证POST请求,默认POST才能附带参数,虽然GET请求也行
  • 钩子函数可以修改和请求
  • HTTP请求在libevent内部是可以保存状态的
  • 一个完整的钩子函数的执行过程

个人功力浅,找了半天这个回调,没找到,有大佬可以找到解释一下这个钩子函数麻烦留言,有偿,不胜感激

int (*process)(void *, struct evhttp_request *,struct evbuffer *, void *);

evrpc_process_hooks(struct evrpc_hook_list *head, void *ctx,
    struct evhttp_request *req, struct evbuffer *evbuf)
{
	struct evrpc_hook *hook;
	TAILQ_FOREACH(hook, head, next) {
		int res = hook->process(ctx, req, evbuf, hook->process_arg);
		if (res != EVRPC_CONTINUE)
			return (res);
	}

	return (EVRPC_CONTINUE);
}

在这里插入图片描述

判定请求的状态

由此证明

enum EVRPC_HOOK_RESULT {
	EVRPC_TERMINATE = -1,	// 请求终止
	EVRPC_CONTINUE = 0,		// 继续处理
	EVRPC_PAUSE = 1			// 暂停请求
};
switch (hook_res) {
		case EVRPC_TERMINATE:
			goto error;
		case EVRPC_PAUSE:
			evrpc_pause_request(rpc->base, rpc_state,
			    evrpc_request_cb_closure);
			return;
		case EVRPC_CONTINUE:
			break;
		default:
			EVUTIL_ASSERT(hook_res == EVRPC_TERMINATE ||
			    hook_res == EVRPC_CONTINUE ||
			    hook_res == EVRPC_PAUSE);
		}

提供RPC给用户; 他们可以处理它,内部是由链表来维护的

rpc->cb(rpc_state, rpc->cb_arg);

evthttp用于http协议的上下文

evhttp_new返回一个evthttp的指针

evhttp_free用于释放该对象

evhttp_bind_sockettcp的通信就不一样了

evhttp_bind_socket(evhttp* http,"0.0.0.0",8081)错误返回1

evhttp_set_gencb(http,cb,0)设置回调函数

获取请求信息

evhttp_request_get_uri(req)参数为回调函数的参数,获取端口后面的请求路径

获取请求类型

 string cmdtype;
    switch (evhttp_request_get_command(req)) // 获取请求的类型
    {
    case EVHTTP_REQ_GET:
        cmdtype = "GET";
        break;
    case EVHTTP_REQ_POST:
    cmdtype = "POST";
    default:
        break;
    }

获取消息报文头

evkeyvalq *headers = evhttp_request_get_input_headers(req);

for(auto p = headers->tqh_first;p != NULL;p = p->next.tqe_next)
    {
        cout<<p->key<<" : "<<p->value<<endl;
    }

向缓冲区输入数据

evhttp_request_get_input_buffer获取输入缓冲区

auto inbuf = evhttp_request_get_input_buffer(req);          // 返回输入缓冲区
    char buf[1024] = {0};
    while (evbuffer_get_length(inbuf))
    {
        evbuffer_remove(inbuf,buf,sizeof(buf));
        cout<<"cotent"<<buf<<endl;
    }

回复请求数据

evhttp_request_get_output_buffer获取输出缓冲区

evbuffer* outbuf = evhttp_request_get_output_buffer(req);   // 返回输出缓冲区
    evbuffer_add(outbuf,"OK",2);
    evhttp_send_reply(req,HTTP_OK,"",outbuf);

f = evhttp_request_get_output_buffer(req); // 返回输出缓冲区
evbuffer_add(outbuf,“OK”,2);
evhttp_send_reply(req,HTTP_OK,"",outbuf);


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值