Skip to content

Commit 9d57899

Browse files
committed
Simplified ContentReceiver interface
1 parent d03937e commit 9d57899

File tree

3 files changed

+45
-87
lines changed

3 files changed

+45
-87
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ int main(void)
194194
std::string body;
195195
196196
auto res = cli.Get("/large-data",
197-
[&](const char *data, uint64_t data_length, uint64_t offset, uint64_t content_length) {
197+
[&](const char *data, uint64_t data_length) {
198198
body.append(data, data_length);
199199
});
200200

httplib.h

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,7 @@ typedef std::function<void(size_t offset, size_t length, DataSink sink,
202202
Done done)>
203203
ContentProviderWithCloser;
204204

205-
typedef std::function<bool(const char *data, size_t data_length, size_t offset,
206-
uint64_t content_length)>
205+
typedef std::function<bool(const char *data, size_t data_length)>
207206
ContentReceiver;
208207

209208
typedef std::function<bool(ContentReceiver receiver)> ContentReader;
@@ -1523,12 +1522,8 @@ inline bool read_headers(Stream &strm, Headers &headers) {
15231522
return true;
15241523
}
15251524

1526-
typedef std::function<bool(const char *data, size_t data_length)>
1527-
ContentReceiverCore;
1528-
15291525
inline bool read_content_with_length(Stream &strm, uint64_t len,
1530-
Progress progress,
1531-
ContentReceiverCore out) {
1526+
Progress progress, ContentReceiver out) {
15321527
char buf[CPPHTTPLIB_RECV_BUFSIZ];
15331528

15341529
uint64_t r = 0;
@@ -1560,7 +1555,7 @@ inline void skip_content_with_length(Stream &strm, uint64_t len) {
15601555
}
15611556
}
15621557

1563-
inline bool read_content_without_length(Stream &strm, ContentReceiverCore out) {
1558+
inline bool read_content_without_length(Stream &strm, ContentReceiver out) {
15641559
char buf[CPPHTTPLIB_RECV_BUFSIZ];
15651560
for (;;) {
15661561
auto n = strm.read(buf, CPPHTTPLIB_RECV_BUFSIZ);
@@ -1575,7 +1570,7 @@ inline bool read_content_without_length(Stream &strm, ContentReceiverCore out) {
15751570
return true;
15761571
}
15771572

1578-
inline bool read_content_chunked(Stream &strm, ContentReceiverCore out) {
1573+
inline bool read_content_chunked(Stream &strm, ContentReceiver out) {
15791574
const auto bufsiz = 16;
15801575
char buf[bufsiz];
15811576

@@ -1615,9 +1610,9 @@ inline bool is_chunked_transfer_encoding(const Headers &headers) {
16151610

16161611
template <typename T>
16171612
bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status,
1618-
Progress progress, ContentReceiverCore receiver) {
1613+
Progress progress, ContentReceiver receiver) {
16191614

1620-
ContentReceiverCore out = [&](const char *buf, size_t n) {
1615+
ContentReceiver out = [&](const char *buf, size_t n) {
16211616
return receiver(buf, n);
16221617
};
16231618

@@ -2673,19 +2668,9 @@ inline bool
26732668
Server::read_content_with_content_receiver(Stream &strm, bool last_connection,
26742669
Request &req, Response &res,
26752670
ContentReceiver receiver) {
2676-
size_t offset = 0;
2677-
2678-
size_t length = 0;
2679-
if (req.get_header_value("Content-Encoding") != "gzip") {
2680-
length = get_header_value_uint64(req.headers, "Content-Length", 0);
2681-
}
2682-
2683-
if (!detail::read_content(strm, req, payload_max_length_, res.status,
2684-
Progress(), [&](const char *buf, size_t n) {
2685-
auto ret = receiver(buf, n, offset, length);
2686-
offset += n;
2687-
return ret;
2688-
})) {
2671+
if (!detail::read_content(
2672+
strm, req, payload_max_length_, res.status, Progress(),
2673+
[&](const char *buf, size_t n) { return receiver(buf, n); })) {
26892674
return write_response(strm, last_connection, req, res);
26902675
}
26912676

@@ -3253,26 +3238,15 @@ inline bool Client::process_request(Stream &strm, const Request &req,
32533238

32543239
// Body
32553240
if (req.method != "HEAD") {
3256-
detail::ContentReceiverCore out = [&](const char *buf, size_t n) {
3241+
ContentReceiver out = [&](const char *buf, size_t n) {
32573242
if (res.body.size() + n > res.body.max_size()) { return false; }
32583243
res.body.append(buf, n);
32593244
return true;
32603245
};
32613246

32623247
if (req.content_receiver) {
3263-
auto offset = std::make_shared<size_t>();
3264-
3265-
size_t length = 0;
3266-
if (res.get_header_value("Content-Encoding") != "gzip") {
3267-
length = get_header_value_uint64(res.headers, "Content-Length", 0);
3268-
}
3269-
3270-
auto receiver = req.content_receiver;
3271-
3272-
out = [offset, length, receiver](const char *buf, size_t n) {
3273-
auto ret = receiver(buf, n, *offset, length);
3274-
(*offset) += n;
3275-
return ret;
3248+
out = [&](const char *buf, size_t n) {
3249+
return req.content_receiver(buf, n);
32763250
};
32773251
}
32783252

test/test.cc

Lines changed: 32 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ TEST(ChunkedEncodingTest, WithContentReceiver) {
229229
std::string body;
230230
auto res =
231231
cli.Get("/httpgallery/chunked/chunkedimage.aspx?0.4153841143030137",
232-
[&](const char *data, size_t data_length, uint64_t, uint64_t) {
232+
[&](const char *data, size_t data_length) {
233233
body.append(data, data_length);
234234
return true;
235235
});
@@ -261,7 +261,7 @@ TEST(ChunkedEncodingTest, WithResponseHandlerAndContentReceiver) {
261261
EXPECT_EQ(200, response.status);
262262
return true;
263263
},
264-
[&](const char *data, size_t data_length, uint64_t, uint64_t) {
264+
[&](const char *data, size_t data_length) {
265265
body.append(data, data_length);
266266
return true;
267267
});
@@ -745,18 +745,10 @@ class ServerTest : public ::testing::Test {
745745
EXPECT_EQ("5", req.get_header_value("Content-Length"));
746746
})
747747
.Post("/content_receiver",
748-
[&](const Request & req, Response &res,
748+
[&](const Request & /*req*/, Response &res,
749749
const ContentReader &content_reader) {
750750
std::string body;
751-
content_reader([&](const char *data, size_t data_length,
752-
size_t offset,
753-
uint64_t content_length) {
754-
EXPECT_EQ(offset, 0);
755-
if (req.get_header_value("Content-Encoding") == "gzip") {
756-
EXPECT_EQ(content_length, 0);
757-
} else {
758-
EXPECT_EQ(content_length, 7);
759-
}
751+
content_reader([&](const char *data, size_t data_length) {
760752
EXPECT_EQ(data_length, 7);
761753
body.append(data, data_length);
762754
return true;
@@ -768,9 +760,7 @@ class ServerTest : public ::testing::Test {
768760
[&](const Request & /*req*/, Response &res,
769761
const ContentReader &content_reader) {
770762
std::string body;
771-
content_reader([&](const char *data, size_t data_length,
772-
size_t /*offset*/,
773-
uint64_t /*content_length*/) {
763+
content_reader([&](const char *data, size_t data_length) {
774764
body.append(data, data_length);
775765
return true;
776766
});
@@ -781,9 +771,7 @@ class ServerTest : public ::testing::Test {
781771
[&](const Request & /*req*/, Response &res,
782772
const ContentReader &content_reader) {
783773
std::string body;
784-
content_reader([&](const char *data, size_t data_length,
785-
size_t /*offset*/,
786-
uint64_t /*content_length*/) {
774+
content_reader([&](const char *data, size_t data_length) {
787775
body.append(data, data_length);
788776
return true;
789777
});
@@ -1284,10 +1272,15 @@ TEST_F(ServerTest, GetStreamedWithRangeMultipart) {
12841272
}
12851273

12861274
TEST_F(ServerTest, GetStreamedEndless) {
1275+
size_t offset = 0;
12871276
auto res = cli_.Get("/streamed-cancel",
1288-
[](const char * /*data*/, uint64_t /*data_length*/,
1289-
uint64_t offset,
1290-
uint64_t /*content_length*/) { return offset < 100; });
1277+
[&](const char * /*data*/, uint64_t data_length) {
1278+
if (offset < 100) {
1279+
offset += data_length;
1280+
return true;
1281+
}
1282+
return false;
1283+
});
12911284
ASSERT_TRUE(res == nullptr);
12921285
}
12931286

@@ -1579,15 +1572,12 @@ TEST_F(ServerTest, GzipWithContentReceiver) {
15791572
Headers headers;
15801573
headers.emplace("Accept-Encoding", "gzip, deflate");
15811574
std::string body;
1582-
auto res = cli_.Get("/gzip", headers,
1583-
[&](const char *data, uint64_t data_length,
1584-
uint64_t offset, uint64_t content_length) {
1585-
EXPECT_EQ(data_length, 100);
1586-
EXPECT_EQ(offset, 0);
1587-
EXPECT_EQ(content_length, 0);
1588-
body.append(data, data_length);
1589-
return true;
1590-
});
1575+
auto res =
1576+
cli_.Get("/gzip", headers, [&](const char *data, uint64_t data_length) {
1577+
EXPECT_EQ(data_length, 100);
1578+
body.append(data, data_length);
1579+
return true;
1580+
});
15911581

15921582
ASSERT_TRUE(res != nullptr);
15931583
EXPECT_EQ("gzip", res->get_header_value("Content-Encoding"));
@@ -1602,15 +1592,12 @@ TEST_F(ServerTest, GzipWithContentReceiver) {
16021592
TEST_F(ServerTest, GzipWithContentReceiverWithoutAcceptEncoding) {
16031593
Headers headers;
16041594
std::string body;
1605-
auto res = cli_.Get("/gzip", headers,
1606-
[&](const char *data, uint64_t data_length,
1607-
uint64_t offset, uint64_t content_length) {
1608-
EXPECT_EQ(data_length, 100);
1609-
EXPECT_EQ(offset, 0);
1610-
EXPECT_EQ(content_length, 100);
1611-
body.append(data, data_length);
1612-
return true;
1613-
});
1595+
auto res =
1596+
cli_.Get("/gzip", headers, [&](const char *data, uint64_t data_length) {
1597+
EXPECT_EQ(data_length, 100);
1598+
body.append(data, data_length);
1599+
return true;
1600+
});
16141601

16151602
ASSERT_TRUE(res != nullptr);
16161603
EXPECT_EQ("", res->get_header_value("Content-Encoding"));
@@ -1641,15 +1628,12 @@ TEST_F(ServerTest, NoGzipWithContentReceiver) {
16411628
Headers headers;
16421629
headers.emplace("Accept-Encoding", "gzip, deflate");
16431630
std::string body;
1644-
auto res = cli_.Get("/nogzip", headers,
1645-
[&](const char *data, uint64_t data_length,
1646-
uint64_t offset, uint64_t content_length) {
1647-
EXPECT_EQ(data_length, 100);
1648-
EXPECT_EQ(offset, 0);
1649-
EXPECT_EQ(content_length, 100);
1650-
body.append(data, data_length);
1651-
return true;
1652-
});
1631+
auto res =
1632+
cli_.Get("/nogzip", headers, [&](const char *data, uint64_t data_length) {
1633+
EXPECT_EQ(data_length, 100);
1634+
body.append(data, data_length);
1635+
return true;
1636+
});
16531637

16541638
ASSERT_TRUE(res != nullptr);
16551639
EXPECT_EQ(false, res->has_header("Content-Encoding"));

0 commit comments

Comments
 (0)