@@ -193,14 +193,14 @@ using socket_t = int;
193
193
#endif
194
194
#endif // _WIN32
195
195
196
- #include < cstring>
197
196
#include < algorithm>
198
197
#include < array>
199
198
#include < atomic>
200
199
#include < cassert>
201
200
#include < cctype>
202
201
#include < climits>
203
202
#include < condition_variable>
203
+ #include < cstring>
204
204
#include < errno.h>
205
205
#include < fcntl.h>
206
206
#include < fstream>
@@ -5098,14 +5098,16 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection,
5098
5098
5099
5099
// Flush buffer
5100
5100
auto &data = bstrm.get_buffer ();
5101
- strm. write ( data.data (), data.size ());
5101
+ detail::write_data (strm, data.data (), data.size ());
5102
5102
}
5103
5103
5104
5104
// Body
5105
5105
auto ret = true ;
5106
5106
if (req.method != " HEAD" ) {
5107
5107
if (!res.body .empty ()) {
5108
- if (!strm.write (res.body )) { ret = false ; }
5108
+ if (!detail::write_data (strm, res.body .data (), res.body .size ())) {
5109
+ ret = false ;
5110
+ }
5109
5111
} else if (res.content_provider_ ) {
5110
5112
if (write_content_with_provider (strm, req, res, boundary, content_type)) {
5111
5113
res.content_provider_success_ = true ;
@@ -6322,7 +6324,8 @@ inline std::unique_ptr<Response> ClientImpl::send_with_content_provider(
6322
6324
auto last = offset + data_len == content_length;
6323
6325
6324
6326
auto ret = compressor.compress (
6325
- data, data_len, last, [&](const char *compressed_data, size_t compressed_data_len) {
6327
+ data, data_len, last,
6328
+ [&](const char *compressed_data, size_t compressed_data_len) {
6326
6329
req.body .append (compressed_data, compressed_data_len);
6327
6330
return true ;
6328
6331
});
@@ -7261,7 +7264,10 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
7261
7264
7262
7265
inline ssize_t SSLSocketStream::write (const char *ptr, size_t size) {
7263
7266
if (is_writable ()) {
7264
- auto ret = SSL_write (ssl_, ptr, static_cast <int >(size));
7267
+ auto handle_size = static_cast <int >(
7268
+ std::min<size_t >(size, std::numeric_limits<int >::max ()));
7269
+
7270
+ auto ret = SSL_write (ssl_, ptr, static_cast <int >(handle_size));
7265
7271
if (ret < 0 ) {
7266
7272
auto err = SSL_get_error (ssl_, ret);
7267
7273
int n = 1000 ;
@@ -7274,7 +7280,7 @@ inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
7274
7280
#endif
7275
7281
if (is_writable ()) {
7276
7282
std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7277
- ret = SSL_write (ssl_, ptr, static_cast <int >(size ));
7283
+ ret = SSL_write (ssl_, ptr, static_cast <int >(handle_size ));
7278
7284
if (ret >= 0 ) { return ret; }
7279
7285
err = SSL_get_error (ssl_, ret);
7280
7286
} else {
0 commit comments