Skip to content

Commit 84bb92b

Browse files
committed
[功能重构]: 重构 HTTP 客户端和 TCP 客户端相关代码,优化结构与功能
- 重构 `HttpClient` 类,引入 PIMPL 模式,隐藏实现细节,便于维护和扩展 - 将私有成员变量和相关函数封装到 `HttpClientPrivate` 类中 - 优化 HTTP 请求相关函数的实现,如 `get`、`post`、`put` 等 - 新增 `download`、`upload_put`、`upload_post` 等函数,支持文件下载和上传 - 重构 `HttpClientAsync` 类,引入 PIMPL 模式,优化异步请求处理逻辑 - 封装异步请求相关数据和函数到 `HttpClientAsyncPrivate` 类 - 优化异步请求的发起、处理和回调机制 - 新增异步文件下载和上传相关功能 - 新增 `file_utils.hpp` 和 `file_utils.cc` 文件,提供文件操作相关工具函数 - `createFile`:创建并写入文件 - `removeFile`:删除文件 - `assertFileData`:断言文件内容 - `formatBytes`:格式化字节大小 - 修改 `CMakeLists.txt` 文件,调整目标链接库和源文件列表,适应代码重构后的变化 - 更新相关测试文件,如 `httpclient_test.cc`、`httpclient_async_test.cc`、`httpclient_file_test.cc`、`httpclient_async_file_test.cc` 等,以适配重构后的类接口和功能 - 重构 `TcpClient` 类,引入 PIMPL 模式,优化 TCP 客户端功能实现 - 封装私有成员到 `TcpClientPrivate` 类,简化类结构 - 优化连接、发送、接收等函数的实现,提高代码可读性和可维护性
1 parent 7d980fa commit 84bb92b

13 files changed

+1171
-388
lines changed

Curl/CMakeLists.txt

+29-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,32 @@
11
add_executable(tcpclient_test tcpclient_test.cc tcpclient.cc tcpclient.hpp)
2-
target_link_libraries(tcpclient_test PRIVATE CURL::libcurl)
2+
target_link_libraries(
3+
tcpclient_test PRIVATE CURL::libcurl GTest::gtest GTest::gtest_main
4+
GTest::gmock GTest::gmock_main)
35

4-
add_executable(httpclient_test httpclient_test.cc httpclient.cc httpclient.hpp)
5-
target_link_libraries(httpclient_test PRIVATE CURL::libcurl)
6+
set(HttpClientSource file_utils.cc file_utils.hpp httpclient.cc httpclient.hpp)
67

7-
add_executable(httpclient_async_test httpclient_async_test.cc
8-
httpclient_async.cc httpclient_async.hpp)
9-
target_link_libraries(httpclient_async_test PRIVATE CURL::libcurl)
8+
add_executable(httpclient_test ${HttpClientSource} httpclient_test.cc)
9+
target_link_libraries(
10+
httpclient_test PRIVATE CURL::libcurl GTest::gtest GTest::gtest_main
11+
GTest::gmock GTest::gmock_main)
12+
13+
add_executable(httpclient_file_test ${HttpClientSource} httpclient_file_test.cc)
14+
target_link_libraries(
15+
httpclient_file_test PRIVATE CURL::libcurl GTest::gtest GTest::gtest_main
16+
GTest::gmock GTest::gmock_main)
17+
18+
set(HttpClientAsyncSource file_utils.cc file_utils.hpp httpclient_async.cc
19+
httpclient_async.hpp)
20+
21+
add_executable(httpclient_async_test ${HttpClientAsyncSource}
22+
httpclient_async_test.cc)
23+
target_link_libraries(
24+
httpclient_async_test PRIVATE CURL::libcurl GTest::gtest GTest::gtest_main
25+
GTest::gmock GTest::gmock_main)
26+
27+
add_executable(httpclient_async_file_test ${HttpClientAsyncSource}
28+
httpclient_async_file_test.cc)
29+
target_link_libraries(
30+
httpclient_async_file_test
31+
PRIVATE CURL::libcurl GTest::gtest GTest::gtest_main GTest::gmock
32+
GTest::gmock_main)

Curl/file_utils.cc

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include "file_utils.hpp"
2+
3+
#include <gtest/gtest.h>
4+
5+
#include <filesystem>
6+
#include <fstream>
7+
#include <iostream>
8+
9+
void createFile(const std::string &filename, const std::string &data)
10+
{
11+
auto filepath = std::filesystem::current_path() / filename;
12+
std::ofstream file(filepath);
13+
if (!file.is_open()) {
14+
std::cerr << "Cannot open the file: " << filepath << std::endl;
15+
return;
16+
}
17+
file << data;
18+
file.close();
19+
}
20+
21+
void removeFile(const std::string &filename)
22+
{
23+
auto filepath = std::filesystem::current_path() / filename;
24+
if (std::filesystem::exists(filepath)) {
25+
std::filesystem::remove(filepath);
26+
}
27+
}
28+
29+
void assertFileData(const std::string &filename, const std::string &data)
30+
{
31+
auto filepath = std::filesystem::current_path() / filename;
32+
std::ifstream file(filepath);
33+
if (!file.is_open()) {
34+
std::cerr << "Cannot open the file: " << filepath << std::endl;
35+
return;
36+
}
37+
std::string fileData((std::istreambuf_iterator<char>(file)), (std::istreambuf_iterator<char>()));
38+
file.close();
39+
EXPECT_EQ(fileData, data);
40+
}
41+
42+
auto formatBytes(double value, int precision) -> std::string
43+
{
44+
std::vector<std::string> units = {"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
45+
46+
int i = 0;
47+
while (value > 1024) {
48+
value /= 1024;
49+
i++;
50+
}
51+
52+
std::ostringstream out;
53+
out.precision(precision);
54+
out << std::fixed << value;
55+
56+
return out.str() + " " + units[i];
57+
}

Curl/file_utils.hpp

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
#include <string>
4+
5+
void createFile(const std::string &filename, const std::string &data);
6+
7+
void removeFile(const std::string &filename);
8+
9+
void assertFileData(const std::string &filename, const std::string &data);
10+
11+
auto formatBytes(double value, int precision = 2) -> std::string;

0 commit comments

Comments
 (0)