summaryrefslogtreecommitdiff
path: root/src/command/FileCommands.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/FileCommands.cxx')
-rw-r--r--src/command/FileCommands.cxx33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/command/FileCommands.cxx b/src/command/FileCommands.cxx
index 4ac239646..7efbb211c 100644
--- a/src/command/FileCommands.cxx
+++ b/src/command/FileCommands.cxx
@@ -43,6 +43,7 @@
#include "thread/Mutex.hxx"
#include "Log.hxx"
+#include <algorithm>
#include <cassert>
#include <cinttypes> /* for PRIu64 */
@@ -205,28 +206,26 @@ read_stream_art(Response &r, const char *uri, size_t offset)
const offset_type art_file_size = is->GetSize();
- if (offset >= art_file_size) {
- if (offset > art_file_size) {
- r.Error(ACK_ERROR_ARG, "Offset too large");
- return CommandResult::ERROR;
- } else {
- r.Format("size: %" PRIoffset "\n", art_file_size);
- r.WriteBinary(nullptr);
- return CommandResult::OK;
- }
+ if (offset > art_file_size) {
+ r.Error(ACK_ERROR_ARG, "Offset too large");
+ return CommandResult::ERROR;
}
- uint8_t buffer[Response::MAX_BINARY_SIZE];
- size_t read_size;
+ std::size_t buffer_size =
+ std::min<offset_type>(art_file_size - offset,
+ r.GetClient().binary_limit);
- {
+ std::unique_ptr<std::byte[]> buffer(new std::byte[buffer_size]);
+
+ std::size_t read_size = 0;
+ if (buffer_size > 0) {
std::unique_lock<Mutex> lock(mutex);
is->Seek(lock, offset);
- read_size = is->Read(lock, &buffer, sizeof(buffer));
+ read_size = is->Read(lock, buffer.get(), buffer_size);
}
r.Format("size: %" PRIoffset "\n", art_file_size);
- r.WriteBinary({buffer, read_size});
+ r.WriteBinary({buffer.get(), read_size});
return CommandResult::OK;
}
@@ -313,8 +312,10 @@ public:
response.Format("type: %s\n", mime_type);
buffer.size -= offset;
- if (buffer.size > Response::MAX_BINARY_SIZE)
- buffer.size = Response::MAX_BINARY_SIZE;
+
+ const std::size_t binary_limit = response.GetClient().binary_limit;
+ if (buffer.size > binary_limit)
+ buffer.size = binary_limit;
buffer.data = OffsetPointer(buffer.data, offset);
response.WriteBinary(buffer);