Make 'chunked' in Transfer-Encoding case-insensitive
This commit is contained in:
parent
c6a6530716
commit
ca3613cd21
@ -34,6 +34,10 @@
|
|||||||
#undef min
|
#undef min
|
||||||
#undef max
|
#undef max
|
||||||
|
|
||||||
|
#ifndef strcasecmp
|
||||||
|
#define strcasecmp _stricmp
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef SOCKET socket_t;
|
typedef SOCKET socket_t;
|
||||||
#else
|
#else
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
@ -860,7 +864,7 @@ bool read_content(Stream& strm, T& x, Progress progress = Progress())
|
|||||||
} else {
|
} else {
|
||||||
const auto& encoding = get_header_value(x.headers, "Transfer-Encoding", "");
|
const auto& encoding = get_header_value(x.headers, "Transfer-Encoding", "");
|
||||||
|
|
||||||
if (!strcmp(encoding, "chunked")) {
|
if (!strcasecmp(encoding, "chunked")) {
|
||||||
return read_content_chunked(strm, x);
|
return read_content_chunked(strm, x);
|
||||||
} else {
|
} else {
|
||||||
return read_content_without_length(strm, x);
|
return read_content_without_length(strm, x);
|
||||||
|
31
test/test.cc
31
test/test.cc
@ -292,6 +292,9 @@ protected:
|
|||||||
res.status = 404;
|
res.status = 404;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.post("/chunked", [&](const Request& req, Response& /*res*/) {
|
||||||
|
EXPECT_EQ(req.body, "dechunked post body");
|
||||||
|
})
|
||||||
.post("/multipart", [&](const Request& req, Response& /*res*/) {
|
.post("/multipart", [&](const Request& req, Response& /*res*/) {
|
||||||
EXPECT_EQ(5u, req.files.size());
|
EXPECT_EQ(5u, req.files.size());
|
||||||
ASSERT_TRUE(!req.has_file("???"));
|
ASSERT_TRUE(!req.has_file("???"));
|
||||||
@ -660,6 +663,34 @@ TEST_F(ServerTest, CaseInsensitiveHeaderName)
|
|||||||
EXPECT_EQ("Hello World!", res->body);
|
EXPECT_EQ("Hello World!", res->body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ServerTest, CaseInsensitiveTransferEncoding)
|
||||||
|
{
|
||||||
|
Request req;
|
||||||
|
req.method = "POST";
|
||||||
|
req.path = "/chunked";
|
||||||
|
|
||||||
|
std::string host_and_port;
|
||||||
|
host_and_port += HOST;
|
||||||
|
host_and_port += ":";
|
||||||
|
host_and_port += std::to_string(PORT);
|
||||||
|
|
||||||
|
req.headers.emplace("Host", host_and_port.c_str());
|
||||||
|
req.headers.emplace("Accept", "*/*");
|
||||||
|
req.headers.emplace("User-Agent", "cpp-httplib/0.1");
|
||||||
|
req.headers.emplace("Content-Type", "text/plain");
|
||||||
|
req.headers.emplace("Content-Length", "0");
|
||||||
|
req.headers.emplace("Transfer-Encoding", "Chunked"); // Note, "Chunked" rather than typical "chunked".
|
||||||
|
|
||||||
|
// Client does not chunk, so make a chunked body manually.
|
||||||
|
req.body = "4\r\ndech\r\nf\r\nunked post body\r\n0\r\n\r\n";
|
||||||
|
|
||||||
|
auto res = std::make_shared<Response>();
|
||||||
|
auto ret = cli_.send(req, *res);
|
||||||
|
|
||||||
|
ASSERT_TRUE(ret);
|
||||||
|
EXPECT_EQ(200, res->status);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ServerTest, GetMethodRemoteAddr)
|
TEST_F(ServerTest, GetMethodRemoteAddr)
|
||||||
{
|
{
|
||||||
auto res = cli_.get("/remote_addr");
|
auto res = cli_.get("/remote_addr");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user