首页 > 其他分享 >boost beast http::read 一直阻塞不返回,问题解决, 使用parser对象的skip(true) 来解决

boost beast http::read 一直阻塞不返回,问题解决, 使用parser对象的skip(true) 来解决

时间:2023-12-18 14:25:02浏览次数:31  
标签:http stream read skip req beast buffer

用beast 作为客户端发送http请求后读web服务端返回的数据,遇到了http::read 或http::async_read一直阻塞着,不返回,直到连接过期后被强制网络断开后read函数才返回。 看了官方文档,文档里这么描述的,read要一直等到end_of_stream时才回退出阻塞状态。也就是 连接失效后才行。

但我们的场景一般是要保持连接的,以供下次使用。

继续系统的读完官方文档后发现,http::read函数可以使用parser作为参数而不是直接用response,而parser对象提供了一个skip(true)函数,为true时,表明这次读返回的http消息只有http头没有body,所以在读完http header后,parser就告知http::read要退出阻塞状态。相关部分代码如下所示:

我遇到这个问题的场景是beast 作为客户端发送http请求连接一个http proxy,连接proxy后再与真实的目标服务器连接。

 

// // Send an HTTP CONNECT request to the proxy
http::request<http::empty_body> req{ http::verb::connect, "www.baidu.com:443", 11 };
req.set(http::field::host, "image.baidu.com");
req.set(http::field::user_agent, "curl/7.81.0");
req.set(http::field::proxy_connection, "Keep-Alive");
req.prepare_payload();
vlogi<<"my connect request is:"<<req<<std::endl;
//http::write(beast::get_lowest_layer(stream_), req);
http::write(stream_.next_layer(), req);

boost::beast::flat_buffer buffer;
//http::response<http::empty_body> res;
//res.result(http::status::unknown);
//res.version(10);

http::parser<false, http::empty_body> p;
p.skip(true);
//http::read(beast::get_lowest_layer(stream_), buffer_, p);

std::size_t result = -1;
//result = http::read(beast::get_lowest_layer(stream_), buffer_, res);
//result = http::read(beast::get_lowest_layer(stream_), buffer_, res);
//result = http::read(beast::get_lowest_layer(stream_), buffer_, p);
result = http::read(stream_.next_layer(), buffer_, p);

http::response<http::empty_body> && res = p.release();

vlogi <<"res after read:"<< res <<", buffer_.size:"<<buffer_.size()<<", result:"<<result<<", p.is_done:"<<p.is_done()<< std::endl;

// Check if the CONNECT request was successful (HTTP 200 OK)
if (res.result() != http::status::ok) {
vlogw << "CONNECT request failed with status code: " << res_.result_int() << std::endl;
return;
}
else
{
vlogi<<"connect to hproxy succeeed."<<std::endl;
}


// Perform the SSL handshake
stream_.async_handshake(
ssl::stream_base::client,
beast::bind_front_handler(
&client_ssl_session_http_proxy::on_handshake,
shared_from_this()));

标签:http,stream,read,skip,req,beast,buffer
From: https://www.cnblogs.com/colin-vio/p/17911110.html

相关文章

  • SpringBoot异步任务获取HttpServletRequest
     前言在使用框架日常开发中需要在controller中进行一些异步操作减少请求时间,但是发现在使用@Anysc注解后会出现Request对象无法获取的情况,本文就此情况给出完整的解决方案原因分析@Anysc注解会开启一个新的线程,主线程的Request和子线程是不共享的,所以获取为null在使用spr......
  • 关于python http.server 开启多线程并发的问题
    问题描述thon中的http.server模块是单线程的,这意味着它一次只能处理一个请求,而其他请求必须等待。为了解决这个问题,您可以考虑使用多线程或异步处理来处理并发请求。您可以使用Python的ThreadingMixIn来创建一个支持多线程的HTTP服务器,或者考虑使用异步框架如asyncio来处理请求......
  • 下载镜像提示 output: Error response from daemon: Get https://k8s.gcr.io/v2/: x5
    出现这问题可能是两种原因:1、k8s所有节点的时间不统一。2、k8s配置文件镜像仓库有问题问题:[root@master1~]#kubeadmconfigimagespull--configkubeadm-config.yamlW092001:12:10.7940302723configset.go:202]WARNING:kubeadmcannotvalidatecomponentconfigs......
  • 解决k8s Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: c
    安装完k8s集群之后很可能会出现一下情况:[root@master1~]#kubectlgetcsNAMESTATUSMESSAGEERRORschedulerUnhealthyGethttp://127.0.0.1:10251......
  • 对ThreadLocal的理解
    1.ThreadLocal概述ThreadLocal是多线程中对于解决线程安全的一个操作类,它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal同时实现了线程内的资源共享案例:使用JDBC操作数据库时,会将每一个线程的Connection放入各自的ThreadLocal中,从而保证每......
  • http
    说一下HTML5dragapi参考回答:dragstart:事件主体是被拖放元素,在开始拖放被拖放元素时触发,。darg:事件主体是被拖放元素,在正在拖放被拖放元素时触发。dragenter:事件主体是目标元素,在被拖放元素进入某元素时触发。dragover:事件主体是目标元素,在被拖放在某元素内移动时触发......
  • 读程序员的README笔记13_技术设计流程(上)
    1. 行为准则2. 设计过程的螺旋式上升2.1. 圆锥体中的箭头进一步螺旋式上升2.2. 你现在更确定你理解了问题空间2.3. 你的原型为你的解决方案提供了越来越多的信心2.4. 随着每一次迭代,设计文档变得更加清晰和详细3. 技术设计流程3.1. 当被要求对系统进行修改时,大......
  • 如何写出漂亮代码 https://libin9ioak.blog.csdn.net/article/details/127749042
    从代码的编写规范,格式的优化,设计原则和一些常见的代码优化的技巧等方面总结了45个小技巧: 1、规范命名命名是写代码中最频繁的操作,比如类、属性、方法、参数等。好的名字应当能遵循以下几点:见名知意比如需要定义一个变量需要来计数inti=0;1名称i没有任何的实际意义,没有......
  • Java: Thread
     /***encoding:utf-8*版权所有2023涂聚文有限公司*许可信息查看:*描述:*#Author:geovindu,GeovinDu涂聚文.*#IDE:IntelliJIDEA2023.1Java17*#Datetime:2023-2023/12/16-16:40*#User:geovindu*#Product:......
  • 将开源免费进行到底,ThreadX开源电脑端GUIBuilder图形开发工具GUIX Studio
    上个月微软刚刚宣布将ThreadXRTOS全家桶贡献给Eclipse基金会,免费供大家商用,宽松的MIT授权方式,就差这个GUIXStudio没有开源了,而且Windows还经常检索不到,并且也不提供离线包。1、软件包有点大,700MB,直接分享到百度云了:链接:https://pan.baidu.com/s/1tS8IDWrIXGiCTbHxwxEkDA  提......