From 0c001461513213090966ca9a37c92953107384aa Mon Sep 17 00:00:00 2001 From: Luna Date: Fri, 16 May 2025 06:01:13 +0200 Subject: [PATCH 1/2] the files are processed in chunks --- main.cpp | 50 ++++++++++++++++++++++++++++++++------------------ netlib | 2 +- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/main.cpp b/main.cpp index 187a418..f24d9aa 100644 --- a/main.cpp +++ b/main.cpp @@ -144,7 +144,7 @@ std::string get_filename(std::string data) void write_file(const std::string& filename, char *start_data, char *end_data) { - FILE *fd = fopen(filename.c_str(), "wb"); + FILE *fd = fopen(filename.c_str(), "ab"); while (start_data != end_data) { fwrite(start_data, sizeof(char), 1, fd); @@ -153,6 +153,14 @@ void write_file(const std::string& filename, char *start_data, char *end_data) fclose(fd); } +void write_file_size(const std::string& filename, char *start_data, size_t size) +{ + FILE *fd = fopen(filename.c_str(), "ab"); + int index = 0; + fwrite(start_data, sizeof(char), size, fd); + fclose(fd); +} + char *search_substring(char *start_data, const char *substring, size_t size) { size_t index = 0; @@ -251,28 +259,34 @@ int main() { std::string line_str = std::string(line1); std::string line_str2 = std::string(line); + std::string line_str3 = std::string(line2); + std::string line_str4 = std::string(line3); auto h = parse_header(line_str); std::vector file_ = split(h.begin()->second, "; "); std::string filename = get_filename(file_.back()); - size_t size = file_size - (line_str.size() + std::string(line2).size() + std::string(line3).size() + (line_str2.size())); - char *file_data = server.receive_data_ensured(user, size); - if (!file_data) - throw std::runtime_error("Getting file data failed"); - std::string final_boundary = std::format("\r\n--{}--", boundary); - char *end = search_substring(file_data, final_boundary.c_str(), file_size); - if (!end) + int size_to_get = line_str.size() + line_str2.size() + line_str3.size() + line_str4.size(); + size_to_get = file_size - size_to_get; + int chunks_to_get = (size_to_get / 2048) + 1; + int last_chunk_size = size_to_get % 2048; + while (chunks_to_get > 0) { - std::println("Couldn't find ending for the file"); - free(line); - free(line1); - free(line2); - free(line3); - break; + if (chunks_to_get == 1) + { + char *chunk = server.receive_data_ensured(user, last_chunk_size); + std::string final_boundary = std::format("\r\n--{}--", boundary); + char *end = search_substring(chunk, final_boundary.c_str(), file_size); + write_file(filename, chunk, end); + free(chunk); + } + else + { + char *chunk = server.receive_data_ensured(user, 2048); + write_file_size(filename, chunk, 2048); + free(chunk); + } + chunks_to_get--; + std::println("Chunks left: {}", chunks_to_get); } - write_file(filename, file_data, end); - print_map(h); - free(file_data); - std::println("File {} received", filename); } free(line); free(line1); diff --git a/netlib b/netlib index 57b7a51..8131377 160000 --- a/netlib +++ b/netlib @@ -1 +1 @@ -Subproject commit 57b7a51ebbec052c421ecbab66884319faaad26f +Subproject commit 81313776bc951f88387f0a9f7cec06fb04d1fcb9 From 2e9d90a0ae7b3eab93b900e8a40525e39f2d8c4b Mon Sep 17 00:00:00 2001 From: Luna Date: Thu, 22 May 2025 23:02:02 +0200 Subject: [PATCH 2/2] added visual feedback to website and added a response in the server --- main.cpp | 2 ++ netlib | 2 +- test.html | 32 +++++++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index 2e7e2f1..4cea78f 100644 --- a/main.cpp +++ b/main.cpp @@ -5,6 +5,7 @@ #include #include #include +#include int atoi_newline(const char *data) { @@ -337,6 +338,7 @@ int main() char *end = search_substring(chunk, final_boundary.c_str(), file_size); write_file(filename, chunk, end); free(chunk); + netlib::send_packet(std::make_tuple(std::string("HTTP/1.1 200 OK\r\n")), user); } else { diff --git a/netlib b/netlib index 8131377..344f771 160000 --- a/netlib +++ b/netlib @@ -1 +1 @@ -Subproject commit 81313776bc951f88387f0a9f7cec06fb04d1fcb9 +Subproject commit 344f771aa83755fa6acdcd74a621362adc1fd5b7 diff --git a/test.html b/test.html index 6567d23..6a9e294 100644 --- a/test.html +++ b/test.html @@ -20,6 +20,11 @@ background-color: #fff; transition: background-color 0.3s, border-color 0.3s; } + #drop_zone.dragover + { + border-color: green; + background-color: #e0ffe0; + } @@ -29,9 +34,12 @@ ondrop="dropHandler(event);" ondragover="dragOverHandler(event);" ondragenter="dragEnterHandler(event);" + ondragleave="dragLeaveHandler(event);" > +
+