Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么Boost Beast会给我一个部分消息异常_C++_Http_Boost_Boost Asio_Boost Beast - Fatal编程技术网

C++ 为什么Boost Beast会给我一个部分消息异常

C++ 为什么Boost Beast会给我一个部分消息异常,c++,http,boost,boost-asio,boost-beast,C++,Http,Boost,Boost Asio,Boost Beast,我正在尝试将boost beast http库用于http客户端。当我使用模拟服务器时,它工作正常,但是当我尝试连接到真实服务器时,boost::beast::http::read抛出一个异常,称为“部分消息” 我已经研究这个问题好几天了,但我不知道为什么。到目前为止,我一直在使用不同的http客户端库,服务器通信一直在工作,没有任何类似的问题 对于任何关于为什么会发生这种情况以及为什么在使用不同的库时它似乎不是问题的想法或提示,我将不胜感激 boost::beast::http::read引发

我正在尝试将boost beast http库用于http客户端。当我使用模拟服务器时,它工作正常,但是当我尝试连接到真实服务器时,
boost::beast::http::read
抛出一个异常,称为“部分消息”

我已经研究这个问题好几天了,但我不知道为什么。到目前为止,我一直在使用不同的http客户端库,服务器通信一直在工作,没有任何类似的问题

对于任何关于为什么会发生这种情况以及为什么在使用不同的库时它似乎不是问题的想法或提示,我将不胜感激

boost::beast::http::read引发异常,称为“部分消息”

发生这种情况是因为正在解析的消息不完整。一个典型的原因是内容长度头错误,或者发送方过早地放弃连接。例如:

这就是
http::[async_u2;]read
最终要做的事情,但是没有网络相关的东西:

#include <iostream>
#include <iomanip>
#include <string_view>
#include <boost/beast/http.hpp>

int main() {
    using namespace boost::beast::http;
    using boost::asio::buffer;

    for (std::string_view buf : {
            "GET / HTTP/1.1\r\n", // incomplete headers
            "GET / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 0\r\n\r\ntrailing data",
            "GET / HTTP/1.1\r\nHost: example.com\r\nContent-Length: 42\r\n\r\nshort",
        })
    {
        //std::cout << std::quoted(test) << "\n";
        std::cout << "---------------------" << "\n";

        request_parser<string_body> parser;
        boost::system::error_code ec;

        size_t n = parser.put(buffer(buf), ec);
        if (n && !ec && !parser.is_done()) {
            buf.remove_prefix(n);
            n = parser.put(buffer(buf), ec); // body
        }
        if (!ec)
            parser.put_eof(ec);
        buf.remove_prefix(n);

        std::cout
            << (parser.is_header_done()?"headers ok":"incomplete headers")
            << " / " << (parser.is_done()?"done":"not done")
            << " / " << ec.message() << "\n";
        if (parser.is_header_done() && !parser.is_done())
            std::cout << parser.content_length_remaining().value_or(0) << " more content bytes expected\n";

        if (!buf.empty())
            std::cout << "Remaining buffer: " << std::quoted(buf) << "\n";
    }
}
如果您没有将
error\u code
传递给您的调用,它们将抛出带有相同代码的异常
system\u error
,这正是您所看到的

旁注 如果其他库没有此“问题”,则有两个选项:

  • 图书馆不整洁(即糟糕)
  • 你用错了(也许你没有检查错误)

,幸运的是,您不必编写任何代码。只要
http::read(s,buf,req)
并处理您的异常:)嗨,谢谢您的帮助。我也尝试过传递错误代码,并基本上按照方法的其余部分进行操作。据我所知,在达到eof之前,我至少应该得到已经读取的内容,但是根据日志,响应是空的。虽然有可能是图书馆的错(毕竟我尝试使用beast是有原因的),但图书馆也应该对这些错误做出反应,我们正在检查它们。顺便说一句,如果我在我和我们之间切换太多,对不起。我在一家大公司工作,有些事情是我自己做的,而另一些事情则由我团队中的其他人来处理。好消息是,上面的内容向您展示了如何在解析器不完整的情况下使用解析器来获得结果。存在几种方法。如果标题是在正文缺少数据的情况下完成的,您可以将其填充(请参见
内容\u长度\u剩余部分
),或者您可以使用获得的正文滚动,并记录一个警告/错误,说明收到了不完整的请求。我找不到在您的示例中显示的位置,即如何读取部分响应正文。我也不明白为什么我会收到这个错误代码,因为服务器发送的内容长度是正确的,并且我能够用多种工具验证这一点。beast客户端是否可能以某种方式关闭连接?如果是,我能做些什么?