diff --git a/src/oatpp/core/data/stream/ChunkedBuffer.cpp b/src/oatpp/core/data/stream/ChunkedBuffer.cpp index 8cf3affc..01ec0fd8 100644 --- a/src/oatpp/core/data/stream/ChunkedBuffer.cpp +++ b/src/oatpp/core/data/stream/ChunkedBuffer.cpp @@ -143,10 +143,19 @@ data::v_io_size ChunkedBuffer::write(const void *data, data::v_io_size count){ return count; } + +void ChunkedBuffer::setOutputStreamIOMode(IOMode ioMode) { + m_ioMode = ioMode; +} + +IOMode ChunkedBuffer::getOutputStreamIOMode() { + return m_ioMode; +} data::v_io_size ChunkedBuffer::readSubstring(void *buffer, - data::v_io_size pos, - data::v_io_size count) { + data::v_io_size pos, + data::v_io_size count) +{ if(pos < 0 || pos >= m_size){ return 0; diff --git a/src/oatpp/core/data/stream/ChunkedBuffer.hpp b/src/oatpp/core/data/stream/ChunkedBuffer.hpp index b0d8b7a7..259074ed 100644 --- a/src/oatpp/core/data/stream/ChunkedBuffer.hpp +++ b/src/oatpp/core/data/stream/ChunkedBuffer.hpp @@ -106,6 +106,7 @@ private: data::v_io_size m_chunkPos; ChunkEntry* m_firstEntry; ChunkEntry* m_lastEntry; + IOMode m_ioMode; private: @@ -166,6 +167,18 @@ public: */ data::v_io_size write(const void *data, data::v_io_size count) override; + /** + * Set stream I/O mode. + * @param ioMode + */ + void setOutputStreamIOMode(IOMode ioMode) override; + + /** + * Set stream I/O mode. + * @return + */ + IOMode getOutputStreamIOMode() override; + /** * Read part of ChunkedBuffer to buffer. * @param buffer - buffer to write data to. diff --git a/src/oatpp/core/data/stream/Stream.hpp b/src/oatpp/core/data/stream/Stream.hpp index 0301ea69..2bc65e21 100644 --- a/src/oatpp/core/data/stream/Stream.hpp +++ b/src/oatpp/core/data/stream/Stream.hpp @@ -32,6 +32,11 @@ namespace oatpp { namespace data{ namespace stream { +enum IOMode : v_int32 { + BLOCKING = 0, + NON_BLOCKING = 1 +}; + /** * Output Stream. */ @@ -52,6 +57,18 @@ public: */ virtual data::v_io_size write(const void *data, data::v_io_size count) = 0; + /** + * Set stream I/O mode. + * @throws + */ + virtual void setOutputStreamIOMode(IOMode ioMode) = 0; + + /** + * Get stream I/O mode. + * @return + */ + virtual IOMode getOutputStreamIOMode() = 0; + /** * Same as `write((p_char8)data, std::strlen(data));`. * @param data - data to write. @@ -100,6 +117,19 @@ public: * @return - actual number of bytes read. */ virtual data::v_io_size read(void *data, data::v_io_size count) = 0; + + /** + * Set stream I/O mode. + * @throws + */ + virtual void setInputStreamIOMode(IOMode ioMode) = 0; + + /** + * Get stream I/O mode. + * @return + */ + virtual IOMode getInputStreamIOMode() = 0; + }; /** @@ -126,7 +156,7 @@ public: public: static std::shared_ptr createShared(const std::shared_ptr& outputStream, - const std::shared_ptr& inputStream){ + const std::shared_ptr& inputStream){ return Shared_CompoundIOStream_Pool::allocateShared(outputStream, inputStream); } @@ -137,6 +167,22 @@ public: data::v_io_size read(void *data, data::v_io_size count) override { return m_inputStream->read(data, count); } + + void setOutputStreamIOMode(IOMode ioMode) override { + m_outputStream->setOutputStreamIOMode(ioMode); + } + + IOMode getOutputStreamIOMode() override { + return m_outputStream->getOutputStreamIOMode(); + } + + void setInputStreamIOMode(IOMode ioMode) override { + m_inputStream->setInputStreamIOMode(ioMode); + } + + IOMode getInputStreamIOMode() override { + return m_inputStream->getInputStreamIOMode(); + } }; @@ -180,7 +226,7 @@ public: * @return - actual number of bytes written. &id:oatpp::data::v_io_size;.
*/ data::v_io_size writeAsString(bool value); - + }; ConsistentOutputStream& operator << (ConsistentOutputStream& s, const oatpp::String& str); diff --git a/src/oatpp/core/data/stream/StreamBufferedProxy.cpp b/src/oatpp/core/data/stream/StreamBufferedProxy.cpp index 9497e33a..8b855d05 100644 --- a/src/oatpp/core/data/stream/StreamBufferedProxy.cpp +++ b/src/oatpp/core/data/stream/StreamBufferedProxy.cpp @@ -38,6 +38,14 @@ data::v_io_size OutputStreamBufferedProxy::write(const void *data, data::v_io_si } } +void OutputStreamBufferedProxy::setOutputStreamIOMode(oatpp::data::stream::IOMode ioMode) { + m_outputStream->setOutputStreamIOMode(ioMode); +} + +oatpp::data::stream::IOMode OutputStreamBufferedProxy::getOutputStreamIOMode() { + return m_outputStream->getOutputStreamIOMode(); +} + data::v_io_size OutputStreamBufferedProxy::flush() { return m_buffer->flushToStream(*m_outputStream); } @@ -59,5 +67,13 @@ data::v_io_size InputStreamBufferedProxy::read(void *data, data::v_io_size count } } + +void InputStreamBufferedProxy::setInputStreamIOMode(oatpp::data::stream::IOMode ioMode) { + m_inputStream->setInputStreamIOMode(ioMode); +} + +oatpp::data::stream::IOMode InputStreamBufferedProxy::getInputStreamIOMode() { + return m_inputStream->getInputStreamIOMode(); +} }}} diff --git a/src/oatpp/core/data/stream/StreamBufferedProxy.hpp b/src/oatpp/core/data/stream/StreamBufferedProxy.hpp index 0ceeb320..9075fa75 100644 --- a/src/oatpp/core/data/stream/StreamBufferedProxy.hpp +++ b/src/oatpp/core/data/stream/StreamBufferedProxy.hpp @@ -73,6 +73,19 @@ public: } data::v_io_size write(const void *data, data::v_io_size count) override; + + /** + * Set OutputStream I/O mode. + * @param ioMode + */ + void setOutputStreamIOMode(oatpp::data::stream::IOMode ioMode) override; + + /** + * Set OutputStream I/O mode. + * @return + */ + oatpp::data::stream::IOMode getOutputStreamIOMode() override; + data::v_io_size flush(); oatpp::async::CoroutineStarter flushAsync(); @@ -160,6 +173,18 @@ public: data::v_io_size read(void *data, data::v_io_size count) override; + /** + * Set InputStream I/O mode. + * @param ioMode + */ + void setInputStreamIOMode(oatpp::data::stream::IOMode ioMode) override; + + /** + * Get InputStream I/O mode. + * @return + */ + oatpp::data::stream::IOMode getInputStreamIOMode() override; + void setBufferPosition(data::v_io_size readPosition, data::v_io_size writePosition, bool canRead) { m_buffer.setBufferPosition(readPosition, writePosition, canRead); } diff --git a/src/oatpp/network/Connection.cpp b/src/oatpp/network/Connection.cpp index 753de3f8..989fc603 100644 --- a/src/oatpp/network/Connection.cpp +++ b/src/oatpp/network/Connection.cpp @@ -28,6 +28,7 @@ #include #include #include +#include namespace oatpp { namespace network { @@ -83,6 +84,63 @@ data::v_io_size Connection::read(void *buff, data::v_io_size count){ return result; } +void Connection::setStreamIOMode(oatpp::data::stream::IOMode ioMode) { + + auto flags = fcntl(m_handle, F_GETFL); + if (flags < 0) { + throw std::runtime_error("[oatpp::network::Connection::setStreamIOMode()]: Error. Can't get socket flags."); + } + + switch(ioMode) { + + case oatpp::data::stream::IOMode::BLOCKING: + flags = flags & (~O_NONBLOCK); + if (fcntl(m_handle, F_SETFL, flags) < 0) { + throw std::runtime_error("[oatpp::network::Connection::setStreamIOMode()]: Error. Can't set stream I/O mode to IOMode::BLOCKING."); + } + break; + + case oatpp::data::stream::IOMode::NON_BLOCKING: + flags = (flags | O_NONBLOCK); + if (fcntl(m_handle, F_SETFL, flags) < 0) { + throw std::runtime_error("[oatpp::network::Connection::setStreamIOMode()]: Error. Can't set stream I/O mode to IOMode::NON_BLOCKING."); + } + break; + + } +} + +oatpp::data::stream::IOMode Connection::getStreamIOMode() { + + auto flags = fcntl(m_handle, F_GETFL); + if (flags < 0) { + throw std::runtime_error("[oatpp::network::Connection::getStreamIOMode()]: Error. Can't get socket flags."); + } + + if((flags & O_NONBLOCK) > 0) { + return oatpp::data::stream::IOMode::NON_BLOCKING; + } + + return oatpp::data::stream::IOMode::BLOCKING; + +} + +void Connection::setOutputStreamIOMode(oatpp::data::stream::IOMode ioMode) { + setStreamIOMode(ioMode); +} + +oatpp::data::stream::IOMode Connection::getOutputStreamIOMode() { + return getStreamIOMode(); +} + +void Connection::setInputStreamIOMode(oatpp::data::stream::IOMode ioMode) { + setStreamIOMode(ioMode); +} + +oatpp::data::stream::IOMode Connection::getInputStreamIOMode() { + return getStreamIOMode(); +} + void Connection::close(){ ::close(m_handle); } diff --git a/src/oatpp/network/Connection.hpp b/src/oatpp/network/Connection.hpp index 0f0798bc..84622fa7 100644 --- a/src/oatpp/network/Connection.hpp +++ b/src/oatpp/network/Connection.hpp @@ -39,6 +39,9 @@ public: SHARED_OBJECT_POOL(Shared_Connection_Pool, Connection, 32); private: data::v_io_handle m_handle; +private: + void setStreamIOMode(oatpp::data::stream::IOMode ioMode); + oatpp::data::stream::IOMode getStreamIOMode(); public: /** * Constructor. @@ -78,6 +81,30 @@ public: */ data::v_io_size read(void *buff, data::v_io_size count) override; + /** + * Set OutputStream I/O mode. + * @param ioMode + */ + void setOutputStreamIOMode(oatpp::data::stream::IOMode ioMode) override; + + /** + * Set OutputStream I/O mode. + * @return + */ + oatpp::data::stream::IOMode getOutputStreamIOMode() override; + + /** + * Set InputStream I/O mode. + * @param ioMode + */ + void setInputStreamIOMode(oatpp::data::stream::IOMode ioMode) override; + + /** + * Get InputStream I/O mode. + * @return + */ + oatpp::data::stream::IOMode getInputStreamIOMode() override; + /** * Close socket handle. */ diff --git a/src/oatpp/network/server/SimpleTCPConnectionProvider.cpp b/src/oatpp/network/server/SimpleTCPConnectionProvider.cpp index 249dad36..388b0443 100644 --- a/src/oatpp/network/server/SimpleTCPConnectionProvider.cpp +++ b/src/oatpp/network/server/SimpleTCPConnectionProvider.cpp @@ -37,9 +37,8 @@ namespace oatpp { namespace network { namespace server { -SimpleTCPConnectionProvider::SimpleTCPConnectionProvider(v_word16 port, bool nonBlocking) +SimpleTCPConnectionProvider::SimpleTCPConnectionProvider(v_word16 port) : m_port(port) - , m_nonBlocking(nonBlocking) , m_closed(false) { m_serverHandle = instantiateServer(); @@ -125,13 +124,6 @@ std::shared_ptr SimpleTCPConnectionProvider::getC } #endif - int flags = 0; - if(m_nonBlocking) { - flags |= O_NONBLOCK; - } - - fcntl(handle, F_SETFL, flags); - return Connection::createShared(handle); } diff --git a/src/oatpp/network/server/SimpleTCPConnectionProvider.hpp b/src/oatpp/network/server/SimpleTCPConnectionProvider.hpp index 63bf519c..26863ecc 100644 --- a/src/oatpp/network/server/SimpleTCPConnectionProvider.hpp +++ b/src/oatpp/network/server/SimpleTCPConnectionProvider.hpp @@ -38,29 +38,28 @@ namespace oatpp { namespace network { namespace server { class SimpleTCPConnectionProvider : public base::Countable, public ServerConnectionProvider { private: v_word16 m_port; - bool m_nonBlocking; bool m_closed; oatpp::data::v_io_handle m_serverHandle; private: oatpp::data::v_io_handle instantiateServer(); public: + /** * Constructor. * @param port - port to listen for incoming connections. - * @param nonBlocking - set `true` to provide non-blocking &id:oatpp::data::stream::IOStream; for connection. - * `false` for blocking &id:oatpp::data::stream::IOStream;. Default `false`. + * @param port */ - SimpleTCPConnectionProvider(v_word16 port, bool nonBlocking = false); + SimpleTCPConnectionProvider(v_word16 port); public: /** * Create shared SimpleTCPConnectionProvider. * @param port - port to listen for incoming connections. - * @param nonBlocking - set `true` to provide non-blocking &id:oatpp::data::stream::IOStream; for connection. - * `false` for blocking &id:oatpp::data::stream::IOStream;. Default `false`. + * @param port + * @return - `std::shared_ptr` to SimpleTCPConnectionProvider. */ - static std::shared_ptr createShared(v_word16 port, bool nonBlocking = false){ - return std::make_shared(port, nonBlocking); + static std::shared_ptr createShared(v_word16 port){ + return std::make_shared(port); } /** diff --git a/src/oatpp/network/virtual_/Pipe.cpp b/src/oatpp/network/virtual_/Pipe.cpp index 70877ee9..451f74f6 100644 --- a/src/oatpp/network/virtual_/Pipe.cpp +++ b/src/oatpp/network/virtual_/Pipe.cpp @@ -25,7 +25,15 @@ #include "Pipe.hpp" namespace oatpp { namespace network { namespace virtual_ { - + +void Pipe::Reader::setInputStreamIOMode(oatpp::data::stream::IOMode ioMode) { + m_ioMode = ioMode; +} + +oatpp::data::stream::IOMode Pipe::Reader::getInputStreamIOMode() { + return m_ioMode; +} + void Pipe::Reader::setMaxAvailableToRead(data::v_io_size maxAvailableToRead) { m_maxAvailableToRead = maxAvailableToRead; } @@ -39,7 +47,7 @@ data::v_io_size Pipe::Reader::read(void *data, data::v_io_size count) { Pipe& pipe = *m_pipe; oatpp::data::v_io_size result; - if(m_nonBlocking) { + if(m_ioMode == oatpp::data::stream::IOMode::NON_BLOCKING) { std::unique_lock lock(pipe.m_mutex, std::try_to_lock); if(lock.owns_lock()) { if (pipe.m_fifo.availableToRead() > 0) { @@ -70,6 +78,15 @@ data::v_io_size Pipe::Reader::read(void *data, data::v_io_size count) { } + +void Pipe::Writer::setOutputStreamIOMode(oatpp::data::stream::IOMode ioMode) { + m_ioMode = ioMode; +} + +oatpp::data::stream::IOMode Pipe::Writer::getOutputStreamIOMode() { + return m_ioMode; +} + void Pipe::Writer::setMaxAvailableToWrite(data::v_io_size maxAvailableToWrite) { m_maxAvailableToWrtie = maxAvailableToWrite; } @@ -83,7 +100,7 @@ data::v_io_size Pipe::Writer::write(const void *data, data::v_io_size count) { Pipe& pipe = *m_pipe; oatpp::data::v_io_size result; - if(m_nonBlocking) { + if(m_ioMode == oatpp::data::stream::IOMode::NON_BLOCKING) { std::unique_lock lock(pipe.m_mutex, std::try_to_lock); if(lock.owns_lock()) { if (pipe.m_fifo.availableToWrite() > 0) { diff --git a/src/oatpp/network/virtual_/Pipe.hpp b/src/oatpp/network/virtual_/Pipe.hpp index 1e83a3e2..7806482e 100644 --- a/src/oatpp/network/virtual_/Pipe.hpp +++ b/src/oatpp/network/virtual_/Pipe.hpp @@ -52,7 +52,7 @@ public: friend Pipe; private: Pipe* m_pipe; - bool m_nonBlocking; + oatpp::data::stream::IOMode m_ioMode; /* * this one used for testing purposes only @@ -60,22 +60,14 @@ public: data::v_io_size m_maxAvailableToRead; protected: - Reader(Pipe* pipe, bool nonBlocking = false) + Reader(Pipe* pipe, oatpp::data::stream::IOMode ioMode = oatpp::data::stream::IOMode::BLOCKING) : m_pipe(pipe) - , m_nonBlocking(nonBlocking) + , m_ioMode(ioMode) , m_maxAvailableToRead(-1) {} public: - /** - * Set `true` to make non-blocking reads using &l:Pipe::Reader::read ();. - * @param nonBlocking - `true` for nonblocking read. - */ - void setNonBlocking(bool nonBlocking) { - m_nonBlocking = nonBlocking; - } - /** * Limit the available amount of bytes to read from pipe.
* This method is used for testing purposes only.
@@ -92,6 +84,18 @@ public: * @return - &id:oatpp::data::v_io_size;. */ data::v_io_size read(void *data, data::v_io_size count) override; + + /** + * Set InputStream I/O mode. + * @param ioMode + */ + void setInputStreamIOMode(oatpp::data::stream::IOMode ioMode) override; + + /** + * Get InputStream I/O mode. + * @return + */ + oatpp::data::stream::IOMode getInputStreamIOMode() override; }; @@ -103,7 +107,7 @@ public: friend Pipe; private: Pipe* m_pipe; - bool m_nonBlocking; + oatpp::data::stream::IOMode m_ioMode; /* * this one used for testing purposes only @@ -111,22 +115,14 @@ public: data::v_io_size m_maxAvailableToWrtie; protected: - Writer(Pipe* pipe, bool nonBlocking = false) + Writer(Pipe* pipe, oatpp::data::stream::IOMode ioMode = oatpp::data::stream::IOMode::BLOCKING) : m_pipe(pipe) - , m_nonBlocking(nonBlocking) + , m_ioMode(ioMode) , m_maxAvailableToWrtie(-1) {} public: - /** - * Set `true` to make non-blocking writes using &l:Pipe::Writer::write ();. - * @param nonBlocking - `true` for nonblocking write. - */ - void setNonBlocking(bool nonBlocking) { - m_nonBlocking = nonBlocking; - } - /** * Limit the available space for data writes in pipe.
* This method is used for testing purposes only.
@@ -143,6 +139,18 @@ public: * @return - &id:oatpp::data::v_io_size;. */ data::v_io_size write(const void *data, data::v_io_size count) override; + + /** + * Set OutputStream I/O mode. + * @param ioMode + */ + void setOutputStreamIOMode(oatpp::data::stream::IOMode ioMode) override; + + /** + * Set OutputStream I/O mode. + * @return + */ + oatpp::data::stream::IOMode getOutputStreamIOMode() override; }; diff --git a/src/oatpp/network/virtual_/Socket.cpp b/src/oatpp/network/virtual_/Socket.cpp index a0d5dd94..4f7ce1ac 100644 --- a/src/oatpp/network/virtual_/Socket.cpp +++ b/src/oatpp/network/virtual_/Socket.cpp @@ -52,9 +52,20 @@ data::v_io_size Socket::write(const void *data, data::v_io_size count) { return m_pipeOut->getWriter()->write(data, count); } -void Socket::setNonBlocking(bool nonBlocking) { - m_pipeIn->getReader()->setNonBlocking(nonBlocking); - m_pipeOut->getWriter()->setNonBlocking(nonBlocking); +void Socket::setOutputStreamIOMode(oatpp::data::stream::IOMode ioMode) { + m_pipeOut->getWriter()->setOutputStreamIOMode(ioMode); +} + +oatpp::data::stream::IOMode Socket::getOutputStreamIOMode() { + return m_pipeOut->getWriter()->getOutputStreamIOMode(); +} + +void Socket::setInputStreamIOMode(oatpp::data::stream::IOMode ioMode) { + m_pipeIn->getReader()->setInputStreamIOMode(ioMode); +} + +oatpp::data::stream::IOMode Socket::getInputStreamIOMode() { + return m_pipeIn->getReader()->getInputStreamIOMode(); } void Socket::close() { diff --git a/src/oatpp/network/virtual_/Socket.hpp b/src/oatpp/network/virtual_/Socket.hpp index 39c8a09f..346b4f22 100644 --- a/src/oatpp/network/virtual_/Socket.hpp +++ b/src/oatpp/network/virtual_/Socket.hpp @@ -85,10 +85,28 @@ public: data::v_io_size write(const void *data, data::v_io_size count) override; /** - * Set socket for nonblocking I/O. - * @param nonBlocking - `true` for nonblocking. + * Set OutputStream I/O mode. + * @param ioMode */ - void setNonBlocking(bool nonBlocking); + void setOutputStreamIOMode(oatpp::data::stream::IOMode ioMode) override; + + /** + * Set OutputStream I/O mode. + * @return + */ + oatpp::data::stream::IOMode getOutputStreamIOMode() override; + + /** + * Set InputStream I/O mode. + * @param ioMode + */ + void setInputStreamIOMode(oatpp::data::stream::IOMode ioMode) override; + + /** + * Get InputStream I/O mode. + * @return + */ + oatpp::data::stream::IOMode getInputStreamIOMode() override; /** * Close socket pipes. diff --git a/src/oatpp/network/virtual_/client/ConnectionProvider.cpp b/src/oatpp/network/virtual_/client/ConnectionProvider.cpp index 62090b98..eb1dc45b 100644 --- a/src/oatpp/network/virtual_/client/ConnectionProvider.cpp +++ b/src/oatpp/network/virtual_/client/ConnectionProvider.cpp @@ -46,7 +46,8 @@ void ConnectionProvider::close() { std::shared_ptr ConnectionProvider::getConnection() { auto submission = m_interface->connect(); auto socket = submission->getSocket(); - socket->setNonBlocking(false); + socket->setOutputStreamIOMode(oatpp::data::stream::IOMode::BLOCKING); + socket->setInputStreamIOMode(oatpp::data::stream::IOMode::BLOCKING); socket->setMaxAvailableToReadWrtie(m_maxAvailableToRead, m_maxAvailableToWrite); return socket; } @@ -84,7 +85,8 @@ oatpp::async::CoroutineStarterForResultgetSocketNonBlocking(); if(socket) { - socket->setNonBlocking(true); + socket->setOutputStreamIOMode(oatpp::data::stream::IOMode::NON_BLOCKING); + socket->setInputStreamIOMode(oatpp::data::stream::IOMode::NON_BLOCKING); socket->setMaxAvailableToReadWrtie(m_maxAvailableToRead, m_maxAvailableToWrite); return _return(socket); } diff --git a/src/oatpp/network/virtual_/server/ConnectionProvider.cpp b/src/oatpp/network/virtual_/server/ConnectionProvider.cpp index 0a0745cc..a273f786 100644 --- a/src/oatpp/network/virtual_/server/ConnectionProvider.cpp +++ b/src/oatpp/network/virtual_/server/ConnectionProvider.cpp @@ -26,9 +26,8 @@ namespace oatpp { namespace network { namespace virtual_ { namespace server { -ConnectionProvider::ConnectionProvider(const std::shared_ptr& interface, bool nonBlocking) +ConnectionProvider::ConnectionProvider(const std::shared_ptr& interface) : m_interface(interface) - , m_nonBlocking(nonBlocking) , m_open(true) , m_maxAvailableToRead(-1) , m_maxAvailableToWrite(-1) @@ -37,8 +36,8 @@ ConnectionProvider::ConnectionProvider(const std::shared_ptr ConnectionProvider::createShared(const std::shared_ptr& interface, bool nonBlocking) { - return std::make_shared(interface, nonBlocking); +std::shared_ptr ConnectionProvider::createShared(const std::shared_ptr& interface) { + return std::make_shared(interface); } void ConnectionProvider::setSocketMaxAvailableToReadWrtie(data::v_io_size maxToRead, data::v_io_size maxToWrite) { @@ -54,7 +53,6 @@ void ConnectionProvider::close() { std::shared_ptr ConnectionProvider::getConnection() { auto socket = m_interface->accept(m_open); if(socket) { - socket->setNonBlocking(m_nonBlocking); socket->setMaxAvailableToReadWrtie(m_maxAvailableToRead, m_maxAvailableToWrite); } return socket; diff --git a/src/oatpp/network/virtual_/server/ConnectionProvider.hpp b/src/oatpp/network/virtual_/server/ConnectionProvider.hpp index 7e8e7f50..8cd6f082 100644 --- a/src/oatpp/network/virtual_/server/ConnectionProvider.hpp +++ b/src/oatpp/network/virtual_/server/ConnectionProvider.hpp @@ -38,7 +38,6 @@ namespace oatpp { namespace network { namespace virtual_ { namespace server { class ConnectionProvider : public oatpp::network::ServerConnectionProvider { private: std::shared_ptr m_interface; - bool m_nonBlocking; bool m_open; data::v_io_size m_maxAvailableToRead; data::v_io_size m_maxAvailableToWrite; @@ -47,17 +46,15 @@ public: /** * Constructor. * @param interface - &id:oatpp::network::virtual_::Interface;. - * @param nonBlocking - `true` to set non blocking regime for provided connections. */ - ConnectionProvider(const std::shared_ptr& interface, bool nonBlocking = false); + ConnectionProvider(const std::shared_ptr& interface); /** * Create shared ConnectionProvider. * @param interface - &id:oatpp::network::virtual_::Interface;. - * @param nonBlocking - `true` to set non blocking regime for provided connections. * @return - `std::shared_ptr` to ConnectionProvider. */ - static std::shared_ptr createShared(const std::shared_ptr& interface, bool nonBlocking = false); + static std::shared_ptr createShared(const std::shared_ptr& interface); /** * Limit the available amount of bytes to read from socket and limit the available amount of bytes to write to socket.
diff --git a/src/oatpp/web/server/AsyncHttpConnectionHandler.cpp b/src/oatpp/web/server/AsyncHttpConnectionHandler.cpp index 329976cc..8519ab28 100644 --- a/src/oatpp/web/server/AsyncHttpConnectionHandler.cpp +++ b/src/oatpp/web/server/AsyncHttpConnectionHandler.cpp @@ -66,6 +66,9 @@ void AsyncHttpConnectionHandler::addRequestInterceptor(const std::shared_ptr& connection){ + + connection->setOutputStreamIOMode(oatpp::data::stream::IOMode::NON_BLOCKING); + connection->setInputStreamIOMode(oatpp::data::stream::IOMode::NON_BLOCKING); auto ioBuffer = oatpp::data::buffer::IOBuffer::createShared(); auto outStream = oatpp::data::stream::OutputStreamBufferedProxy::createShared(connection, ioBuffer); diff --git a/src/oatpp/web/server/HttpConnectionHandler.cpp b/src/oatpp/web/server/HttpConnectionHandler.cpp index bfd63f3b..906d825f 100644 --- a/src/oatpp/web/server/HttpConnectionHandler.cpp +++ b/src/oatpp/web/server/HttpConnectionHandler.cpp @@ -111,7 +111,10 @@ void HttpConnectionHandler::addRequestInterceptor(const std::shared_ptr& connection){ - + + connection->setOutputStreamIOMode(oatpp::data::stream::IOMode::BLOCKING); + connection->setInputStreamIOMode(oatpp::data::stream::IOMode::BLOCKING); + /* Create working thread */ std::thread thread(&Task::run, Task(m_router.get(), connection, m_bodyDecoder, m_errorHandler, &m_requestInterceptors)); diff --git a/test/oatpp/AllTestsMain.cpp b/test/oatpp/AllTestsMain.cpp index 11838167..5ecb70f5 100644 --- a/test/oatpp/AllTestsMain.cpp +++ b/test/oatpp/AllTestsMain.cpp @@ -37,6 +37,8 @@ #include #include +#include "oatpp/core/data/stream/Stream.hpp" + #ifdef OATPP_ENABLE_ALL_TESTS_MAIN namespace { @@ -52,10 +54,16 @@ public: }; + + void runTests() { oatpp::base::Environment::printCompilationConfig(); + OATPP_LOGD("test", "osSize=%d", sizeof(oatpp::data::stream::OutputStream)); + OATPP_LOGD("test", "isSize=%d", sizeof(oatpp::data::stream::InputStream)); + +/* OATPP_RUN_TEST(oatpp::test::base::RegRuleTest); OATPP_RUN_TEST(oatpp::test::base::CommandLineArgumentsTest); @@ -81,6 +89,7 @@ void runTests() { OATPP_RUN_TEST(oatpp::test::network::virtual_::InterfaceTest); OATPP_RUN_TEST(oatpp::test::web::server::api::ApiControllerTest); +*/ OATPP_RUN_TEST(oatpp::test::web::FullTest); OATPP_RUN_TEST(oatpp::test::web::FullAsyncTest); diff --git a/test/oatpp/web/FullAsyncClientTest.cpp b/test/oatpp/web/FullAsyncClientTest.cpp index 6eca503b..ffad3049 100644 --- a/test/oatpp/web/FullAsyncClientTest.cpp +++ b/test/oatpp/web/FullAsyncClientTest.cpp @@ -67,10 +67,10 @@ public: OATPP_CREATE_COMPONENT(std::shared_ptr, serverConnectionProvider)([this] { #ifdef OATPP_TEST_USE_PORT - return oatpp::network::server::SimpleTCPConnectionProvider::createShared(OATPP_TEST_USE_PORT, true /* nonBlocking */); + return oatpp::network::server::SimpleTCPConnectionProvider::createShared(OATPP_TEST_USE_PORT); #else OATPP_COMPONENT(std::shared_ptr, interface); - return oatpp::network::virtual_::server::ConnectionProvider::createShared(interface, true /* nonBlocking */); + return oatpp::network::virtual_::server::ConnectionProvider::createShared(interface); #endif }()); diff --git a/test/oatpp/web/FullAsyncTest.cpp b/test/oatpp/web/FullAsyncTest.cpp index 5e48a9e1..a07c9b07 100644 --- a/test/oatpp/web/FullAsyncTest.cpp +++ b/test/oatpp/web/FullAsyncTest.cpp @@ -61,10 +61,10 @@ public: OATPP_CREATE_COMPONENT(std::shared_ptr, serverConnectionProvider)([this] { #ifdef OATPP_TEST_USE_PORT - return oatpp::network::server::SimpleTCPConnectionProvider::createShared(OATPP_TEST_USE_PORT, true /* nonBlocking */); + return oatpp::network::server::SimpleTCPConnectionProvider::createShared(OATPP_TEST_USE_PORT); #else OATPP_COMPONENT(std::shared_ptr, interface); - return oatpp::network::virtual_::server::ConnectionProvider::createShared(interface, true /* nonBlocking */); + return oatpp::network::virtual_::server::ConnectionProvider::createShared(interface); #endif }());