pelikan代码走读
30 Apr 2022
|
|
https://wanghenshui.github.io/my-slides/pelikan/ 整体概括在这里。简单看代码
https://wanghenshui.github.io/my-slides/pelikan/ 整体概括在这里。简单看代码
看tag知内容
内网转载。内容非常不错。去掉隐私信息。非常适合作为一个模板
看tag知内容
看tag知内容
参赛得分就有T恤,一下子又有了斗志
不过T恤的logo比较单调,其实可以设计一下
看tag知内容
看tag知内容 尴尬,每月总结也有todo了,todo越欠越多
这是一个redis的http代理,简单看下怎么做的
主流程就是一个libevent
server_can_accept accept worker_add_client 然后通过pipe来传给worker
创建若干个worker接受客户端连接
worker主要动作
简单说这个逻辑还是比较简单的,主要命令逻辑就是worker_process_client
这个按照http的消息类型来分类
struct worker *w = c->w;
cmd_response_t ret = CMD_PARAM_ERROR;
switch(c->parser.method) {
case HTTP_GET:
if(c->path_sz == 16 && memcmp(c->path, "/crossdomain.xml", 16) == 0) {
http_crossdomain(c);
return;
}
slog(w->s, WEBDIS_DEBUG, c->path, c->path_sz);
ret = cmd_run(c->w, c, 1+c->path, c->path_sz-1, NULL, 0);
break;
case HTTP_POST:
slog(w->s, WEBDIS_DEBUG, c->path, c->path_sz);
ret = cmd_run(c->w, c, c->body, c->body_sz, NULL, 0);
break;
case HTTP_PUT:
slog(w->s, WEBDIS_DEBUG, c->path, c->path_sz);
ret = cmd_run(c->w, c, 1+c->path, c->path_sz-1,
c->body, c->body_sz);
break;
case HTTP_OPTIONS:
http_send_options(c);
return;
default:
slog(w->s, WEBDIS_DEBUG, "405", 3);
http_send_error(c, 405, "Method Not Allowed");
return;
}
内部还要解析具体的命令来分,其实可以直接写死,直接写死就省掉发送命令解析结果的流程了
cmd_run执行中会指定Content-Type,cmd_select_format
cmd_select_format也会设置回复的回调函数
比如json_reply,raw_reply,custom_type_reply
用cmd_setup设置http response信息
这里的ACL是wedis内部的ACL控制,不是redis那侧的控制
redis只支持见到AUTH
在连接的时候就直接auth
if(p->cfg->redis_auth) { /* authenticate. */
if(p->cfg->redis_auth->use_legacy_auth) {
redisAsyncCommand(ac, pool_on_auth_complete, p, "AUTH %s",
p->cfg->redis_auth->password);
} else {
redisAsyncCommand(ac, pool_on_auth_complete, p, "AUTH %s %s",
p->cfg->redis_auth->username,
p->cfg->redis_auth->password);
}
}
http_client单独有个标记记录是不是subcribe,一直保持连接