Browse Source

Fix put, get files miss bytes Bug

Jonas Pflanzer 5 years ago
parent
commit
039dca2c4a
5 changed files with 70 additions and 60 deletions
  1. 20 27
      cli/src/base64.cpp
  2. 9 1
      cli/src/fileman.cpp
  3. 7 0
      daemon/include/FileManager.h
  4. 14 5
      daemon/src/FileManager.cpp
  5. 20 27
      daemon/src/base64.cpp

+ 20 - 27
cli/src/base64.cpp

@@ -1,41 +1,34 @@
 #include "../include/base64.h"
 
-#include <boost/algorithm/string.hpp>
-#include <boost/archive/iterators/base64_from_binary.hpp>
-#include <boost/archive/iterators/binary_from_base64.hpp>
-#include <boost/archive/iterators/transform_width.hpp>
+#include <boost/beast.hpp>
 
 std::string base64::decode(const std::string &val) {
-  using namespace boost::archive::iterators;
-  using It =
-      transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
-  return boost::algorithm::trim_right_copy_if(
-      std::string(It(std::begin(val)), It(std::end(val))),
-      [](char c) { return c == '\0'; });
+  char buf[boost::beast::detail::base64::decoded_size(val.size())];
+  int read =
+      boost::beast::detail::base64::decode(buf, val.c_str(), val.size()).first;
+
+  return std::string(buf, read);
 }
 
 std::vector<char> base64::decodeVector(const std::string &val) {
-  using namespace boost::archive::iterators;
-  using It =
-      transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
-  std::vector<char> ret =
-      std::vector<char>(It(std::begin(val)), It(std::end(val)));
-  ret.pop_back();
-  return ret;
+  char buf[boost::beast::detail::base64::decoded_size(val.size())];
+  int read =
+      boost::beast::detail::base64::decode(buf, val.c_str(), val.size()).first;
+
+  std::vector<char> ret(buf, buf + read);
+  return std::vector<char>(buf, buf + read);
 }
 
 std::string base64::encode(const std::string &val) {
-  using namespace boost::archive::iterators;
-  using It =
-      base64_from_binary<transform_width<std::string::const_iterator, 6, 8>>;
-  auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
-  return tmp.append((3 - val.size() % 3) % 3, '=');
+  char buf[boost::beast::detail::base64::encoded_size(val.size())];
+  int read = boost::beast::detail::base64::encode(buf, val.data(), val.size());
+
+  return std::string(buf, read);
 }
 
 std::string base64::encodeVector(const std::vector<char> &val) {
-  using namespace boost::archive::iterators;
-  using It = base64_from_binary<
-      transform_width<std::vector<char>::const_iterator, 6, 8>>;
-  auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
-  return tmp.append((3 - val.size() % 3) % 3, '=');
+  char buf[boost::beast::detail::base64::encoded_size(val.size())];
+  int read = boost::beast::detail::base64::encode(buf, val.data(), val.size());
+
+  return std::string(buf, read);
 }

+ 9 - 1
cli/src/fileman.cpp

