diff --git a/include/TessesFramework/TextStreams/TextReader.hpp b/include/TessesFramework/TextStreams/TextReader.hpp index a57c86b..1f7436e 100644 --- a/include/TessesFramework/TextStreams/TextReader.hpp +++ b/include/TessesFramework/TextStreams/TextReader.hpp @@ -5,12 +5,14 @@ namespace Tesses::Framework::TextStreams { class TextReader { + bool eof=false; public: virtual bool Rewind(); virtual bool ReadBlock(std::string& str,size_t sz)=0; int32_t ReadChar(); std::string ReadLine(); bool ReadLine(std::string& str); + bool ReadLineHttp(std::string& str); void ReadAllLines(std::vector& lines); std::string ReadToEnd(); void ReadToEnd(std::string& str); diff --git a/src/Http/CGIServer.cpp b/src/Http/CGIServer.cpp index 8a6fff6..ce90cfd 100644 --- a/src/Http/CGIServer.cpp +++ b/src/Http/CGIServer.cpp @@ -104,7 +104,7 @@ namespace Tesses::Framework::Http { auto stout = p.GetStdoutStream(); Tesses::Framework::TextStreams::StreamReader reader(stout); std::string line; - while(reader.ReadLine(line)) + while(reader.ReadLineHttp(line)) { auto v = HttpUtils::SplitString(line,": ", 2); if(v.size() == 2) diff --git a/src/Http/HttpClient.cpp b/src/Http/HttpClient.cpp index 2adc3d4..31e3b37 100644 --- a/src/Http/HttpClient.cpp +++ b/src/Http/HttpClient.cpp @@ -159,7 +159,7 @@ namespace Tesses::Framework::Http this->handleStrm=nullptr; StreamReader reader(strm); std::string statusLine; - if(!reader.ReadLine(statusLine)) return; + if(!reader.ReadLineHttp(statusLine)) return; auto statusLinesPart = HttpUtils::SplitString(statusLine," ",3); if(statusLinesPart.size() >= 2) { @@ -167,7 +167,7 @@ namespace Tesses::Framework::Http this->statusCode = (StatusCode)std::stoi(statusLinesPart[1]); } std::string line; - while(reader.ReadLine(line)) + while(reader.ReadLineHttp(line)) { if(line.empty()) break; auto v = HttpUtils::SplitString(line,": ", 2); @@ -225,7 +225,7 @@ namespace Tesses::Framework::Http StreamReader reader(strm); std::string statusLine; - if(!reader.ReadLine(statusLine)) break; + if(!reader.ReadLineHttp(statusLine)) break; auto statusLinesPart = HttpUtils::SplitString(statusLine," ",3); if(statusLinesPart.size() >= 2) { @@ -233,7 +233,7 @@ namespace Tesses::Framework::Http this->statusCode = (StatusCode)std::stoi(statusLinesPart[1]); } std::string line; - while(reader.ReadLine(line)) + while(reader.ReadLineHttp(line)) { if(line.empty()) break; auto v = HttpUtils::SplitString(line,": ", 2); diff --git a/src/Http/HttpServer.cpp b/src/Http/HttpServer.cpp index 5481ea0..c5dd53b 100644 --- a/src/Http/HttpServer.cpp +++ b/src/Http/HttpServer.cpp @@ -468,7 +468,7 @@ namespace Tesses::Framework::Http HttpDictionary req; StreamReader reader(ctx->GetStream()); std::string line; - while(reader.ReadLine(line)) + while(reader.ReadLineHttp(line)) { auto v = HttpUtils::SplitString(line,": ", 2); if(v.size() == 2) @@ -944,7 +944,7 @@ namespace Tesses::Framework::Http try{ bool firstLine = true; std::string line; - while(reader.ReadLine(line)) + while(reader.ReadLineHttp(line)) { if(firstLine) { diff --git a/src/TextStreams/TextReader.cpp b/src/TextStreams/TextReader.cpp index 2695511..d528d6b 100644 --- a/src/TextStreams/TextReader.cpp +++ b/src/TextStreams/TextReader.cpp @@ -10,7 +10,7 @@ namespace Tesses::Framework::TextStreams { std::string txt; this->ReadBlock(txt,1); - if(txt.empty()) return -1; + if(txt.empty()) { eof=true; return -1;} return (uint8_t)txt[0]; } std::string TextReader::ReadLine() @@ -19,13 +19,14 @@ namespace Tesses::Framework::TextStreams ReadLine(str); return str; } - bool TextReader::ReadLine(std::string& str) + bool TextReader::ReadLineHttp(std::string& str) { + if(eof) return false; bool ret = false; int32_t r = -1; do { r = ReadChar(); - if(r == -1) break; + if(r == -1) {break;} if(r == '\r') continue; if(r == '\n') break; str.push_back((char)(uint8_t)r); @@ -33,8 +34,25 @@ namespace Tesses::Framework::TextStreams } while(r != -1); return ret; } + bool TextReader::ReadLine(std::string& str) + { + + if(eof) return false; + bool ret = false; + int32_t r = -1; + do { + r = ReadChar(); + if(r == -1) break; + if(r == '\r') continue; + if(r == '\n') return true; + str.push_back((char)(uint8_t)r); + ret = true; + } while(r != -1); + return ret; + } void TextReader::ReadAllLines(std::vector& lines) { + if(eof) return; int32_t r = -1; std::string builder; do { @@ -60,10 +78,14 @@ namespace Tesses::Framework::TextStreams void TextReader::ReadToEnd(std::string& str) { + + if(eof) return; while(ReadBlock(str,1024)); } void TextReader::CopyTo(TextWriter& writer, size_t buffSz) { + + if(eof) return; std::string str = {}; while(ReadBlock(str,buffSz)) {