libevent
的http
服务详解
即远程调用,得到一个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_socket
和tcp
的通信就不一样了
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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)