看起来OpenJDK版本8中的JSSE没有实现RFC7507.OpenJDK错误跟踪器中存在一个开放缺陷: JDK-8061798
但是关于Oracle JDK的信息并不多.Oracle JDK版本8是否实现了TLS后备信令密码套件值(SCSV)?如果它能够如何启用此功能?
我正在研究Boost.Beast库。我尝试提出一个请求,其响应为:
HTTP/1.1 301 Moved Permanently
Cache-Control: public
Content-Type: text/html; charset=UTF-8
Location: https://www.example.com/target/xxx/
Run Code Online (Sandbox Code Playgroud)
然后,我尝试使用此位置字段发出请求,但收到错误的请求响应。
我该如何进行重定向?有例子吗?
这是我的代码:
boost::asio::io_service ios;
tcp::resolver resolver{ios};
tcp::socket socket{ios};
auto const lookup = resolver.resolve( tcp::resolver::query(host, port) );
boost::asio::connect(socket, lookup);
// Set up an HTTP GET request message
http::request<http::string_body> req{http::verb::get, target, 11};
req.set(http::field::host, host);
req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
// Send the HTTP request to the remote host
http::write(socket, req);
// This buffer is used for reading and must be persisted
boost::beast::flat_buffer buffer;
// Declare a container to hold the response
http::response<http::dynamic_body> …Run Code Online (Sandbox Code Playgroud) Beast websocket示例将数据存储在多缓冲区中:
该实现使用一个或多个不同大小的字符数组的序列.附加的字符数组对象附加到序列以适应字符序列大小的变化.
在查看界面时,我并不完全清楚它是如何工作的.如果我读了描述,它可以看作是一个缓冲区数组.但似乎输出只是一大块数据.这是否意味着"一个或多个阵列"仅适用于内部结构?
在示例代码中,数据被读入缓冲区,如下所示: m_websocketStream.async_read(m_buffer.....
每个async_read操作都会创建一个新的内部缓冲区.
如果是这种情况,如何在另一端解释它.EG如何将其读入std :: string或std :: vector.
在查看sources时,data()返回const_buffer_type,这是一个前向声明.
对于数据成员,帮助信息提供以下信息,这些信息没有多大帮助:
用于将输入序列表示为缓冲区列表的类型.使用const_buffers_type = implementation_defined;
该定义似乎来自头文件boost/asio/buffer.hpp,它也包括在内.然而整体结构对我来说有些模糊.
我只是想了解如何将数据作为字节处理或将其转换为std :: string.
试过以下内容,但这也是不允许的:
std::string( boost::asio::buffer_cast<const char*>(m_buffer.data())
,boost::asio::buffer_size(m_buffer.data()) );
有人能开导我一点吗?
从Beast.1.0.0-b66(使用Boost.1.64.0)迁移到Boost.1.67.0.Beast(即将Beast集成到Boost中)后,我观察到性能急剧下降(CPU消耗急剧增加)。 。毫无疑问,我做错了什么,但我无法想象。
什么是:
typedef beast::http::request<beast::http::string_body> BeastHttpRequest;
Run Code Online (Sandbox Code Playgroud)
就是现在:
namespace http = boost::beast::http;
typedef http::request<http::string_body> BeastHttpRequest;
Run Code Online (Sandbox Code Playgroud)
什么是:
beast::http::prepare(req);
beast::http::write(stream, req);
Run Code Online (Sandbox Code Playgroud)
就是现在:
req.prepare_payload();
http::write(stream, req);
Run Code Online (Sandbox Code Playgroud)
当然,我还必须进行许多API更改。例如:
req.fields.replace(hdrName, hdrValue);
Run Code Online (Sandbox Code Playgroud)
就是现在:
req.set(hdrName, hdrValue);
Run Code Online (Sandbox Code Playgroud)
该应用程序可以正常工作-包括SSL握手和代理协商-但我必须解决CPU消耗高峰和性能相应下降的问题。我想知道是否有人知道我忽略了一些明显的事情。
编辑:我应该提到我正在为SSL流使用flat_buffer。
我有机会分析“端口之前”和“端口之后”性能数据。这是“端口之前”(即良好的性能)调用链:
- 34.61% HttpRequest::send
- 32.02% beast::http::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&>, true, beast::http::string_body,
- 31.90% beast::http::write<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >&>, true, beast::http::string_bo
- 20.77% beast::http::detail::write_preparation<true, beast::http::string_body, beast::http::basic_fields<std::allocator<char> > >::init
- 18.25% beast::http::detail::write_fields<beast::basic_streambuf<std::allocator<char> >, beast::http::basic_fields<std::allocator<char> > >
- 10.38% beast::write<beast::basic_streambuf<std::allocator<char> >, boost::basic_string_ref<char, std::char_traits<char> > >
- 10.20% beast::detail::write_dynabuf<beast::basic_streambuf<std::allocator<char> >, boost::basic_string_ref<char, std::char_traits<char> > >
+ 3.66% …Run Code Online (Sandbox Code Playgroud) 下面的代码用于获取http响应消息:
\n boost::beast::tcp_stream stream_;\n\n boost::beast::flat_buffer buffer;\n boost::beast::http::response<boost::beast::http::dynamic_body> res;\n boost::beast::http::read(stream_, buffer, res);\nRun Code Online (Sandbox Code Playgroud)\n但是,在某些情况下,根据前面的请求,我可以预期响应消息正文将包含大型二进制文件。
\n因此,我\xe2\x80\x99d喜欢直接将其读取到文件系统而不是通过buffer变量来避免过多使用进程内存。如何做呢 ?
在 Objective-c 框架中,NSUrlSession有一个简单的方法可以使用NSURLSessionDownloadTask而不是NSURLSessionDataTask,所以我想知道它是否也存在于 boost 中。
谢谢 !
\nbeast ×5
boost ×3
c++ ×3
boost-beast ×1
http ×1
java ×1
jsse ×1
networking ×1
performance ×1
security ×1
ssl ×1
websocket ×1