libevent的http服务详解

2023-05-16

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libevent的http服务详解 的相关文章

  • Java:如何创建 HTTP 浏览会话

    我正在尝试创建一个向服务器发送一些 POST 请求的 Java 应用程序 第一个请求是带有身份验证信息的请求 然后 当我发送下一个请求时 我得到的答案是我的会话已过期 但我在同一秒内发送下一个请求 所以它不能超时 所以我猜想 Java 中有
  • wcf 服务不允许 POST

    一般来说 我对 Web 服务还很陌生 并且 我认为 陷入了配置 IIS 和 Web 服务本身的困境 我在 MVS 2010 中创建了一个 wcf Web 服务 并将其托管在 Windows 7 上的 IIS7 5 上 我使用soapUI 4
  • 为什么我需要显式输出 IIS 的 HTTP 标头而不是 Apache?

    我正在尝试设置 apache 而不是 IIS 因为IIS 不必要地崩溃 https stackoverflow com questions 188896 why does iis crash when i print to stderr i
  • 让soapUI在附件选项卡中显示附件以进行响应

    我有一个通过 HTTP GET 返回文件的 REST 服务 我已经在响应中 在服务器上 设置了这些标头 并且下载在任何浏览器中都能完美运行 Content Length Content Type Content Disposition 然而
  • 数据融合 - http post 插件问题

    我正在尝试使用 DataFusion 进行 http 调用 来源 GCS csv 文件 接收器 HTTP POST API 期望该文件作为 HTTP 请求的一部分 执行此操作后 我在 API 日志中收到以下错误 所需的请求部分 文件 不存在
  • 示例 urllib3 和 python 中的线程

    我正在尝试在简单线程中使用 urllib3 来获取多个 wiki 页面 该脚本将 为每个线程创建 1 个连接 我不明白为什么 并永远挂起 urllib3 和线程的任何提示 建议或简单示例 import threadpool from url
  • vue.js 中的 $http.get() 与 axios.get() 有什么区别?

    我有点困惑理解之间的主要区别 http get and axios get 我查阅了很多资源 但没有得到满意的答案 有人可以帮我吗 http 是一个全局变量 可能是您在 vuejs 项目中定义的 请在您的项目中搜索 http 您可能会发现它
  • REST API 与 Web API

    我是构建 HTTP API 的初学者 我似乎对 REST API 和 Web API 之间的区别感到困惑 我在网上读到更多相关内容 困惑似乎越来越多 我猜菲尔丁有与此链接相同的问题http roy gbiv com untangled 20
  • 对于“未找到项目”错误页面,最合适的 HTTP 状态代码是什么

    我很好奇 项目不存在 页面最合适的 HTTP 状态代码是什么 如果页面本身不存在 我显然会使用 404 但是 我的其中一个页面有一个userid参数 它是一个 编辑用户 页面 如果不存在具有给定用户 ID 的用户 我将显示一个错误页面 但我
  • 如何让 Symfony 2 采用协议方案(http vs https)

    我有一个 Symfony 2 网站 在开发中运行在 HTTP 上 在生产中运行在 HTTPS 上 我注意到在生产中 Symfony 生成的 URL 仍然全部呈现为 HTTP 我怎么也可以 让框架采用当前提供网站的协议 可能是首选 或者 仅在
  • AJAX 中的 GET 与 POST?

    为什么 AJAX 中有 GET 和 POST 请求 因为它无论如何都不影响页面 URL 由于数据未反映到页面 URL 因此通过 AJAX 中的 GET 传递敏感数据有何区别 您应该根据您的 Web 服务要求使用正确的 HTTP 动词 当处理
  • SPDY 与保持活动连接上的 http 多路复用有何不同

    HTTP 1 1 支持保持活动连接 在发送 Connection close 之前连接不会关闭 那么 如果浏览器 本例中是firefox 启用了network http pipelined 并且增加了network http pipelin
  • 扩展无法启用或安装的问题

    php 7 3 5 你好 我的扩展 ext http 有问题 composer 说我缺少 ext http 即使我在composer json 中写了这个 为什么 这就是这个确切的消息 问题1 您的系统中缺少请求的 PHP 扩展 ext h
  • 浏览器和服务器在实践中是否使用 HTTP 内容协商?

    我正在学习关于HTTP内容协商 https developer mozilla org en US docs Web HTTP Content negotiation眼下 我已经了解客户端和服务器能够协商所请求内容的表示的基本方式 但我不知
  • 维梅奥上传。无法获取响应中的complete_uri字段

    我在上传到 vimeo 时花了很多功夫 我已经提出了门票请求 我已经上传文件了 我已经检查了文件是否已上传 我需要使用我应该从票证中获得的complete uri 响应来运行DELETE 方法 但是 我没有从票证响应中收到任何complet
  • 使用 RCurl 登录 WordPress

    我想使用 R 的 RCurl 包登录 WordPress 网站 以便安装 WordPress 插件 可能在 WordPress 的某些选项页面上使用 postForm 由于该网站受密码保护 我请求您帮助如何验证我的 R 会话 我发现以下三个
  • 在 Java 中使用 JSON 的 HTTP POST

    我想在 Java 中使用 JSON 制作一个简单的 HTTP POST 假设网址是www site com 它接受值 name myname age 20 标记为 details 例如 我将如何创建 POST 语法 我似乎也无法在 JSON
  • 如何设置http请求的源IP?

    在发送 http 请求之前 我需要设置源 IP 地址 用于 IP 欺骗等 用于建立http连接的类是HTTPURLConnection 我在 stackoverflow 上找到了下面的链接 这非常有用 注册和使用自定义 java net U
  • IIS7 和 HTTP 状态代码处理

    我因试图对 IIS7 集成模式 中的错误呈现进行完整的编程控制而感到非常头疼 我想要做的是给出一个错误 找不到页面 内部服务器错误 未经过身份验证等 将整个请求传输到自定义 ASPX 或 HTML 我更喜欢后者 并使用正确的 HTTP 状态
  • 如何修改 HttpUrlConnection 的标头

    我试图稍微改进一下 Java Html 文档 但我遇到了问题HttpUrlConntion 有一件事是 如果用户代理是 Java VM 某些服务器会阻止请求 另一个问题是HttpUrlConnection不设置Referrer or Loc