@@ -108,7 +108,15 @@ void FileMan::setListChunks(int chunks) {
 std::vector<char> FileMan::readPut() {
   char buf[max_read_len];
   std::vector<char> data;
-  int read = putfile.readsome(buf, max_read_len);
+
+  std::streamoff read = this->putfile.tellg();
+  if (read + max_read_len > this->putsize) {
+    read = this->putsize % max_read_len;
+  } else {
+    read = max_read_len;
+  }
+
+  putfile.read(buf, read);
   data.assign(buf, buf + read);
   putchunksRemaining--;
   return data;

+ 7 - 0
daemon/include/FileManager.h

@@ -39,6 +39,13 @@ private:
    */
   std::string getBaseFileName;
 
+  /*
+   * size of the get file
+   *
+   * Used to determine how much to read and encode as base64
+   */
+  std::streamoff getFileSize;
+
 public:
   enum { max_data_length = 512 };
 

+ 14 - 5
daemon/src/FileManager.cpp

@@ -42,8 +42,9 @@ bool FileManager::openGetFile(const std::string &filename, int &chunks) {
     // file does not exist or cannot be opened
     return false;
   } else {
-    size_t size = this->getFile.tellg();
-    chunks = size / max_data_length + (size % max_data_length == 0 ? 0 : 1);
+    this->getFileSize = this->getFile.tellg();
+    chunks = this->getFileSize / max_data_length +
+             (this->getFileSize % max_data_length == 0 ? 0 : 1);
 
     this->getFile.seekg(std::ios::beg);
     return true;
@@ -70,13 +71,21 @@ std::string FileManager::getGetBaseFileName() { return this->getBaseFileName; }
 std::string FileManager::getPutBaseFileName() { return this->putBaseFileName; }
 
 void FileManager::writePut(const std::vector<char> &data) {
-  std::ostreambuf_iterator<char> output_iterator(this->putFile);
-  std::copy(data.begin(), data.end(), output_iterator);
+  this->putFile.write(data.data(), data.size());
 }
 
 std::vector<char> FileManager::readGet() {
   char fileBuffer[max_data_length];
-  int read = this->getFile.readsome(fileBuffer, max_data_length);
+
+  // store position before read
+  std::streamoff read = this->getFile.tellg();
+  if (read + max_data_length > this->getFileSize) {
+    read = this->getFileSize % max_data_length;
+  } else {
+    read = max_data_length;
+  }
+
+  this->getFile.read(fileBuffer, read);
 
   std::vector<char> data;
   data.assign(fileBuffer, fileBuffer + read);

+ 20 - 27
daemon/src/base64.cpp

@@ -1,41 +1,34 @@
 #include "../include/base64.h"
 
-#include <boost/algorithm/string.hpp>
-#include <boost/archive/iterators/base64_from_binary.hpp>
-#include <boost/archive/iterators/binary_from_base64.hpp>
-#include <boost/archive/iterators/transform_width.hpp>
+#include <boost/beast.hpp>
 
 std::string base64::decode(const std::string &val) {
-  using namespace boost::archive::iterators;
-  using It =
-      transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
-  return boost::algorithm::trim_right_copy_if(
-      std::string(It(std::begin(val)), It(std::end(val))),
-      [](char c) { return c == '\0'; });
+  char buf[boost::beast::detail::base64::decoded_size(val.size())];
+  int read =
+      boost::beast::detail::base64::decode(buf, val.c_str(), val.size()).first;
+
+  return std::string(buf, read);
 }
 
 std::vector<char> base64::decodeVector(const std::string &val) {
-  using namespace boost::archive::iterators;
-  using It =
-      transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>;
-  std::vector<char> ret =
-      std::vector<char>(It(std::begin(val)), It(std::end(val)));
-  ret.pop_back();
-  return ret;
+  char buf[boost::beast::detail::base64::decoded_size(val.size())];
+  int read =
+      boost::beast::detail::base64::decode(buf, val.c_str(), val.size()).first;
+
+  std::vector<char> ret(buf, buf + read);
+  return std::vector<char>(buf, buf + read);
 }
 
 std::string base64::encode(const std::string &val) {
-  using namespace boost::archive::iterators;
-  using It =
-      base64_from_binary<transform_width<std::string::const_iterator, 6, 8>>;
-  auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
-  return tmp.append((3 - val.size() % 3) % 3, '=');
+  char buf[boost::beast::detail::base64::encoded_size(val.size())];
+  int read = boost::beast::detail::base64::encode(buf, val.data(), val.size());
+
+  return std::string(buf, read);
 }
 
 std::string base64::encodeVector(const std::vector<char> &val) {
-  using namespace boost::archive::iterators;
-  using It = base64_from_binary<
-      transform_width<std::vector<char>::const_iterator, 6, 8>>;
-  auto tmp = std::string(It(std::begin(val)), It(std::end(val)));
-  return tmp.append((3 - val.size() % 3) % 3, '=');
+  char buf[boost::beast::detail::base64::encoded_size(val.size())];
+  int read = boost::beast::detail::base64::encode(buf, val.data(), val.size());
+
+  return std::string(buf, read);
 }