diff options
author | Roland Reichwein <mail@reichwein.it> | 2020-05-09 18:12:28 +0200 |
---|---|---|
committer | Roland Reichwein <mail@reichwein.it> | 2020-05-09 18:12:28 +0200 |
commit | 05213d6f1d8e946e717dee948bd14b6ef3876827 (patch) | |
tree | c55f16f937e34d9de933dd6ce8cda0f62c2e8bff | |
parent | 91f78915fed4b1a3706c4d08a9b0c2c458cb0a2e (diff) |
Improve socket read handling
-rw-r--r-- | plugins/fcgi/fcgi.cpp | 13 | ||||
-rw-r--r-- | plugins/fcgi/socket.cpp | 23 |
2 files changed, 27 insertions, 9 deletions
diff --git a/plugins/fcgi/fcgi.cpp b/plugins/fcgi/fcgi.cpp index bb0a8b4..d19916c 100644 --- a/plugins/fcgi/fcgi.cpp +++ b/plugins/fcgi/fcgi.cpp @@ -407,7 +407,7 @@ std::string fcgi_plugin::fcgiQuery(FCGIContext& context) FCGI_Record stdin_{FCGI_STDIN, id, body}; if (socket->write(stdin_.getBuffer()) != stdin_.getBuffer().size()) std::cerr << "Warning: Not all bytes written 6" << std::endl; - + if (body.size()) { FCGI_Record stdin_end{FCGI_STDIN, id, std::string{}}; if (socket->write(stdin_end.getBuffer()) != stdin_end.getBuffer().size()) @@ -424,15 +424,14 @@ std::string fcgi_plugin::fcgiQuery(FCGIContext& context) std::cerr << "Warning: Not all bytes written 8" << std::endl; #endif - bool ended{false}; std::vector<char> inbuf; - std::vector<char> inbuf_part(1024); + + bool ended{false}; while (!ended) { try { - size_t got {socket->read(inbuf_part)}; - inbuf.insert(inbuf.end(), inbuf_part.begin(), inbuf_part.begin() + got); + socket->read(inbuf); } catch (const fcgi_eof_error&) { - //std::cerr << "FCGI Warning: Early EOF" << std::endl; // seems to be ok here + std::cerr << "FCGI Warning: Early EOF" << std::endl; // seems to be ok here ended = true; //return HttpStatus("500", "FCGI connection: EOF on read", context.SetResponseHeader); } @@ -453,7 +452,7 @@ std::string fcgi_plugin::fcgiQuery(FCGIContext& context) } else throw std::runtime_error("Unhandled FCGI type: "s + std::to_string(r.getType())); } catch (const std::length_error& ex) { - // ignore if not enough data available yet + // ignore FCGI_Record construction if not enough data available for full record yet break; } } diff --git a/plugins/fcgi/socket.cpp b/plugins/fcgi/socket.cpp index 228964c..5402cfb 100644 --- a/plugins/fcgi/socket.cpp +++ b/plugins/fcgi/socket.cpp @@ -106,7 +106,17 @@ size_t TCPSocket::write(const std::vector<char>& data) size_t TCPSocket::read(std::vector<char>& data) { try { - return m_socket.read_some(boost::asio::buffer(data)); + size_t result{0}; + + while (m_socket.available()) { + std::vector<char> inbuf_part(1024); + size_t got { m_socket.read_some(boost::asio::buffer(inbuf_part))}; + data.insert(data.end(), inbuf_part.begin(), inbuf_part.begin() + got); + result += got; + } + + return result; + } catch (const boost::system::system_error& ex) { if (ex.code() == boost::asio::error::eof) { throw fcgi_eof_error("EOF on read"); @@ -165,7 +175,16 @@ size_t FileSocket::write(const std::vector<char>& data) size_t FileSocket::read(std::vector<char>& data) { try { - return m_socket.read_some(boost::asio::buffer(data)); + size_t result{0}; + + while (m_socket.available()) { + std::vector<char> inbuf_part(1024); + size_t got { m_socket.read_some(boost::asio::buffer(inbuf_part))}; + data.insert(data.end(), inbuf_part.begin(), inbuf_part.begin() + got); + result += got; + } + + return result; } catch (const boost::system::system_error& ex) { if (ex.code() == boost::asio::error::eof) { throw fcgi_eof_error("EOF on read"); |