随机推荐

  • ubuntu开机进入循环登录状态的解决方案

    ubuntu进入循环登陆的解决方案 1 出现问题的原因2 解决问题的方法2 1 登陆进入CLI2 2 检查 etc environment环境变量 1 出现问题的原因 我出现的这个问题的原因是由于修改系统的环境变量 etc profile
  • Tomcat 7.X安装教程(简单易懂)

    Tomcat 7 X安装教程 简单易懂 步骤1 下载Tomcat7 x版本 官网7 x下载地址 https tomcat apache org download 70 cgi https aoian lanzous com iCWyymcn
  • 社区医疗管理系统(JDBC+eclipse)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 项目预览1 登陆界面2 首页3 修改密码和查看个人信息4 用户管理5 居民信息 二 导入步骤1 下载文件2 数据库导入3
  • linux shell 常用命令

    linux shell 终端操作命令 shutdown 默认1分钟内关机 43 n表示n分钟后关机 输入后可以打shutdown c 进行取消 shutdown h now表示立即关机sudo 在命令前书写 xff0c 表示已管理员的权限运
  • Shell脚本——kafka集群启停

    部署kafka集群的服务器名称为 xff1a node101 node102 node103 批量启动 停止zookeeper xff0c 查看zookeeper开启状态 在 opt module zookeeper bin 目录中 xff
  • Shell脚本——批量关闭服务器

    服务器名称为 xff1a node101 node105 node110 node113 bin bash array 61 102 103 104 105 110 113 101 xff09 for i 61 0 i lt array i
  • 设置文件夹共享

    本文使用共享文件夹名称为 xff1a test 1 右键文件夹 xff0c 点击 属性 xff0c 菜单栏选择 共享 xff0c 点击下面的 共享 S 按钮 2 选择要共享的用户 xff08 此处选择 Everyone xff0c 可以根据
  • Ubuntu16.04的图形化界面无法启动问题

    昨晚在 Ubuntu 下试图安装笔记本触控板的驱动的时候 xff0c 突然 Ubuntu 的图形化界面不见了 xff0c 尝试了 Ctrl 43 Alt 43 F1 F2 F3 无果 xff0c 又在一些博客的指导下尝试在命令行使用 sta
  • Shell脚本——设置ssh免密

    功能 xff1a 实现多台linux主机之间root用户的免密设置 主机名 xff1a node101 node106 在node101上切换至root用户 xff0c 编写以下脚本内容 xff1a bin bash 使用root用户 在n
  • 解析ET6接入ILRuntime实现热更

    1 介绍 ILRuntime项目为基于C 的平台 xff08 例如Unity xff09 提供了一个纯C 实现 xff0c 快速 方便且可靠的IL运行时 xff0c 使得能够在不支持JIT的硬件环境 xff08 如iOS xff09 能够实
  • Python 实现用网页展示多个结果表数据

    Python 实现用网页展示多个表格的数据 前言 一 效果图 二 代码 1 引入库 2 函数定义 3 主程序 前言 实现方法是利用pandas to html 与表格展示的美化相结合 使数据展示更美观 一 效果图 示例 二 代码 本文将使用
  • error while loading shared libraries

    问题描述 我在调试配置一个Linux计算环境的程序时候 xff0c 安装配置好相关的库 xff0c 但是在执行运行程序命令时候报错如下 xff1a error span class token keyword while span load
  • 要求在数组中间删除一个数字

    span class token comment 要求在数组中间删除一个数字 span span class token keyword var span arr span class token operator 61 span span
  • Ubuntu常见问题及解决办法

    在刚开始使用Ubuntu系统时 xff0c 总会遇到各种各样的小问题 xff0c 这里整理了一些遇到的问题及解决办法 xff0c 不断更新中 xff01 xff01 xff01 目录 一 创建文件夹权限不够 1 1 问题描述 1 2 解决办
  • 计算机网络考试题库

    第1章 计算机网络概论 1 xff0e 在20世纪50年代 xff0c 和 xff08 xff09 技术的互相结合 xff0c 为计算机网络的产生奠定了理论基础 2 xff0e 从传输范围的角度来划分计算机网络 xff0c 计算机网络可以分
  • Spring,搭建Spring环境

    控制反转 xff1a 控制了对象的创建 xff0c 反转 xff1a 反转的是获取对象的方式 xff0c 从自己创建对象变为由Spring工厂推送 1 搭建Spring环境 xff0c 导入依赖 spring aop xff1a 开发AOP
  • 【Vxworks操作系统】系统介绍与系统组成-NO.1

    目录 1 VxWorks系统介绍 2 VxWorks特点 3 vxWorks操作系统的组成 1 xff09 实时操作系统核心Wind 2 xff09 I O系统 3 xff09 文件系统 4 xff09 板级支持包 xff08 BSP xf
  • 【Vxworks操作系统】实时多任务介绍-NO.2

    目录 实时多任务 1 1 任务生命周期管理 1 2 任务状态控制 1 3 任务调度 1 4 用户接口 结语 xff1a 实时操作系统是基于多任务和任务间通信的概念的操作系统 xff0c 多任务环境允许一个实时应用由一组各自独立的任务组成 x
  • HDU 6298(数学)

    题意是给出一个数 xff0c 找出这个数的三个因子且这三个因子的和等于这个数 xff0c 输出满足条件的乘积最大的一组因子的乘积 xff0c 如果不存在这样的因子 xff0c 就输出 1 第一次 wa 了 xff0c 因为把题目中的 x n
  • libevent的http服务详解

    libevent的http服务详解 即远程调用 xff0c 得到一个call ID然后验证外部远程参数 span class token function evrpc request cb span span class token pun