Revert "Fix content reader for partial input"
This reverts commit 77209caf044d58c7d87770b377027a65fe696466.
This commit is contained in:
parent
60fee6e505
commit
8399fbae7f
@ -44,17 +44,13 @@ void ContentReader::close() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string ContentReader::read() {
|
std::string ContentReader::read() {
|
||||||
matched_idx = 0;
|
|
||||||
|
|
||||||
// Find Content-Length header prefix
|
// Find Content-Length header prefix
|
||||||
if (!scan("Content-Length:")) {
|
if (!scan("Content-Length:")) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip whitespace and tabs
|
// Skip whitespace and tabs
|
||||||
while (matchAny(" \t")) {
|
while (matchAny(" \t")) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse length
|
// Parse length
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -72,16 +68,10 @@ std::string ContentReader::read() {
|
|||||||
if (!match("\r\n\r\n")) {
|
if (!match("\r\n\r\n")) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read message
|
// Read message
|
||||||
if (!buffer(len + matched_idx)) {
|
if (!buffer(len)) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < matched_idx; i++) {
|
|
||||||
buf.pop_front();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string out;
|
std::string out;
|
||||||
out.reserve(len);
|
out.reserve(len);
|
||||||
for (size_t i = 0; i < len; i++) {
|
for (size_t i = 0; i < len; i++) {
|
||||||
@ -107,17 +97,18 @@ bool ContentReader::scan(const char* str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ContentReader::match(const uint8_t* seq, size_t len) {
|
bool ContentReader::match(const uint8_t* seq, size_t len) {
|
||||||
if (!buffer(len + matched_idx)) {
|
if (!buffer(len)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto it = matched_idx;
|
auto it = buf.begin();
|
||||||
for (size_t i = 0; i < len; i++, it++) {
|
for (size_t i = 0; i < len; i++, it++) {
|
||||||
if (buf[it] != seq[i]) {
|
if (*it != seq[i]) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
matched_idx += len;
|
buf.pop_front();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,12 +118,12 @@ bool ContentReader::match(const char* str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
char ContentReader::matchAny(const char* chars) {
|
char ContentReader::matchAny(const char* chars) {
|
||||||
if (!buffer(1 + matched_idx)) {
|
if (!buffer(1)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int c = buf[matched_idx];
|
int c = buf.front();
|
||||||
if (auto p = strchr(chars, c)) {
|
if (auto p = strchr(chars, c)) {
|
||||||
matched_idx++;
|
buf.pop_front();
|
||||||
return *p;
|
return *p;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -47,7 +47,6 @@ class ContentReader {
|
|||||||
|
|
||||||
std::shared_ptr<Reader> reader;
|
std::shared_ptr<Reader> reader;
|
||||||
std::deque<uint8_t> buf;
|
std::deque<uint8_t> buf;
|
||||||
uint32_t matched_idx = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class ContentWriter {
|
class ContentWriter {
|
||||||
|
@ -81,19 +81,3 @@ TEST(ContentStreamTest, ShortRead) {
|
|||||||
ASSERT_EQ(cs.read(), "Content payload number three");
|
ASSERT_EQ(cs.read(), "Content payload number three");
|
||||||
ASSERT_EQ(cs.read(), "");
|
ASSERT_EQ(cs.read(), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ContentStreamTest, PartialReadAndParse) {
|
|
||||||
auto sb = std::make_shared<dap::StringBuffer>();
|
|
||||||
dap::ContentReader cs(sb);
|
|
||||||
sb->write("Content");
|
|
||||||
ASSERT_EQ(cs.read(), "");
|
|
||||||
sb->write("-Length: ");
|
|
||||||
ASSERT_EQ(cs.read(), "");
|
|
||||||
sb->write("26");
|
|
||||||
ASSERT_EQ(cs.read(), "");
|
|
||||||
sb->write("\r\n\r\n");
|
|
||||||
ASSERT_EQ(cs.read(), "");
|
|
||||||
sb->write("Content payload number one");
|
|
||||||
ASSERT_EQ(cs.read(), "Content payload number one");
|
|
||||||
ASSERT_EQ(cs.read(), "");
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user