Reads a message from a client.
352{
353 constexpr size_t BUFFER_SIZE = 4096;
354 std::string result;
355
356 result.reserve(BUFFER_SIZE);
357 std::array<char, BUFFER_SIZE> buffer {};
358
359 while (true) {
360 ssize_t bytes_read =
socket_read(client_fd, buffer.data(), buffer.size() - 1);
361
362 if (bytes_read < 0) {
363#ifdef MAYAFLUX_PLATFORM_WINDOWS
365 if (code == WSAEWOULDBLOCK) {
366 return std::unexpected("would_block");
367 }
369#else
370 if (errno == EAGAIN || errno == EWOULDBLOCK) {
371 return std::unexpected("would_block");
372 }
373 return std::unexpected("read error: " + std::string(strerror(errno)));
374#endif
375 }
376
377 if (bytes_read == 0) {
378 return std::unexpected("client_disconnected");
379 }
380
381 buffer[bytes_read] = '\0';
382 result.append(buffer.data());
383
384 if (!result.empty() && result.back() == '\n') {
385 result.pop_back();
386 if (!result.empty() && result.back() == '\r') {
387 result.pop_back();
388 }
389 break;
390 }
391
392 if (result.size() > static_cast<size_t>(1024 * 1024)) {
393 return std::unexpected("message_too_large");
394 }
395 }
396
397 return result;
398}
static std::string socket_error_string(int code)
static int socket_errno()
static ssize_t socket_read(int fd, void *buf, size_t len)