mirror of
https://gitee.com/zyjblog/oatpp.git
synced 2024-12-22 22:16:37 +08:00
os::io::Library class removed
This commit is contained in:
parent
1db5dc2296
commit
c4dfd04505
@ -46,6 +46,7 @@ add_library(oatpp
|
|||||||
oatpp/core/concurrency/SpinLock.hpp
|
oatpp/core/concurrency/SpinLock.hpp
|
||||||
oatpp/core/concurrency/Thread.cpp
|
oatpp/core/concurrency/Thread.cpp
|
||||||
oatpp/core/concurrency/Thread.hpp
|
oatpp/core/concurrency/Thread.hpp
|
||||||
|
oatpp/core/data/IODefinitions.hpp
|
||||||
oatpp/core/data/buffer/FIFOBuffer.cpp
|
oatpp/core/data/buffer/FIFOBuffer.cpp
|
||||||
oatpp/core/data/buffer/FIFOBuffer.hpp
|
oatpp/core/data/buffer/FIFOBuffer.hpp
|
||||||
oatpp/core/data/buffer/IOBuffer.cpp
|
oatpp/core/data/buffer/IOBuffer.cpp
|
||||||
@ -75,8 +76,6 @@ add_library(oatpp
|
|||||||
oatpp/core/macro/basic.hpp
|
oatpp/core/macro/basic.hpp
|
||||||
oatpp/core/macro/codegen.hpp
|
oatpp/core/macro/codegen.hpp
|
||||||
oatpp/core/macro/component.hpp
|
oatpp/core/macro/component.hpp
|
||||||
oatpp/core/os/io/Library.cpp
|
|
||||||
oatpp/core/os/io/Library.hpp
|
|
||||||
oatpp/core/parser/ParsingCaret.cpp
|
oatpp/core/parser/ParsingCaret.cpp
|
||||||
oatpp/core/parser/ParsingCaret.hpp
|
oatpp/core/parser/ParsingCaret.hpp
|
||||||
oatpp/core/utils/ConversionUtils.cpp
|
oatpp/core/utils/ConversionUtils.cpp
|
||||||
|
@ -22,26 +22,50 @@
|
|||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifndef oatpp_os_io_Library_hpp
|
#ifndef oatpp_data_IODefinitions_hpp
|
||||||
#define oatpp_os_io_Library_hpp
|
#define oatpp_data_IODefinitions_hpp
|
||||||
|
|
||||||
#include "oatpp/core/base/Environment.hpp"
|
#include "oatpp/core/Types.hpp"
|
||||||
|
|
||||||
|
namespace oatpp { namespace data {
|
||||||
|
|
||||||
|
typedef int v_io_handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All I/O buffer operations (like read/write(buffer, size)) should return
|
||||||
|
* v_io_size.
|
||||||
|
*
|
||||||
|
* Possible return values:
|
||||||
|
* On Success - [0..max_int64]
|
||||||
|
* On Error - IOError values.
|
||||||
|
*
|
||||||
|
* All other values are considered to be a fatal error.
|
||||||
|
* application should be terminated.
|
||||||
|
*/
|
||||||
|
typedef v_int64 v_io_size;
|
||||||
|
|
||||||
|
enum IOError : v_io_size {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* I/O operation is not possible any more
|
||||||
|
* Client should give up trying and free all related resources
|
||||||
|
*/
|
||||||
|
BROKEN_PIPE = -1001,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* I/O operation was interrupted because of some reason
|
||||||
|
* Client may retry immediately
|
||||||
|
*/
|
||||||
|
RETRY = -1002,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* I/O operation is not currently available due to some reason
|
||||||
|
* Client should wait then retry
|
||||||
|
*/
|
||||||
|
WAIT_RETRY = -1003
|
||||||
|
|
||||||
namespace oatpp { namespace os { namespace io {
|
|
||||||
|
|
||||||
class Library{
|
|
||||||
public:
|
|
||||||
typedef v_int32 v_handle;
|
|
||||||
typedef ssize_t v_size;
|
|
||||||
public:
|
|
||||||
|
|
||||||
static v_int32 handle_close(v_handle handle);
|
|
||||||
|
|
||||||
static v_size handle_read(v_handle handle, void *buf, v_size count);
|
|
||||||
static v_size handle_write(v_handle handle, const void *buf, v_size count);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}}}
|
|
||||||
|
|
||||||
#endif /* oatpp_os_io_Library_hpp */
|
}}
|
||||||
|
|
||||||
|
#endif //oatpp_data_IODefinitions_hpp
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
namespace oatpp { namespace data{ namespace buffer {
|
namespace oatpp { namespace data{ namespace buffer {
|
||||||
|
|
||||||
os::io::Library::v_size FIFOBuffer::availableToRead() {
|
data::v_io_size FIFOBuffer::availableToRead() {
|
||||||
oatpp::concurrency::SpinLock lock(m_atom);
|
oatpp::concurrency::SpinLock lock(m_atom);
|
||||||
if(!m_canRead) {
|
if(!m_canRead) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -37,7 +37,7 @@ os::io::Library::v_size FIFOBuffer::availableToRead() {
|
|||||||
return (IOBuffer::BUFFER_SIZE - m_readPosition + m_writePosition);
|
return (IOBuffer::BUFFER_SIZE - m_readPosition + m_writePosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size FIFOBuffer::availableToWrite() {
|
data::v_io_size FIFOBuffer::availableToWrite() {
|
||||||
oatpp::concurrency::SpinLock lock(m_atom);
|
oatpp::concurrency::SpinLock lock(m_atom);
|
||||||
if(m_canRead && m_writePosition == m_readPosition) {
|
if(m_canRead && m_writePosition == m_readPosition) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -48,7 +48,7 @@ os::io::Library::v_size FIFOBuffer::availableToWrite() {
|
|||||||
return (IOBuffer::BUFFER_SIZE - m_writePosition + m_readPosition);
|
return (IOBuffer::BUFFER_SIZE - m_writePosition + m_readPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size FIFOBuffer::read(void *data, os::io::Library::v_size count) {
|
data::v_io_size FIFOBuffer::read(void *data, data::v_io_size count) {
|
||||||
|
|
||||||
oatpp::concurrency::SpinLock lock(m_atom);
|
oatpp::concurrency::SpinLock lock(m_atom);
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ os::io::Library::v_size FIFOBuffer::read(void *data, os::io::Library::v_size cou
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size FIFOBuffer::write(const void *data, os::io::Library::v_size count) {
|
data::v_io_size FIFOBuffer::write(const void *data, data::v_io_size count) {
|
||||||
|
|
||||||
oatpp::concurrency::SpinLock lock(m_atom);
|
oatpp::concurrency::SpinLock lock(m_atom);
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include "./IOBuffer.hpp"
|
#include "./IOBuffer.hpp"
|
||||||
#include "oatpp/core/concurrency/SpinLock.hpp"
|
#include "oatpp/core/concurrency/SpinLock.hpp"
|
||||||
#include "oatpp/core/os/io/Library.hpp"
|
#include "oatpp/core/data/IODefinitions.hpp"
|
||||||
|
|
||||||
namespace oatpp { namespace data{ namespace buffer {
|
namespace oatpp { namespace data{ namespace buffer {
|
||||||
|
|
||||||
@ -37,8 +37,8 @@ public:
|
|||||||
SHARED_OBJECT_POOL(Shared_FIFOBuffer_Pool, FIFOBuffer, 32)
|
SHARED_OBJECT_POOL(Shared_FIFOBuffer_Pool, FIFOBuffer, 32)
|
||||||
private:
|
private:
|
||||||
bool m_canRead;
|
bool m_canRead;
|
||||||
os::io::Library::v_size m_readPosition;
|
data::v_io_size m_readPosition;
|
||||||
os::io::Library::v_size m_writePosition;
|
data::v_io_size m_writePosition;
|
||||||
IOBuffer m_buffer;
|
IOBuffer m_buffer;
|
||||||
oatpp::concurrency::SpinLock::Atom m_atom;
|
oatpp::concurrency::SpinLock::Atom m_atom;
|
||||||
public:
|
public:
|
||||||
@ -54,13 +54,17 @@ public:
|
|||||||
return Shared_FIFOBuffer_Pool::allocateShared();
|
return Shared_FIFOBuffer_Pool::allocateShared();
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size availableToRead();
|
data::v_io_size availableToRead();
|
||||||
os::io::Library::v_size availableToWrite();
|
data::v_io_size availableToWrite();
|
||||||
|
|
||||||
os::io::Library::v_size read(void *data, os::io::Library::v_size count);
|
data::v_io_size read(void *data, data::v_io_size count);
|
||||||
os::io::Library::v_size write(const void *data, os::io::Library::v_size count);
|
data::v_io_size write(const void *data, data::v_io_size count);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SynchronizedFIFOBuffer : public FIFOBuffer {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
|
@ -30,10 +30,10 @@ const char* ChunkedBuffer::ERROR_ASYNC_FAILED_TO_WRITE_ALL_DATA = "ERROR_ASYNC_F
|
|||||||
|
|
||||||
const char* const ChunkedBuffer::CHUNK_POOL_NAME = "ChunkedBuffer_Chunk_Pool";
|
const char* const ChunkedBuffer::CHUNK_POOL_NAME = "ChunkedBuffer_Chunk_Pool";
|
||||||
|
|
||||||
const os::io::Library::v_size ChunkedBuffer::CHUNK_ENTRY_SIZE_INDEX_SHIFT = 11;
|
const data::v_io_size ChunkedBuffer::CHUNK_ENTRY_SIZE_INDEX_SHIFT = 11;
|
||||||
const os::io::Library::v_size ChunkedBuffer::CHUNK_ENTRY_SIZE =
|
const data::v_io_size ChunkedBuffer::CHUNK_ENTRY_SIZE =
|
||||||
(1 << ChunkedBuffer::CHUNK_ENTRY_SIZE_INDEX_SHIFT);
|
(1 << ChunkedBuffer::CHUNK_ENTRY_SIZE_INDEX_SHIFT);
|
||||||
const os::io::Library::v_size ChunkedBuffer::CHUNK_CHUNK_SIZE = 32;
|
const data::v_io_size ChunkedBuffer::CHUNK_CHUNK_SIZE = 32;
|
||||||
|
|
||||||
ChunkedBuffer::ChunkEntry* ChunkedBuffer::obtainNewEntry(){
|
ChunkedBuffer::ChunkEntry* ChunkedBuffer::obtainNewEntry(){
|
||||||
auto result = new ChunkEntry(getSegemntPool().obtain(), nullptr);
|
auto result = new ChunkEntry(getSegemntPool().obtain(), nullptr);
|
||||||
@ -51,10 +51,10 @@ void ChunkedBuffer::freeEntry(ChunkEntry* entry){
|
|||||||
delete entry;
|
delete entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size ChunkedBuffer::writeToEntry(ChunkEntry* entry,
|
data::v_io_size ChunkedBuffer::writeToEntry(ChunkEntry* entry,
|
||||||
const void *data,
|
const void *data,
|
||||||
os::io::Library::v_size count,
|
data::v_io_size count,
|
||||||
os::io::Library::v_size& outChunkPos) {
|
data::v_io_size& outChunkPos) {
|
||||||
if(count >= CHUNK_ENTRY_SIZE){
|
if(count >= CHUNK_ENTRY_SIZE){
|
||||||
std::memcpy(entry->chunk, data, CHUNK_ENTRY_SIZE);
|
std::memcpy(entry->chunk, data, CHUNK_ENTRY_SIZE);
|
||||||
outChunkPos = 0;
|
outChunkPos = 0;
|
||||||
@ -66,12 +66,12 @@ os::io::Library::v_size ChunkedBuffer::writeToEntry(ChunkEntry* entry,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size ChunkedBuffer::writeToEntryFrom(ChunkEntry* entry,
|
data::v_io_size ChunkedBuffer::writeToEntryFrom(ChunkEntry* entry,
|
||||||
os::io::Library::v_size inChunkPos,
|
data::v_io_size inChunkPos,
|
||||||
const void *data,
|
const void *data,
|
||||||
os::io::Library::v_size count,
|
data::v_io_size count,
|
||||||
os::io::Library::v_size& outChunkPos) {
|
data::v_io_size& outChunkPos) {
|
||||||
os::io::Library::v_size spaceLeft = CHUNK_ENTRY_SIZE - inChunkPos;
|
data::v_io_size spaceLeft = CHUNK_ENTRY_SIZE - inChunkPos;
|
||||||
if(count >= spaceLeft){
|
if(count >= spaceLeft){
|
||||||
std::memcpy(&((p_char8) entry->chunk)[inChunkPos], data, spaceLeft);
|
std::memcpy(&((p_char8) entry->chunk)[inChunkPos], data, spaceLeft);
|
||||||
outChunkPos = 0;
|
outChunkPos = 0;
|
||||||
@ -84,15 +84,15 @@ os::io::Library::v_size ChunkedBuffer::writeToEntryFrom(ChunkEntry* entry,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ChunkedBuffer::ChunkEntry* ChunkedBuffer::getChunkForPosition(ChunkEntry* fromChunk,
|
ChunkedBuffer::ChunkEntry* ChunkedBuffer::getChunkForPosition(ChunkEntry* fromChunk,
|
||||||
os::io::Library::v_size pos,
|
data::v_io_size pos,
|
||||||
os::io::Library::v_size& outChunkPos) {
|
data::v_io_size& outChunkPos) {
|
||||||
|
|
||||||
os::io::Library::v_size segIndex = pos >> CHUNK_ENTRY_SIZE_INDEX_SHIFT;
|
data::v_io_size segIndex = pos >> CHUNK_ENTRY_SIZE_INDEX_SHIFT;
|
||||||
outChunkPos = pos - (segIndex << CHUNK_ENTRY_SIZE_INDEX_SHIFT);
|
outChunkPos = pos - (segIndex << CHUNK_ENTRY_SIZE_INDEX_SHIFT);
|
||||||
|
|
||||||
auto curr = fromChunk;
|
auto curr = fromChunk;
|
||||||
|
|
||||||
for(os::io::Library::v_size i = 0; i < segIndex; i++){
|
for(data::v_io_size i = 0; i < segIndex; i++){
|
||||||
curr = curr->next;
|
curr = curr->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ ChunkedBuffer::ChunkEntry* ChunkedBuffer::getChunkForPosition(ChunkEntry* fromCh
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size ChunkedBuffer::write(const void *data, os::io::Library::v_size count){
|
data::v_io_size ChunkedBuffer::write(const void *data, data::v_io_size count){
|
||||||
|
|
||||||
if(count <= 0){
|
if(count <= 0){
|
||||||
return 0;
|
return 0;
|
||||||
@ -111,7 +111,7 @@ os::io::Library::v_size ChunkedBuffer::write(const void *data, os::io::Library::
|
|||||||
}
|
}
|
||||||
|
|
||||||
ChunkEntry* entry = m_lastEntry;
|
ChunkEntry* entry = m_lastEntry;
|
||||||
os::io::Library::v_size pos = 0;
|
data::v_io_size pos = 0;
|
||||||
|
|
||||||
pos += writeToEntryFrom(entry, m_chunkPos, data, count, m_chunkPos);
|
pos += writeToEntryFrom(entry, m_chunkPos, data, count, m_chunkPos);
|
||||||
|
|
||||||
@ -133,32 +133,32 @@ os::io::Library::v_size ChunkedBuffer::write(const void *data, os::io::Library::
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size ChunkedBuffer::readSubstring(void *buffer,
|
data::v_io_size ChunkedBuffer::readSubstring(void *buffer,
|
||||||
os::io::Library::v_size pos,
|
data::v_io_size pos,
|
||||||
os::io::Library::v_size count) {
|
data::v_io_size count) {
|
||||||
|
|
||||||
if(pos < 0 || pos >= m_size){
|
if(pos < 0 || pos >= m_size){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size countToRead;
|
data::v_io_size countToRead;
|
||||||
if(pos + count > m_size){
|
if(pos + count > m_size){
|
||||||
countToRead = m_size - pos;
|
countToRead = m_size - pos;
|
||||||
} else {
|
} else {
|
||||||
countToRead = count;
|
countToRead = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size firstChunkPos;
|
data::v_io_size firstChunkPos;
|
||||||
auto firstChunk = getChunkForPosition(m_firstEntry, pos, firstChunkPos);
|
auto firstChunk = getChunkForPosition(m_firstEntry, pos, firstChunkPos);
|
||||||
|
|
||||||
os::io::Library::v_size lastChunkPos;
|
data::v_io_size lastChunkPos;
|
||||||
auto lastChunk = getChunkForPosition(firstChunk, firstChunkPos + countToRead, lastChunkPos);
|
auto lastChunk = getChunkForPosition(firstChunk, firstChunkPos + countToRead, lastChunkPos);
|
||||||
|
|
||||||
os::io::Library::v_size bufferPos = 0;
|
data::v_io_size bufferPos = 0;
|
||||||
|
|
||||||
if(firstChunk != lastChunk){
|
if(firstChunk != lastChunk){
|
||||||
|
|
||||||
os::io::Library::v_size countToCopy = CHUNK_ENTRY_SIZE - firstChunkPos;
|
data::v_io_size countToCopy = CHUNK_ENTRY_SIZE - firstChunkPos;
|
||||||
std::memcpy(buffer, &((p_char8)firstChunk->chunk)[firstChunkPos], countToCopy);
|
std::memcpy(buffer, &((p_char8)firstChunk->chunk)[firstChunkPos], countToCopy);
|
||||||
bufferPos += countToCopy;
|
bufferPos += countToCopy;
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ os::io::Library::v_size ChunkedBuffer::readSubstring(void *buffer,
|
|||||||
std::memcpy(&((p_char8)buffer)[bufferPos], lastChunk->chunk, lastChunkPos);
|
std::memcpy(&((p_char8)buffer)[bufferPos], lastChunk->chunk, lastChunkPos);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
os::io::Library::v_size countToCopy = lastChunkPos - firstChunkPos;
|
data::v_io_size countToCopy = lastChunkPos - firstChunkPos;
|
||||||
std::memcpy(buffer, &((p_char8)firstChunk->chunk)[firstChunkPos], countToCopy);
|
std::memcpy(buffer, &((p_char8)firstChunk->chunk)[firstChunkPos], countToCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,15 +181,15 @@ os::io::Library::v_size ChunkedBuffer::readSubstring(void *buffer,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
oatpp::String ChunkedBuffer::getSubstring(os::io::Library::v_size pos,
|
oatpp::String ChunkedBuffer::getSubstring(data::v_io_size pos,
|
||||||
os::io::Library::v_size count){
|
data::v_io_size count){
|
||||||
auto str = oatpp::String((v_int32) count);
|
auto str = oatpp::String((v_int32) count);
|
||||||
readSubstring(str->getData(), pos, count);
|
readSubstring(str->getData(), pos, count);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ChunkedBuffer::flushToStream(const std::shared_ptr<OutputStream>& stream){
|
bool ChunkedBuffer::flushToStream(const std::shared_ptr<OutputStream>& stream){
|
||||||
os::io::Library::v_size pos = m_size;
|
data::v_io_size pos = m_size;
|
||||||
auto curr = m_firstEntry;
|
auto curr = m_firstEntry;
|
||||||
while (pos > 0) {
|
while (pos > 0) {
|
||||||
if(pos > CHUNK_ENTRY_SIZE) {
|
if(pos > CHUNK_ENTRY_SIZE) {
|
||||||
@ -219,9 +219,9 @@ oatpp::async::Action ChunkedBuffer::flushToStreamAsync(oatpp::async::AbstractCor
|
|||||||
std::shared_ptr<ChunkedBuffer> m_chunkedBuffer;
|
std::shared_ptr<ChunkedBuffer> m_chunkedBuffer;
|
||||||
std::shared_ptr<OutputStream> m_stream;
|
std::shared_ptr<OutputStream> m_stream;
|
||||||
ChunkEntry* m_currEntry;
|
ChunkEntry* m_currEntry;
|
||||||
os::io::Library::v_size m_bytesLeft;
|
data::v_io_size m_bytesLeft;
|
||||||
const void* m_currData;
|
const void* m_currData;
|
||||||
os::io::Library::v_size m_currDataSize;
|
data::v_io_size m_currDataSize;
|
||||||
Action m_nextAction;
|
Action m_nextAction;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -288,7 +288,7 @@ std::shared_ptr<ChunkedBuffer::Chunks> ChunkedBuffer::getChunks() {
|
|||||||
return chunks;
|
return chunks;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size ChunkedBuffer::getSize(){
|
data::v_io_size ChunkedBuffer::getSize(){
|
||||||
return m_size;
|
return m_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,9 +42,9 @@ public:
|
|||||||
|
|
||||||
static const char* const CHUNK_POOL_NAME;
|
static const char* const CHUNK_POOL_NAME;
|
||||||
|
|
||||||
static const os::io::Library::v_size CHUNK_ENTRY_SIZE_INDEX_SHIFT;
|
static const data::v_io_size CHUNK_ENTRY_SIZE_INDEX_SHIFT;
|
||||||
static const os::io::Library::v_size CHUNK_ENTRY_SIZE;
|
static const data::v_io_size CHUNK_ENTRY_SIZE;
|
||||||
static const os::io::Library::v_size CHUNK_CHUNK_SIZE;
|
static const data::v_io_size CHUNK_CHUNK_SIZE;
|
||||||
|
|
||||||
static oatpp::base::memory::ThreadDistributedMemoryPool& getSegemntPool(){
|
static oatpp::base::memory::ThreadDistributedMemoryPool& getSegemntPool(){
|
||||||
static oatpp::base::memory::ThreadDistributedMemoryPool pool(CHUNK_POOL_NAME,
|
static oatpp::base::memory::ThreadDistributedMemoryPool pool(CHUNK_POOL_NAME,
|
||||||
@ -81,17 +81,17 @@ public:
|
|||||||
SHARED_OBJECT_POOL(Shared_ChunkedBuffer_Chunk_Pool, Chunk, 32)
|
SHARED_OBJECT_POOL(Shared_ChunkedBuffer_Chunk_Pool, Chunk, 32)
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Chunk(void* pData, os::io::Library::v_size pSize)
|
Chunk(void* pData, data::v_io_size pSize)
|
||||||
: data(pData)
|
: data(pData)
|
||||||
, size(pSize)
|
, size(pSize)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
static std::shared_ptr<Chunk> createShared(void* data, os::io::Library::v_size size){
|
static std::shared_ptr<Chunk> createShared(void* data, data::v_io_size size){
|
||||||
return Shared_ChunkedBuffer_Chunk_Pool::allocateShared(data, size);
|
return Shared_ChunkedBuffer_Chunk_Pool::allocateShared(data, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
const void* data;
|
const void* data;
|
||||||
const os::io::Library::v_size size;
|
const data::v_io_size size;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -99,8 +99,8 @@ public:
|
|||||||
typedef oatpp::collection::LinkedList<std::shared_ptr<Chunk>> Chunks;
|
typedef oatpp::collection::LinkedList<std::shared_ptr<Chunk>> Chunks;
|
||||||
private:
|
private:
|
||||||
|
|
||||||
os::io::Library::v_size m_size;
|
data::v_io_size m_size;
|
||||||
os::io::Library::v_size m_chunkPos;
|
data::v_io_size m_chunkPos;
|
||||||
ChunkEntry* m_firstEntry;
|
ChunkEntry* m_firstEntry;
|
||||||
ChunkEntry* m_lastEntry;
|
ChunkEntry* m_lastEntry;
|
||||||
|
|
||||||
@ -109,20 +109,20 @@ private:
|
|||||||
ChunkEntry* obtainNewEntry();
|
ChunkEntry* obtainNewEntry();
|
||||||
void freeEntry(ChunkEntry* entry);
|
void freeEntry(ChunkEntry* entry);
|
||||||
|
|
||||||
os::io::Library::v_size writeToEntry(ChunkEntry* entry,
|
data::v_io_size writeToEntry(ChunkEntry* entry,
|
||||||
const void *data,
|
const void *data,
|
||||||
os::io::Library::v_size count,
|
data::v_io_size count,
|
||||||
os::io::Library::v_size& outChunkPos);
|
data::v_io_size& outChunkPos);
|
||||||
|
|
||||||
os::io::Library::v_size writeToEntryFrom(ChunkEntry* entry,
|
data::v_io_size writeToEntryFrom(ChunkEntry* entry,
|
||||||
os::io::Library::v_size inChunkPos,
|
data::v_io_size inChunkPos,
|
||||||
const void *data,
|
const void *data,
|
||||||
os::io::Library::v_size count,
|
data::v_io_size count,
|
||||||
os::io::Library::v_size& outChunkPos);
|
data::v_io_size& outChunkPos);
|
||||||
|
|
||||||
ChunkEntry* getChunkForPosition(ChunkEntry* fromChunk,
|
ChunkEntry* getChunkForPosition(ChunkEntry* fromChunk,
|
||||||
os::io::Library::v_size pos,
|
data::v_io_size pos,
|
||||||
os::io::Library::v_size& outChunkPos);
|
data::v_io_size& outChunkPos);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -143,16 +143,16 @@ public:
|
|||||||
return Shared_ChunkedBuffer_Pool::allocateShared();
|
return Shared_ChunkedBuffer_Pool::allocateShared();
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size write(const void *data, os::io::Library::v_size count) override;
|
data::v_io_size write(const void *data, data::v_io_size count) override;
|
||||||
|
|
||||||
os::io::Library::v_size readSubstring(void *buffer,
|
data::v_io_size readSubstring(void *buffer,
|
||||||
os::io::Library::v_size pos,
|
data::v_io_size pos,
|
||||||
os::io::Library::v_size count);
|
data::v_io_size count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return substring of the data written to stream; NOT NULL
|
* return substring of the data written to stream; NOT NULL
|
||||||
*/
|
*/
|
||||||
oatpp::String getSubstring(os::io::Library::v_size pos, os::io::Library::v_size count);
|
oatpp::String getSubstring(data::v_io_size pos, data::v_io_size count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return data written to stream as oatpp::String; NOT NULL
|
* return data written to stream as oatpp::String; NOT NULL
|
||||||
@ -168,7 +168,7 @@ public:
|
|||||||
|
|
||||||
std::shared_ptr<Chunks> getChunks();
|
std::shared_ptr<Chunks> getChunks();
|
||||||
|
|
||||||
os::io::Library::v_size getSize();
|
data::v_io_size getSize();
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -31,12 +31,12 @@ namespace oatpp { namespace data{ namespace stream {
|
|||||||
|
|
||||||
class WriterDelegate {
|
class WriterDelegate {
|
||||||
public:
|
public:
|
||||||
virtual os::io::Library::v_size writeToStream(const std::shared_ptr<OutputStream>& stream) = 0;
|
virtual data::v_io_size writeToStream(const std::shared_ptr<OutputStream>& stream) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ReaderDelegate {
|
class ReaderDelegate {
|
||||||
public:
|
public:
|
||||||
virtual os::io::Library::v_size readFromStream(const std::shared_ptr<InputStream>& stream) = 0;
|
virtual data::v_io_size readFromStream(const std::shared_ptr<InputStream>& stream) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}}}
|
}}}
|
||||||
|
@ -30,7 +30,7 @@ namespace oatpp { namespace data{ namespace stream {
|
|||||||
const char* const Errors::ERROR_ASYNC_FAILED_TO_WRITE_DATA = "ERROR_ASYNC_FAILED_TO_WRITE_DATA";
|
const char* const Errors::ERROR_ASYNC_FAILED_TO_WRITE_DATA = "ERROR_ASYNC_FAILED_TO_WRITE_DATA";
|
||||||
const char* const Errors::ERROR_ASYNC_FAILED_TO_READ_DATA = "ERROR_ASYNC_FAILED_TO_READ_DATA";
|
const char* const Errors::ERROR_ASYNC_FAILED_TO_READ_DATA = "ERROR_ASYNC_FAILED_TO_READ_DATA";
|
||||||
|
|
||||||
os::io::Library::v_size OutputStream::writeAsString(v_int32 value){
|
data::v_io_size OutputStream::writeAsString(v_int32 value){
|
||||||
v_char8 a[100];
|
v_char8 a[100];
|
||||||
v_int32 size = utils::conversion::int32ToCharSequence(value, &a[0]);
|
v_int32 size = utils::conversion::int32ToCharSequence(value, &a[0]);
|
||||||
if(size > 0){
|
if(size > 0){
|
||||||
@ -39,7 +39,7 @@ os::io::Library::v_size OutputStream::writeAsString(v_int32 value){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size OutputStream::writeAsString(v_int64 value){
|
data::v_io_size OutputStream::writeAsString(v_int64 value){
|
||||||
v_char8 a[100];
|
v_char8 a[100];
|
||||||
v_int32 size = utils::conversion::int64ToCharSequence(value, &a[0]);
|
v_int32 size = utils::conversion::int64ToCharSequence(value, &a[0]);
|
||||||
if(size > 0){
|
if(size > 0){
|
||||||
@ -48,7 +48,7 @@ os::io::Library::v_size OutputStream::writeAsString(v_int64 value){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size OutputStream::writeAsString(v_float32 value){
|
data::v_io_size OutputStream::writeAsString(v_float32 value){
|
||||||
v_char8 a[100];
|
v_char8 a[100];
|
||||||
v_int32 size = utils::conversion::float32ToCharSequence(value, &a[0]);
|
v_int32 size = utils::conversion::float32ToCharSequence(value, &a[0]);
|
||||||
if(size > 0){
|
if(size > 0){
|
||||||
@ -57,7 +57,7 @@ os::io::Library::v_size OutputStream::writeAsString(v_float32 value){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size OutputStream::writeAsString(v_float64 value){
|
data::v_io_size OutputStream::writeAsString(v_float64 value){
|
||||||
v_char8 a[100];
|
v_char8 a[100];
|
||||||
v_int32 size = utils::conversion::float64ToCharSequence(value, &a[0]);
|
v_int32 size = utils::conversion::float64ToCharSequence(value, &a[0]);
|
||||||
if(size > 0){
|
if(size > 0){
|
||||||
@ -66,7 +66,7 @@ os::io::Library::v_size OutputStream::writeAsString(v_float64 value){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size OutputStream::writeAsString(bool value) {
|
data::v_io_size OutputStream::writeAsString(bool value) {
|
||||||
if(value){
|
if(value){
|
||||||
return write("true", 4);
|
return write("true", 4);
|
||||||
} else {
|
} else {
|
||||||
@ -117,16 +117,16 @@ const std::shared_ptr<OutputStream>& operator << (const std::shared_ptr<OutputSt
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size transfer(const std::shared_ptr<InputStream>& fromStream,
|
oatpp::data::v_io_size transfer(const std::shared_ptr<InputStream>& fromStream,
|
||||||
const std::shared_ptr<OutputStream>& toStream,
|
const std::shared_ptr<OutputStream>& toStream,
|
||||||
oatpp::os::io::Library::v_size transferSize,
|
oatpp::data::v_io_size transferSize,
|
||||||
void* buffer,
|
void* buffer,
|
||||||
oatpp::os::io::Library::v_size bufferSize) {
|
oatpp::data::v_io_size bufferSize) {
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size progress = 0;
|
oatpp::data::v_io_size progress = 0;
|
||||||
|
|
||||||
while (transferSize == 0 || progress < transferSize) {
|
while (transferSize == 0 || progress < transferSize) {
|
||||||
oatpp::os::io::Library::v_size desiredReadCount = transferSize - progress;
|
oatpp::data::v_io_size desiredReadCount = transferSize - progress;
|
||||||
if(transferSize == 0 || desiredReadCount > bufferSize){
|
if(transferSize == 0 || desiredReadCount > bufferSize){
|
||||||
desiredReadCount = bufferSize;
|
desiredReadCount = bufferSize;
|
||||||
}
|
}
|
||||||
@ -153,27 +153,27 @@ oatpp::async::Action transferAsync(oatpp::async::AbstractCoroutine* parentCorout
|
|||||||
const oatpp::async::Action& actionOnReturn,
|
const oatpp::async::Action& actionOnReturn,
|
||||||
const std::shared_ptr<InputStream>& fromStream,
|
const std::shared_ptr<InputStream>& fromStream,
|
||||||
const std::shared_ptr<OutputStream>& toStream,
|
const std::shared_ptr<OutputStream>& toStream,
|
||||||
oatpp::os::io::Library::v_size transferSize,
|
oatpp::data::v_io_size transferSize,
|
||||||
const std::shared_ptr<oatpp::data::buffer::IOBuffer>& buffer) {
|
const std::shared_ptr<oatpp::data::buffer::IOBuffer>& buffer) {
|
||||||
|
|
||||||
class TransferCoroutine : public oatpp::async::Coroutine<TransferCoroutine> {
|
class TransferCoroutine : public oatpp::async::Coroutine<TransferCoroutine> {
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<InputStream> m_fromStream;
|
std::shared_ptr<InputStream> m_fromStream;
|
||||||
std::shared_ptr<OutputStream> m_toStream;
|
std::shared_ptr<OutputStream> m_toStream;
|
||||||
oatpp::os::io::Library::v_size m_transferSize;
|
oatpp::data::v_io_size m_transferSize;
|
||||||
oatpp::os::io::Library::v_size m_progress;
|
oatpp::data::v_io_size m_progress;
|
||||||
std::shared_ptr<oatpp::data::buffer::IOBuffer> m_buffer;
|
std::shared_ptr<oatpp::data::buffer::IOBuffer> m_buffer;
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size m_desiredReadCount;
|
oatpp::data::v_io_size m_desiredReadCount;
|
||||||
void* m_readBufferPtr;
|
void* m_readBufferPtr;
|
||||||
const void* m_writeBufferPtr;
|
const void* m_writeBufferPtr;
|
||||||
oatpp::os::io::Library::v_size m_bytesLeft;
|
oatpp::data::v_io_size m_bytesLeft;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TransferCoroutine(const std::shared_ptr<InputStream>& fromStream,
|
TransferCoroutine(const std::shared_ptr<InputStream>& fromStream,
|
||||||
const std::shared_ptr<OutputStream>& toStream,
|
const std::shared_ptr<OutputStream>& toStream,
|
||||||
oatpp::os::io::Library::v_size transferSize,
|
oatpp::data::v_io_size transferSize,
|
||||||
const std::shared_ptr<oatpp::data::buffer::IOBuffer>& buffer)
|
const std::shared_ptr<oatpp::data::buffer::IOBuffer>& buffer)
|
||||||
: m_fromStream(fromStream)
|
: m_fromStream(fromStream)
|
||||||
, m_toStream(toStream)
|
, m_toStream(toStream)
|
||||||
@ -243,7 +243,7 @@ oatpp::async::Action transferAsync(oatpp::async::AbstractCoroutine* parentCorout
|
|||||||
|
|
||||||
oatpp::async::Action writeSomeDataAsyncInline(oatpp::data::stream::OutputStream* stream,
|
oatpp::async::Action writeSomeDataAsyncInline(oatpp::data::stream::OutputStream* stream,
|
||||||
const void*& data,
|
const void*& data,
|
||||||
os::io::Library::v_size& size,
|
data::v_io_size& size,
|
||||||
const oatpp::async::Action& nextAction) {
|
const oatpp::async::Action& nextAction) {
|
||||||
auto res = stream->write(data, size);
|
auto res = stream->write(data, size);
|
||||||
if(res == oatpp::data::stream::Errors::ERROR_IO_WAIT_RETRY) {
|
if(res == oatpp::data::stream::Errors::ERROR_IO_WAIT_RETRY) {
|
||||||
@ -265,7 +265,7 @@ oatpp::async::Action writeSomeDataAsyncInline(oatpp::data::stream::OutputStream*
|
|||||||
|
|
||||||
oatpp::async::Action writeExactSizeDataAsyncInline(oatpp::data::stream::OutputStream* stream,
|
oatpp::async::Action writeExactSizeDataAsyncInline(oatpp::data::stream::OutputStream* stream,
|
||||||
const void*& data,
|
const void*& data,
|
||||||
os::io::Library::v_size& size,
|
data::v_io_size& size,
|
||||||
const oatpp::async::Action& nextAction) {
|
const oatpp::async::Action& nextAction) {
|
||||||
auto res = stream->write(data, size);
|
auto res = stream->write(data, size);
|
||||||
if(res == oatpp::data::stream::Errors::ERROR_IO_WAIT_RETRY) {
|
if(res == oatpp::data::stream::Errors::ERROR_IO_WAIT_RETRY) {
|
||||||
@ -289,7 +289,7 @@ oatpp::async::Action writeExactSizeDataAsyncInline(oatpp::data::stream::OutputSt
|
|||||||
|
|
||||||
oatpp::async::Action readSomeDataAsyncInline(oatpp::data::stream::InputStream* stream,
|
oatpp::async::Action readSomeDataAsyncInline(oatpp::data::stream::InputStream* stream,
|
||||||
void*& data,
|
void*& data,
|
||||||
os::io::Library::v_size& bytesLeftToRead,
|
data::v_io_size& bytesLeftToRead,
|
||||||
const oatpp::async::Action& nextAction) {
|
const oatpp::async::Action& nextAction) {
|
||||||
auto res = stream->read(data, bytesLeftToRead);
|
auto res = stream->read(data, bytesLeftToRead);
|
||||||
if(res == oatpp::data::stream::Errors::ERROR_IO_WAIT_RETRY) {
|
if(res == oatpp::data::stream::Errors::ERROR_IO_WAIT_RETRY) {
|
||||||
@ -307,7 +307,7 @@ oatpp::async::Action readSomeDataAsyncInline(oatpp::data::stream::InputStream* s
|
|||||||
|
|
||||||
oatpp::async::Action readExactSizeDataAsyncInline(oatpp::data::stream::InputStream* stream,
|
oatpp::async::Action readExactSizeDataAsyncInline(oatpp::data::stream::InputStream* stream,
|
||||||
void*& data,
|
void*& data,
|
||||||
os::io::Library::v_size& bytesLeftToRead,
|
data::v_io_size& bytesLeftToRead,
|
||||||
const oatpp::async::Action& nextAction) {
|
const oatpp::async::Action& nextAction) {
|
||||||
auto res = stream->read(data, bytesLeftToRead);
|
auto res = stream->read(data, bytesLeftToRead);
|
||||||
if(res == oatpp::data::stream::Errors::ERROR_IO_WAIT_RETRY) {
|
if(res == oatpp::data::stream::Errors::ERROR_IO_WAIT_RETRY) {
|
||||||
@ -329,10 +329,10 @@ oatpp::async::Action readExactSizeDataAsyncInline(oatpp::data::stream::InputStre
|
|||||||
return nextAction;
|
return nextAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size readExactSizeData(oatpp::data::stream::InputStream* stream, void* data, os::io::Library::v_size size) {
|
oatpp::data::v_io_size readExactSizeData(oatpp::data::stream::InputStream* stream, void* data, data::v_io_size size) {
|
||||||
|
|
||||||
char* buffer = (char*) data;
|
char* buffer = (char*) data;
|
||||||
oatpp::os::io::Library::v_size progress = 0;
|
oatpp::data::v_io_size progress = 0;
|
||||||
|
|
||||||
while (progress < size) {
|
while (progress < size) {
|
||||||
|
|
||||||
@ -353,10 +353,10 @@ oatpp::os::io::Library::v_size readExactSizeData(oatpp::data::stream::InputStrea
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size writeExactSizeData(oatpp::data::stream::OutputStream* stream, const void* data, os::io::Library::v_size size) {
|
oatpp::data::v_io_size writeExactSizeData(oatpp::data::stream::OutputStream* stream, const void* data, data::v_io_size size) {
|
||||||
|
|
||||||
const char* buffer = (char*)data;
|
const char* buffer = (char*)data;
|
||||||
oatpp::os::io::Library::v_size progress = 0;
|
oatpp::data::v_io_size progress = 0;
|
||||||
|
|
||||||
while (progress < size) {
|
while (progress < size) {
|
||||||
|
|
||||||
|
@ -25,23 +25,19 @@
|
|||||||
#ifndef oatpp_data_Stream
|
#ifndef oatpp_data_Stream
|
||||||
#define oatpp_data_Stream
|
#define oatpp_data_Stream
|
||||||
|
|
||||||
|
#include "oatpp/core/async/Coroutine.hpp"
|
||||||
#include "oatpp/core/data/buffer/IOBuffer.hpp"
|
#include "oatpp/core/data/buffer/IOBuffer.hpp"
|
||||||
|
|
||||||
#include "oatpp/core/Types.hpp"
|
#include "oatpp/core/data/IODefinitions.hpp"
|
||||||
|
|
||||||
#include "oatpp/core/async/Coroutine.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
#include "oatpp/core/os/io/Library.hpp"
|
|
||||||
|
|
||||||
namespace oatpp { namespace data{ namespace stream {
|
namespace oatpp { namespace data{ namespace stream {
|
||||||
|
|
||||||
class Errors {
|
class Errors {
|
||||||
public:
|
public:
|
||||||
constexpr static os::io::Library::v_size ERROR_IO_NOTHING_TO_READ = -1001;
|
constexpr static data::v_io_size ERROR_IO_NOTHING_TO_READ = -1001;
|
||||||
constexpr static os::io::Library::v_size ERROR_IO_WAIT_RETRY = -1002;
|
constexpr static data::v_io_size ERROR_IO_WAIT_RETRY = -1002;
|
||||||
constexpr static os::io::Library::v_size ERROR_IO_RETRY = -1003;
|
constexpr static data::v_io_size ERROR_IO_RETRY = -1003;
|
||||||
constexpr static os::io::Library::v_size ERROR_IO_PIPE = -1004;
|
constexpr static data::v_io_size ERROR_IO_PIPE = -1004;
|
||||||
|
|
||||||
static const char* const ERROR_ASYNC_FAILED_TO_WRITE_DATA;
|
static const char* const ERROR_ASYNC_FAILED_TO_WRITE_DATA;
|
||||||
static const char* const ERROR_ASYNC_FAILED_TO_READ_DATA;
|
static const char* const ERROR_ASYNC_FAILED_TO_READ_DATA;
|
||||||
@ -54,25 +50,25 @@ public:
|
|||||||
* Write data to stream up to count bytes, and return number of bytes actually written
|
* Write data to stream up to count bytes, and return number of bytes actually written
|
||||||
* It is a legal case if return result < count. Caller should handle this!
|
* It is a legal case if return result < count. Caller should handle this!
|
||||||
*/
|
*/
|
||||||
virtual os::io::Library::v_size write(const void *data, os::io::Library::v_size count) = 0;
|
virtual data::v_io_size write(const void *data, data::v_io_size count) = 0;
|
||||||
|
|
||||||
os::io::Library::v_size write(const char* data){
|
data::v_io_size write(const char* data){
|
||||||
return write((p_char8)data, std::strlen(data));
|
return write((p_char8)data, std::strlen(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size write(const oatpp::String& str){
|
data::v_io_size write(const oatpp::String& str){
|
||||||
return write(str->getData(), str->getSize());
|
return write(str->getData(), str->getSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size writeChar(v_char8 c){
|
data::v_io_size writeChar(v_char8 c){
|
||||||
return write(&c, 1);
|
return write(&c, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size writeAsString(v_int32 value);
|
data::v_io_size writeAsString(v_int32 value);
|
||||||
os::io::Library::v_size writeAsString(v_int64 value);
|
data::v_io_size writeAsString(v_int64 value);
|
||||||
os::io::Library::v_size writeAsString(v_float32 value);
|
data::v_io_size writeAsString(v_float32 value);
|
||||||
os::io::Library::v_size writeAsString(v_float64 value);
|
data::v_io_size writeAsString(v_float64 value);
|
||||||
os::io::Library::v_size writeAsString(bool value);
|
data::v_io_size writeAsString(bool value);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -82,12 +78,12 @@ public:
|
|||||||
* Read data from stream up to count bytes, and return number of bytes actually read
|
* Read data from stream up to count bytes, and return number of bytes actually read
|
||||||
* It is a legal case if return result < count. Caller should handle this!
|
* It is a legal case if return result < count. Caller should handle this!
|
||||||
*/
|
*/
|
||||||
virtual os::io::Library::v_size read(void *data, os::io::Library::v_size count) = 0;
|
virtual data::v_io_size read(void *data, data::v_io_size count) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class IOStream : public InputStream, public OutputStream {
|
class IOStream : public InputStream, public OutputStream {
|
||||||
public:
|
public:
|
||||||
typedef os::io::Library::v_size v_size;
|
typedef data::v_io_size v_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CompoundIOStream : public oatpp::base::Controllable, public IOStream {
|
class CompoundIOStream : public oatpp::base::Controllable, public IOStream {
|
||||||
@ -110,11 +106,11 @@ public:
|
|||||||
return Shared_CompoundIOStream_Pool::allocateShared(outputStream, inputStream);
|
return Shared_CompoundIOStream_Pool::allocateShared(outputStream, inputStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size write(const void *data, os::io::Library::v_size count) override {
|
data::v_io_size write(const void *data, data::v_io_size count) override {
|
||||||
return m_outputStream->write(data, count);
|
return m_outputStream->write(data, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size read(void *data, os::io::Library::v_size count) override {
|
data::v_io_size read(void *data, data::v_io_size count) override {
|
||||||
return m_inputStream->read(data, count);
|
return m_inputStream->read(data, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,11 +137,11 @@ const std::shared_ptr<OutputStream>& operator << (const std::shared_ptr<OutputSt
|
|||||||
* transfer up to transferSize or until error if transferSize == 0
|
* transfer up to transferSize or until error if transferSize == 0
|
||||||
* throws in case readCount != writeCount
|
* throws in case readCount != writeCount
|
||||||
*/
|
*/
|
||||||
oatpp::os::io::Library::v_size transfer(const std::shared_ptr<InputStream>& fromStream,
|
oatpp::data::v_io_size transfer(const std::shared_ptr<InputStream>& fromStream,
|
||||||
const std::shared_ptr<OutputStream>& toStream,
|
const std::shared_ptr<OutputStream>& toStream,
|
||||||
oatpp::os::io::Library::v_size transferSize,
|
oatpp::data::v_io_size transferSize,
|
||||||
void* buffer,
|
void* buffer,
|
||||||
oatpp::os::io::Library::v_size bufferSize);
|
oatpp::data::v_io_size bufferSize);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,7 +151,7 @@ oatpp::async::Action transferAsync(oatpp::async::AbstractCoroutine* parentCorout
|
|||||||
const oatpp::async::Action& actionOnReturn,
|
const oatpp::async::Action& actionOnReturn,
|
||||||
const std::shared_ptr<InputStream>& fromStream,
|
const std::shared_ptr<InputStream>& fromStream,
|
||||||
const std::shared_ptr<OutputStream>& toStream,
|
const std::shared_ptr<OutputStream>& toStream,
|
||||||
oatpp::os::io::Library::v_size transferSize,
|
oatpp::data::v_io_size transferSize,
|
||||||
const std::shared_ptr<oatpp::data::buffer::IOBuffer>& buffer);
|
const std::shared_ptr<oatpp::data::buffer::IOBuffer>& buffer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -164,22 +160,22 @@ oatpp::async::Action transferAsync(oatpp::async::AbstractCoroutine* parentCorout
|
|||||||
*/
|
*/
|
||||||
oatpp::async::Action writeSomeDataAsyncInline(oatpp::data::stream::OutputStream* stream,
|
oatpp::async::Action writeSomeDataAsyncInline(oatpp::data::stream::OutputStream* stream,
|
||||||
const void*& data,
|
const void*& data,
|
||||||
os::io::Library::v_size& size,
|
data::v_io_size& size,
|
||||||
const oatpp::async::Action& nextAction);
|
const oatpp::async::Action& nextAction);
|
||||||
|
|
||||||
oatpp::async::Action writeExactSizeDataAsyncInline(oatpp::data::stream::OutputStream* stream,
|
oatpp::async::Action writeExactSizeDataAsyncInline(oatpp::data::stream::OutputStream* stream,
|
||||||
const void*& data,
|
const void*& data,
|
||||||
os::io::Library::v_size& size,
|
data::v_io_size& size,
|
||||||
const oatpp::async::Action& nextAction);
|
const oatpp::async::Action& nextAction);
|
||||||
|
|
||||||
oatpp::async::Action readSomeDataAsyncInline(oatpp::data::stream::InputStream* stream,
|
oatpp::async::Action readSomeDataAsyncInline(oatpp::data::stream::InputStream* stream,
|
||||||
void*& data,
|
void*& data,
|
||||||
os::io::Library::v_size& bytesLeftToRead,
|
data::v_io_size& bytesLeftToRead,
|
||||||
const oatpp::async::Action& nextAction);
|
const oatpp::async::Action& nextAction);
|
||||||
|
|
||||||
oatpp::async::Action readExactSizeDataAsyncInline(oatpp::data::stream::InputStream* stream,
|
oatpp::async::Action readExactSizeDataAsyncInline(oatpp::data::stream::InputStream* stream,
|
||||||
void*& data,
|
void*& data,
|
||||||
os::io::Library::v_size& bytesLeftToRead,
|
data::v_io_size& bytesLeftToRead,
|
||||||
const oatpp::async::Action& nextAction);
|
const oatpp::async::Action& nextAction);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,14 +183,14 @@ oatpp::async::Action readExactSizeDataAsyncInline(oatpp::data::stream::InputStre
|
|||||||
* returns exact amount of bytes was read.
|
* returns exact amount of bytes was read.
|
||||||
* return result can be < size only in case of some disaster like connection reset by peer
|
* return result can be < size only in case of some disaster like connection reset by peer
|
||||||
*/
|
*/
|
||||||
oatpp::os::io::Library::v_size readExactSizeData(oatpp::data::stream::InputStream* stream, void* data, os::io::Library::v_size size);
|
oatpp::data::v_io_size readExactSizeData(oatpp::data::stream::InputStream* stream, void* data, data::v_io_size size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write exact amount of bytes to stream.
|
* Write exact amount of bytes to stream.
|
||||||
* returns exact amount of bytes was written.
|
* returns exact amount of bytes was written.
|
||||||
* return result can be < size only in case of some disaster like broken pipe
|
* return result can be < size only in case of some disaster like broken pipe
|
||||||
*/
|
*/
|
||||||
oatpp::os::io::Library::v_size writeExactSizeData(oatpp::data::stream::OutputStream* stream, const void* data, os::io::Library::v_size size);
|
oatpp::data::v_io_size writeExactSizeData(oatpp::data::stream::OutputStream* stream, const void* data, data::v_io_size size);
|
||||||
|
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
namespace oatpp { namespace data{ namespace stream {
|
namespace oatpp { namespace data{ namespace stream {
|
||||||
|
|
||||||
os::io::Library::v_size OutputStreamBufferedProxy::write(const void *data, os::io::Library::v_size count) {
|
data::v_io_size OutputStreamBufferedProxy::write(const void *data, data::v_io_size count) {
|
||||||
if(m_pos == 0){
|
if(m_pos == 0){
|
||||||
|
|
||||||
v_bufferSize spaceLeft = m_bufferSize - m_posEnd;
|
v_bufferSize spaceLeft = m_bufferSize - m_posEnd;
|
||||||
@ -45,11 +45,11 @@ os::io::Library::v_size OutputStreamBufferedProxy::write(const void *data, os::i
|
|||||||
m_posEnd = m_bufferSize;
|
m_posEnd = m_bufferSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size writeResult = m_outputStream->write(m_buffer, m_bufferSize);
|
data::v_io_size writeResult = m_outputStream->write(m_buffer, m_bufferSize);
|
||||||
|
|
||||||
if(writeResult == m_bufferSize){
|
if(writeResult == m_bufferSize){
|
||||||
m_posEnd = 0;
|
m_posEnd = 0;
|
||||||
os::io::Library::v_size bigResult = write(&((p_char8) data)[spaceLeft], count - spaceLeft);
|
data::v_io_size bigResult = write(&((p_char8) data)[spaceLeft], count - spaceLeft);
|
||||||
if(bigResult > 0) {
|
if(bigResult > 0) {
|
||||||
return bigResult + spaceLeft;
|
return bigResult + spaceLeft;
|
||||||
} else if(bigResult < 0) {
|
} else if(bigResult < 0) {
|
||||||
@ -70,7 +70,7 @@ os::io::Library::v_size OutputStreamBufferedProxy::write(const void *data, os::i
|
|||||||
} else {
|
} else {
|
||||||
auto amount = m_posEnd - m_pos;
|
auto amount = m_posEnd - m_pos;
|
||||||
if(amount > 0){
|
if(amount > 0){
|
||||||
os::io::Library::v_size result = m_outputStream->write(&m_buffer[m_pos], amount);
|
data::v_io_size result = m_outputStream->write(&m_buffer[m_pos], amount);
|
||||||
if(result == amount){
|
if(result == amount){
|
||||||
m_pos = 0;
|
m_pos = 0;
|
||||||
m_posEnd = 0;
|
m_posEnd = 0;
|
||||||
@ -87,10 +87,10 @@ os::io::Library::v_size OutputStreamBufferedProxy::write(const void *data, os::i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size OutputStreamBufferedProxy::flush() {
|
data::v_io_size OutputStreamBufferedProxy::flush() {
|
||||||
auto amount = m_posEnd - m_pos;
|
auto amount = m_posEnd - m_pos;
|
||||||
if(amount > 0){
|
if(amount > 0){
|
||||||
os::io::Library::v_size result = stream::writeExactSizeData(m_outputStream.get(), &m_buffer[m_pos], amount);
|
data::v_io_size result = stream::writeExactSizeData(m_outputStream.get(), &m_buffer[m_pos], amount);
|
||||||
if(result == amount){
|
if(result == amount){
|
||||||
m_pos = 0;
|
m_pos = 0;
|
||||||
m_posEnd = 0;
|
m_posEnd = 0;
|
||||||
@ -117,7 +117,7 @@ oatpp::async::Action OutputStreamBufferedProxy::flushAsync(oatpp::async::Abstrac
|
|||||||
Action act() override {
|
Action act() override {
|
||||||
auto amount = m_stream->m_posEnd - m_stream->m_pos;
|
auto amount = m_stream->m_posEnd - m_stream->m_pos;
|
||||||
if(amount > 0){
|
if(amount > 0){
|
||||||
os::io::Library::v_size result = m_stream->m_outputStream->write(&m_stream->m_buffer[m_stream->m_pos], amount);
|
data::v_io_size result = m_stream->m_outputStream->write(&m_stream->m_buffer[m_stream->m_pos], amount);
|
||||||
if(result == amount) {
|
if(result == amount) {
|
||||||
m_stream->m_pos = 0;
|
m_stream->m_pos = 0;
|
||||||
m_stream->m_posEnd = 0;
|
m_stream->m_posEnd = 0;
|
||||||
@ -144,7 +144,7 @@ oatpp::async::Action OutputStreamBufferedProxy::flushAsync(oatpp::async::Abstrac
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size InputStreamBufferedProxy::read(void *data, os::io::Library::v_size count) {
|
data::v_io_size InputStreamBufferedProxy::read(void *data, data::v_io_size count) {
|
||||||
|
|
||||||
if (m_pos == 0 && m_posEnd == 0) {
|
if (m_pos == 0 && m_posEnd == 0) {
|
||||||
|
|
||||||
@ -185,7 +185,7 @@ os::io::Library::v_size InputStreamBufferedProxy::read(void *data, os::io::Libra
|
|||||||
|
|
||||||
m_pos = 0;
|
m_pos = 0;
|
||||||
m_posEnd = 0;
|
m_posEnd = 0;
|
||||||
os::io::Library::v_size bigResult = read(&((p_char8) data) [result], count - result);
|
data::v_io_size bigResult = read(&((p_char8) data) [result], count - result);
|
||||||
if(bigResult > 0){
|
if(bigResult > 0){
|
||||||
return bigResult + result;
|
return bigResult + result;
|
||||||
} else if(bigResult < 0) {
|
} else if(bigResult < 0) {
|
||||||
|
@ -77,8 +77,8 @@ public:
|
|||||||
bufferSize);
|
bufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size write(const void *data, os::io::Library::v_size count) override;
|
data::v_io_size write(const void *data, data::v_io_size count) override;
|
||||||
os::io::Library::v_size flush();
|
data::v_io_size flush();
|
||||||
oatpp::async::Action flushAsync(oatpp::async::AbstractCoroutine* parentCoroutine,
|
oatpp::async::Action flushAsync(oatpp::async::AbstractCoroutine* parentCoroutine,
|
||||||
const oatpp::async::Action& actionOnFinish);
|
const oatpp::async::Action& actionOnFinish);
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ public:
|
|||||||
positionEnd);
|
positionEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size read(void *data, os::io::Library::v_size count) override;
|
data::v_io_size read(void *data, data::v_io_size count) override;
|
||||||
|
|
||||||
void setBufferPosition(v_bufferSize pos, v_bufferSize posEnd){
|
void setBufferPosition(v_bufferSize pos, v_bufferSize posEnd){
|
||||||
m_pos = pos;
|
m_pos = pos;
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
*
|
|
||||||
* Project _____ __ ____ _ _
|
|
||||||
* ( _ ) /__\ (_ _)_| |_ _| |_
|
|
||||||
* )(_)( /(__)\ )( (_ _)(_ _)
|
|
||||||
* (_____)(__)(__)(__) |_| |_|
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright 2018-present, Leonid Stryzhevskyi, <lganzzzo@gmail.com>
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#include "Library.hpp"
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
namespace oatpp { namespace os { namespace io {
|
|
||||||
|
|
||||||
v_int32 Library::handle_close(v_handle handle){
|
|
||||||
return close(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
Library::v_size Library::handle_read(v_handle handle, void *buf, v_size count){
|
|
||||||
return read(handle, buf, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
Library::v_size Library::handle_write(v_handle handle, const void *buf, v_size count){
|
|
||||||
v_int32 flags = 0;
|
|
||||||
#ifdef MSG_NOSIGNAL
|
|
||||||
flags |= MSG_NOSIGNAL;
|
|
||||||
#endif
|
|
||||||
return send(handle, buf, count, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
}}}
|
|
@ -24,13 +24,14 @@
|
|||||||
|
|
||||||
#include "./Connection.hpp"
|
#include "./Connection.hpp"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
namespace oatpp { namespace network {
|
namespace oatpp { namespace network {
|
||||||
|
|
||||||
Connection::Connection(Library::v_handle handle)
|
Connection::Connection(data::v_io_handle handle)
|
||||||
: m_handle(handle)
|
: m_handle(handle)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -39,9 +40,16 @@ Connection::~Connection(){
|
|||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
Connection::Library::v_size Connection::write(const void *buff, Library::v_size count){
|
data::v_io_size Connection::write(const void *buff, data::v_io_size count){
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
auto result = Library::handle_write(m_handle, buff, count);
|
|
||||||
|
v_int32 flags = 0;
|
||||||
|
#ifdef MSG_NOSIGNAL
|
||||||
|
flags |= MSG_NOSIGNAL;
|
||||||
|
#endif
|
||||||
|
auto result = ::send(m_handle, buff, count, flags);
|
||||||
|
|
||||||
if(result <= 0) {
|
if(result <= 0) {
|
||||||
auto e = errno;
|
auto e = errno;
|
||||||
if(e == EAGAIN || e == EWOULDBLOCK){
|
if(e == EAGAIN || e == EWOULDBLOCK){
|
||||||
@ -57,9 +65,9 @@ Connection::Library::v_size Connection::write(const void *buff, Library::v_size
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Connection::Library::v_size Connection::read(void *buff, Library::v_size count){
|
data::v_io_size Connection::read(void *buff, data::v_io_size count){
|
||||||
errno = 0;
|
errno = 0;
|
||||||
auto result = Library::handle_read(m_handle, buff, count);
|
auto result = ::read(m_handle, buff, count);
|
||||||
if(result <= 0) {
|
if(result <= 0) {
|
||||||
auto e = errno;
|
auto e = errno;
|
||||||
if(e == EAGAIN || e == EWOULDBLOCK){
|
if(e == EAGAIN || e == EWOULDBLOCK){
|
||||||
@ -76,7 +84,7 @@ Connection::Library::v_size Connection::read(void *buff, Library::v_size count){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Connection::close(){
|
void Connection::close(){
|
||||||
Library::handle_close(m_handle);
|
::close(m_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
@ -31,29 +31,27 @@
|
|||||||
namespace oatpp { namespace network {
|
namespace oatpp { namespace network {
|
||||||
|
|
||||||
class Connection : public oatpp::base::Controllable, public oatpp::data::stream::IOStream {
|
class Connection : public oatpp::base::Controllable, public oatpp::data::stream::IOStream {
|
||||||
public:
|
|
||||||
typedef oatpp::os::io::Library Library;
|
|
||||||
public:
|
public:
|
||||||
OBJECT_POOL(Connection_Pool, Connection, 32);
|
OBJECT_POOL(Connection_Pool, Connection, 32);
|
||||||
SHARED_OBJECT_POOL(Shared_Connection_Pool, Connection, 32);
|
SHARED_OBJECT_POOL(Shared_Connection_Pool, Connection, 32);
|
||||||
private:
|
private:
|
||||||
Library::v_handle m_handle;
|
data::v_io_handle m_handle;
|
||||||
public:
|
public:
|
||||||
Connection(Library::v_handle handle);
|
Connection(data::v_io_handle handle);
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static std::shared_ptr<Connection> createShared(Library::v_handle handle){
|
static std::shared_ptr<Connection> createShared(data::v_io_handle handle){
|
||||||
return Shared_Connection_Pool::allocateShared(handle);
|
return Shared_Connection_Pool::allocateShared(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Connection();
|
~Connection();
|
||||||
|
|
||||||
Library::v_size write(const void *buff, Library::v_size count) override;
|
data::v_io_size write(const void *buff, data::v_io_size count) override;
|
||||||
Library::v_size read(void *buff, Library::v_size count) override;
|
data::v_io_size read(void *buff, data::v_io_size count) override;
|
||||||
|
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
Library::v_handle getHandle(){
|
data::v_io_handle getHandle(){
|
||||||
return m_handle;
|
return m_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
namespace oatpp { namespace network { namespace client {
|
namespace oatpp { namespace network { namespace client {
|
||||||
|
|
||||||
@ -58,7 +59,7 @@ std::shared_ptr<oatpp::data::stream::IOStream> SimpleTCPConnectionProvider::getC
|
|||||||
client.sin_port = htons(m_port);
|
client.sin_port = htons(m_port);
|
||||||
memcpy(&client.sin_addr, host->h_addr, host->h_length);
|
memcpy(&client.sin_addr, host->h_addr, host->h_length);
|
||||||
|
|
||||||
oatpp::os::io::Library::v_handle clientHandle = socket(AF_INET, SOCK_STREAM, 0);
|
oatpp::data::v_io_handle clientHandle = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
|
||||||
if (clientHandle < 0) {
|
if (clientHandle < 0) {
|
||||||
OATPP_LOGD("SimpleTCPConnectionProvider", "Error creating socket.");
|
OATPP_LOGD("SimpleTCPConnectionProvider", "Error creating socket.");
|
||||||
@ -74,7 +75,7 @@ std::shared_ptr<oatpp::data::stream::IOStream> SimpleTCPConnectionProvider::getC
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (connect(clientHandle, (struct sockaddr *)&client, sizeof(client)) != 0 ) {
|
if (connect(clientHandle, (struct sockaddr *)&client, sizeof(client)) != 0 ) {
|
||||||
oatpp::os::io::Library::handle_close(clientHandle);
|
::close(clientHandle);
|
||||||
OATPP_LOGD("SimpleTCPConnectionProvider", "Could not connect");
|
OATPP_LOGD("SimpleTCPConnectionProvider", "Could not connect");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -90,7 +91,7 @@ oatpp::async::Action SimpleTCPConnectionProvider::getConnectionAsync(oatpp::asyn
|
|||||||
private:
|
private:
|
||||||
oatpp::String m_host;
|
oatpp::String m_host;
|
||||||
v_int32 m_port;
|
v_int32 m_port;
|
||||||
oatpp::os::io::Library::v_handle m_clientHandle;
|
oatpp::data::v_io_handle m_clientHandle;
|
||||||
struct sockaddr_in m_client;
|
struct sockaddr_in m_client;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -143,7 +144,7 @@ oatpp::async::Action SimpleTCPConnectionProvider::getConnectionAsync(oatpp::asyn
|
|||||||
} else if(errno == EINTR) {
|
} else if(errno == EINTR) {
|
||||||
return repeat();
|
return repeat();
|
||||||
}
|
}
|
||||||
oatpp::os::io::Library::handle_close(m_clientHandle);
|
::close(m_clientHandle);
|
||||||
return error("[oatpp::network::client::SimpleTCPConnectionProvider::getConnectionAsync()]: Can't connect");
|
return error("[oatpp::network::client::SimpleTCPConnectionProvider::getConnectionAsync()]: Can't connect");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,15 +36,11 @@
|
|||||||
#include "oatpp/core/base/Controllable.hpp"
|
#include "oatpp/core/base/Controllable.hpp"
|
||||||
#include "oatpp/core/base/Environment.hpp"
|
#include "oatpp/core/base/Environment.hpp"
|
||||||
|
|
||||||
#include "oatpp/core/os/io/Library.hpp"
|
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
namespace oatpp { namespace network { namespace server {
|
namespace oatpp { namespace network { namespace server {
|
||||||
|
|
||||||
class Server : public base::Controllable, public concurrency::Runnable{
|
class Server : public base::Controllable, public concurrency::Runnable{
|
||||||
public:
|
|
||||||
typedef oatpp::os::io::Library Library;
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void mainLoop();
|
void mainLoop();
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
namespace oatpp { namespace network { namespace server {
|
namespace oatpp { namespace network { namespace server {
|
||||||
|
|
||||||
@ -44,10 +45,14 @@ SimpleTCPConnectionProvider::SimpleTCPConnectionProvider(v_word16 port, bool non
|
|||||||
setProperty(PROPERTY_HOST, "localhost");
|
setProperty(PROPERTY_HOST, "localhost");
|
||||||
setProperty(PROPERTY_PORT, oatpp::utils::conversion::int32ToStr(port));
|
setProperty(PROPERTY_PORT, oatpp::utils::conversion::int32ToStr(port));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SimpleTCPConnectionProvider::~SimpleTCPConnectionProvider() {
|
||||||
|
::close(m_serverHandle);
|
||||||
|
}
|
||||||
|
|
||||||
oatpp::os::io::Library::v_handle SimpleTCPConnectionProvider::instantiateServer(){
|
oatpp::data::v_io_handle SimpleTCPConnectionProvider::instantiateServer(){
|
||||||
|
|
||||||
oatpp::os::io::Library::v_handle serverHandle;
|
oatpp::data::v_io_handle serverHandle;
|
||||||
v_int32 ret;
|
v_int32 ret;
|
||||||
int yes = 1;
|
int yes = 1;
|
||||||
|
|
||||||
@ -71,14 +76,14 @@ oatpp::os::io::Library::v_handle SimpleTCPConnectionProvider::instantiateServer(
|
|||||||
ret = bind(serverHandle, (struct sockaddr *)&addr, sizeof(addr));
|
ret = bind(serverHandle, (struct sockaddr *)&addr, sizeof(addr));
|
||||||
|
|
||||||
if(ret != 0) {
|
if(ret != 0) {
|
||||||
oatpp::os::io::Library::handle_close(serverHandle);
|
::close(serverHandle);
|
||||||
throw std::runtime_error("Can't bind to address");
|
throw std::runtime_error("Can't bind to address");
|
||||||
return -1 ;
|
return -1 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = listen(serverHandle, 10000);
|
ret = listen(serverHandle, 10000);
|
||||||
if(ret < 0) {
|
if(ret < 0) {
|
||||||
oatpp::os::io::Library::handle_close(serverHandle);
|
::close(serverHandle);
|
||||||
return -1 ;
|
return -1 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +97,7 @@ std::shared_ptr<oatpp::data::stream::IOStream> SimpleTCPConnectionProvider::getC
|
|||||||
|
|
||||||
//oatpp::test::PerformanceChecker checker("Accept Checker");
|
//oatpp::test::PerformanceChecker checker("Accept Checker");
|
||||||
|
|
||||||
oatpp::os::io::Library::v_handle handle = accept(m_serverHandle, nullptr, nullptr);
|
oatpp::data::v_io_handle handle = accept(m_serverHandle, nullptr, nullptr);
|
||||||
|
|
||||||
if (handle < 0) {
|
if (handle < 0) {
|
||||||
v_int32 error = errno;
|
v_int32 error = errno;
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
#include "oatpp/core/data/stream/Stream.hpp"
|
#include "oatpp/core/data/stream/Stream.hpp"
|
||||||
#include "oatpp/core/Types.hpp"
|
#include "oatpp/core/Types.hpp"
|
||||||
#include "oatpp/core/os/io/Library.hpp"
|
|
||||||
|
|
||||||
namespace oatpp { namespace network { namespace server {
|
namespace oatpp { namespace network { namespace server {
|
||||||
|
|
||||||
@ -37,9 +36,9 @@ class SimpleTCPConnectionProvider : public base::Controllable, public ServerConn
|
|||||||
private:
|
private:
|
||||||
v_word16 m_port;
|
v_word16 m_port;
|
||||||
bool m_nonBlocking;
|
bool m_nonBlocking;
|
||||||
oatpp::os::io::Library::v_handle m_serverHandle;
|
oatpp::data::v_io_handle m_serverHandle;
|
||||||
private:
|
private:
|
||||||
oatpp::os::io::Library::v_handle instantiateServer();
|
oatpp::data::v_io_handle instantiateServer();
|
||||||
public:
|
public:
|
||||||
SimpleTCPConnectionProvider(v_word16 port, bool nonBlocking = false);
|
SimpleTCPConnectionProvider(v_word16 port, bool nonBlocking = false);
|
||||||
public:
|
public:
|
||||||
@ -48,9 +47,7 @@ public:
|
|||||||
return std::make_shared<SimpleTCPConnectionProvider>(port, nonBlocking);
|
return std::make_shared<SimpleTCPConnectionProvider>(port, nonBlocking);
|
||||||
}
|
}
|
||||||
|
|
||||||
~SimpleTCPConnectionProvider() {
|
~SimpleTCPConnectionProvider();
|
||||||
oatpp::os::io::Library::handle_close(m_serverHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<IOStream> getConnection() override;
|
std::shared_ptr<IOStream> getConnection() override;
|
||||||
|
|
||||||
|
@ -26,18 +26,18 @@
|
|||||||
|
|
||||||
namespace oatpp { namespace network { namespace virtual_ {
|
namespace oatpp { namespace network { namespace virtual_ {
|
||||||
|
|
||||||
void Pipe::Reader::setMaxAvailableToRead(os::io::Library::v_size maxAvailableToRead) {
|
void Pipe::Reader::setMaxAvailableToRead(data::v_io_size maxAvailableToRead) {
|
||||||
m_maxAvailableToRead = maxAvailableToRead;
|
m_maxAvailableToRead = maxAvailableToRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size Pipe::Reader::read(void *data, os::io::Library::v_size count) {
|
data::v_io_size Pipe::Reader::read(void *data, data::v_io_size count) {
|
||||||
|
|
||||||
if(m_maxAvailableToRead > -1 && count > m_maxAvailableToRead) {
|
if(m_maxAvailableToRead > -1 && count > m_maxAvailableToRead) {
|
||||||
count = m_maxAvailableToRead;
|
count = m_maxAvailableToRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
Pipe& pipe = *m_pipe;
|
Pipe& pipe = *m_pipe;
|
||||||
oatpp::os::io::Library::v_size result;
|
oatpp::data::v_io_size result;
|
||||||
|
|
||||||
if(m_nonBlocking) {
|
if(m_nonBlocking) {
|
||||||
if(pipe.m_buffer.availableToRead() > 0) {
|
if(pipe.m_buffer.availableToRead() > 0) {
|
||||||
@ -66,18 +66,18 @@ os::io::Library::v_size Pipe::Reader::read(void *data, os::io::Library::v_size c
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Pipe::Writer::setMaxAvailableToWrite(os::io::Library::v_size maxAvailableToWrite) {
|
void Pipe::Writer::setMaxAvailableToWrite(data::v_io_size maxAvailableToWrite) {
|
||||||
m_maxAvailableToWrtie = maxAvailableToWrite;
|
m_maxAvailableToWrtie = maxAvailableToWrite;
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size Pipe::Writer::write(const void *data, os::io::Library::v_size count) {
|
data::v_io_size Pipe::Writer::write(const void *data, data::v_io_size count) {
|
||||||
|
|
||||||
if(m_maxAvailableToWrtie > -1 && count > m_maxAvailableToWrtie) {
|
if(m_maxAvailableToWrtie > -1 && count > m_maxAvailableToWrtie) {
|
||||||
count = m_maxAvailableToWrtie;
|
count = m_maxAvailableToWrtie;
|
||||||
}
|
}
|
||||||
|
|
||||||
Pipe& pipe = *m_pipe;
|
Pipe& pipe = *m_pipe;
|
||||||
oatpp::os::io::Library::v_size result;
|
oatpp::data::v_io_size result;
|
||||||
|
|
||||||
if(m_nonBlocking) {
|
if(m_nonBlocking) {
|
||||||
if(pipe.m_buffer.availableToWrite() > 0) {
|
if(pipe.m_buffer.availableToWrite() > 0) {
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* this one used for testing purposes only
|
* this one used for testing purposes only
|
||||||
*/
|
*/
|
||||||
os::io::Library::v_size m_maxAvailableToRead;
|
data::v_io_size m_maxAvailableToRead;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Reader(Pipe* pipe, bool nonBlocking = false)
|
Reader(Pipe* pipe, bool nonBlocking = false)
|
||||||
@ -63,9 +63,9 @@ public:
|
|||||||
* this one used for testing purposes only
|
* this one used for testing purposes only
|
||||||
* set to -1 in order to ignore this value
|
* set to -1 in order to ignore this value
|
||||||
*/
|
*/
|
||||||
void setMaxAvailableToRead(os::io::Library::v_size maxAvailableToRead);
|
void setMaxAvailableToRead(data::v_io_size maxAvailableToRead);
|
||||||
|
|
||||||
os::io::Library::v_size read(void *data, os::io::Library::v_size count) override;
|
data::v_io_size read(void *data, data::v_io_size count) override;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* this one used for testing purposes only
|
* this one used for testing purposes only
|
||||||
*/
|
*/
|
||||||
os::io::Library::v_size m_maxAvailableToWrtie;
|
data::v_io_size m_maxAvailableToWrtie;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Writer(Pipe* pipe, bool nonBlocking = false)
|
Writer(Pipe* pipe, bool nonBlocking = false)
|
||||||
@ -94,9 +94,9 @@ public:
|
|||||||
* this one used for testing purposes only
|
* this one used for testing purposes only
|
||||||
* set to -1 in order to ignore this value
|
* set to -1 in order to ignore this value
|
||||||
*/
|
*/
|
||||||
void setMaxAvailableToWrite(os::io::Library::v_size maxAvailableToWrite);
|
void setMaxAvailableToWrite(data::v_io_size maxAvailableToWrite);
|
||||||
|
|
||||||
os::io::Library::v_size write(const void *data, os::io::Library::v_size count) override;
|
data::v_io_size write(const void *data, data::v_io_size count) override;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,16 +26,16 @@
|
|||||||
|
|
||||||
namespace oatpp { namespace network { namespace virtual_ {
|
namespace oatpp { namespace network { namespace virtual_ {
|
||||||
|
|
||||||
void Socket::setMaxAvailableToReadWrtie(os::io::Library::v_size maxToRead, os::io::Library::v_size maxToWrite) {
|
void Socket::setMaxAvailableToReadWrtie(data::v_io_size maxToRead, data::v_io_size maxToWrite) {
|
||||||
m_pipeIn->getReader()->setMaxAvailableToRead(maxToRead);
|
m_pipeIn->getReader()->setMaxAvailableToRead(maxToRead);
|
||||||
m_pipeOut->getWriter()->setMaxAvailableToWrite(maxToWrite);
|
m_pipeOut->getWriter()->setMaxAvailableToWrite(maxToWrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size Socket::read(void *data, os::io::Library::v_size count) {
|
data::v_io_size Socket::read(void *data, data::v_io_size count) {
|
||||||
return m_pipeIn->getReader()->read(data, count);
|
return m_pipeIn->getReader()->read(data, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
os::io::Library::v_size Socket::write(const void *data, os::io::Library::v_size count) {
|
data::v_io_size Socket::write(const void *data, data::v_io_size count) {
|
||||||
return m_pipeOut->getWriter()->write(data, count);
|
return m_pipeOut->getWriter()->write(data, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,10 +52,10 @@ public:
|
|||||||
* this one used for testing purposes only
|
* this one used for testing purposes only
|
||||||
* set to -1 in order to ignore this value
|
* set to -1 in order to ignore this value
|
||||||
*/
|
*/
|
||||||
void setMaxAvailableToReadWrtie(os::io::Library::v_size maxToRead, os::io::Library::v_size maxToWrite);
|
void setMaxAvailableToReadWrtie(data::v_io_size maxToRead, data::v_io_size maxToWrite);
|
||||||
|
|
||||||
os::io::Library::v_size read(void *data, os::io::Library::v_size count) override;
|
data::v_io_size read(void *data, data::v_io_size count) override;
|
||||||
os::io::Library::v_size write(const void *data, os::io::Library::v_size count) override;
|
data::v_io_size write(const void *data, data::v_io_size count) override;
|
||||||
|
|
||||||
void setNonBlocking(bool nonBlocking);
|
void setNonBlocking(bool nonBlocking);
|
||||||
|
|
||||||
|
@ -39,14 +39,14 @@ oatpp::async::Action ConnectionProvider::getConnectionAsync(oatpp::async::Abstra
|
|||||||
class ConnectCoroutine : public oatpp::async::CoroutineWithResult<ConnectCoroutine, std::shared_ptr<oatpp::data::stream::IOStream>> {
|
class ConnectCoroutine : public oatpp::async::CoroutineWithResult<ConnectCoroutine, std::shared_ptr<oatpp::data::stream::IOStream>> {
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<virtual_::Interface> m_interface;
|
std::shared_ptr<virtual_::Interface> m_interface;
|
||||||
os::io::Library::v_size m_maxAvailableToRead;
|
data::v_io_size m_maxAvailableToRead;
|
||||||
os::io::Library::v_size m_maxAvailableToWrite;
|
data::v_io_size m_maxAvailableToWrite;
|
||||||
std::shared_ptr<virtual_::Interface::ConnectionSubmission> m_submission;
|
std::shared_ptr<virtual_::Interface::ConnectionSubmission> m_submission;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ConnectCoroutine(const std::shared_ptr<virtual_::Interface>& interface,
|
ConnectCoroutine(const std::shared_ptr<virtual_::Interface>& interface,
|
||||||
os::io::Library::v_size maxAvailableToRead,
|
data::v_io_size maxAvailableToRead,
|
||||||
os::io::Library::v_size maxAvailableToWrite)
|
data::v_io_size maxAvailableToWrite)
|
||||||
: m_interface(interface)
|
: m_interface(interface)
|
||||||
, m_maxAvailableToRead(maxAvailableToRead)
|
, m_maxAvailableToRead(maxAvailableToRead)
|
||||||
, m_maxAvailableToWrite(maxAvailableToWrite)
|
, m_maxAvailableToWrite(maxAvailableToWrite)
|
||||||
|
@ -33,8 +33,8 @@ namespace oatpp { namespace network { namespace virtual_ { namespace client {
|
|||||||
class ConnectionProvider : public oatpp::network::ClientConnectionProvider {
|
class ConnectionProvider : public oatpp::network::ClientConnectionProvider {
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<virtual_::Interface> m_interface;
|
std::shared_ptr<virtual_::Interface> m_interface;
|
||||||
os::io::Library::v_size m_maxAvailableToRead;
|
data::v_io_size m_maxAvailableToRead;
|
||||||
os::io::Library::v_size m_maxAvailableToWrite;
|
data::v_io_size m_maxAvailableToWrite;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ConnectionProvider(const std::shared_ptr<virtual_::Interface>& interface)
|
ConnectionProvider(const std::shared_ptr<virtual_::Interface>& interface)
|
||||||
@ -54,7 +54,7 @@ public:
|
|||||||
* this one used for testing purposes only
|
* this one used for testing purposes only
|
||||||
* set to -1 in order to ignore this value
|
* set to -1 in order to ignore this value
|
||||||
*/
|
*/
|
||||||
void setSocketMaxAvailableToReadWrtie(os::io::Library::v_size maxToRead, os::io::Library::v_size maxToWrite) {
|
void setSocketMaxAvailableToReadWrtie(data::v_io_size maxToRead, data::v_io_size maxToWrite) {
|
||||||
m_maxAvailableToRead = maxToRead;
|
m_maxAvailableToRead = maxToRead;
|
||||||
m_maxAvailableToWrite = maxToWrite;
|
m_maxAvailableToWrite = maxToWrite;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ namespace oatpp { namespace network { namespace virtual_ { namespace server {
|
|||||||
|
|
||||||
std::shared_ptr<ConnectionProvider::IOStream> ConnectionProvider::getConnection() {
|
std::shared_ptr<ConnectionProvider::IOStream> ConnectionProvider::getConnection() {
|
||||||
auto socket = m_interface->accept();
|
auto socket = m_interface->accept();
|
||||||
socket->setNonBlocking(false);
|
socket->setNonBlocking(m_nonBlocking);
|
||||||
socket->setMaxAvailableToReadWrtie(m_maxAvailableToRead, m_maxAvailableToWrite);
|
socket->setMaxAvailableToReadWrtie(m_maxAvailableToRead, m_maxAvailableToWrite);
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
@ -33,12 +33,14 @@ namespace oatpp { namespace network { namespace virtual_ { namespace server {
|
|||||||
class ConnectionProvider : public oatpp::network::ServerConnectionProvider {
|
class ConnectionProvider : public oatpp::network::ServerConnectionProvider {
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<virtual_::Interface> m_interface;
|
std::shared_ptr<virtual_::Interface> m_interface;
|
||||||
os::io::Library::v_size m_maxAvailableToRead;
|
bool m_nonBlocking;
|
||||||
os::io::Library::v_size m_maxAvailableToWrite;
|
data::v_io_size m_maxAvailableToRead;
|
||||||
|
data::v_io_size m_maxAvailableToWrite;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ConnectionProvider(const std::shared_ptr<virtual_::Interface>& interface)
|
ConnectionProvider(const std::shared_ptr<virtual_::Interface>& interface, bool nonBlocking = false)
|
||||||
: m_interface(interface)
|
: m_interface(interface)
|
||||||
|
, m_nonBlocking(nonBlocking)
|
||||||
, m_maxAvailableToRead(-1)
|
, m_maxAvailableToRead(-1)
|
||||||
, m_maxAvailableToWrite(-1)
|
, m_maxAvailableToWrite(-1)
|
||||||
{
|
{
|
||||||
@ -46,15 +48,15 @@ public:
|
|||||||
setProperty(PROPERTY_PORT, "0");
|
setProperty(PROPERTY_PORT, "0");
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::shared_ptr<ConnectionProvider> createShared(const std::shared_ptr<virtual_::Interface>& interface) {
|
static std::shared_ptr<ConnectionProvider> createShared(const std::shared_ptr<virtual_::Interface>& interface, bool nonBlocking = false) {
|
||||||
return std::make_shared<ConnectionProvider>(interface);
|
return std::make_shared<ConnectionProvider>(interface, nonBlocking);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* this one used for testing purposes only
|
* this one used for testing purposes only
|
||||||
* set to -1 in order to ignore this value
|
* set to -1 in order to ignore this value
|
||||||
*/
|
*/
|
||||||
void setSocketMaxAvailableToReadWrtie(os::io::Library::v_size maxToRead, os::io::Library::v_size maxToWrite) {
|
void setSocketMaxAvailableToReadWrtie(data::v_io_size maxToRead, data::v_io_size maxToWrite) {
|
||||||
m_maxAvailableToRead = maxToRead;
|
m_maxAvailableToRead = maxToRead;
|
||||||
m_maxAvailableToWrite = maxToWrite;
|
m_maxAvailableToWrite = maxToWrite;
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ oatpp::async::Action HttpRequestExecutor::executeAsync(oatpp::async::AbstractCor
|
|||||||
std::shared_ptr<oatpp::data::stream::IOStream> m_connection;
|
std::shared_ptr<oatpp::data::stream::IOStream> m_connection;
|
||||||
std::shared_ptr<oatpp::data::buffer::IOBuffer> m_ioBuffer;
|
std::shared_ptr<oatpp::data::buffer::IOBuffer> m_ioBuffer;
|
||||||
void* m_bufferPointer;
|
void* m_bufferPointer;
|
||||||
os::io::Library::v_size m_bufferBytesLeftToRead;
|
data::v_io_size m_bufferBytesLeftToRead;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ExecutorCoroutine(const std::shared_ptr<oatpp::network::ClientConnectionProvider>& connectionProvider,
|
ExecutorCoroutine(const std::shared_ptr<oatpp::network::ClientConnectionProvider>& connectionProvider,
|
||||||
|
@ -26,13 +26,13 @@
|
|||||||
|
|
||||||
namespace oatpp { namespace web { namespace protocol {
|
namespace oatpp { namespace web { namespace protocol {
|
||||||
|
|
||||||
CommunicationError::CommunicationError(oatpp::os::io::Library::v_size ioStatus, const oatpp::String& message)
|
CommunicationError::CommunicationError(oatpp::data::v_io_size ioStatus, const oatpp::String& message)
|
||||||
:std::runtime_error(message->std_str())
|
:std::runtime_error(message->std_str())
|
||||||
, m_ioStatus(ioStatus)
|
, m_ioStatus(ioStatus)
|
||||||
, m_message(message)
|
, m_message(message)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size CommunicationError::getIOStatus() {
|
oatpp::data::v_io_size CommunicationError::getIOStatus() {
|
||||||
return m_ioStatus;
|
return m_ioStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,19 +25,18 @@
|
|||||||
#ifndef oatpp_web_protocol_CommunicationError_hpp
|
#ifndef oatpp_web_protocol_CommunicationError_hpp
|
||||||
#define oatpp_web_protocol_CommunicationError_hpp
|
#define oatpp_web_protocol_CommunicationError_hpp
|
||||||
|
|
||||||
#include "oatpp/core/Types.hpp"
|
#include "oatpp/core/data/IODefinitions.hpp"
|
||||||
#include "oatpp/core/os/io/Library.hpp"
|
|
||||||
|
|
||||||
namespace oatpp { namespace web { namespace protocol {
|
namespace oatpp { namespace web { namespace protocol {
|
||||||
|
|
||||||
class CommunicationError : public std::runtime_error {
|
class CommunicationError : public std::runtime_error {
|
||||||
private:
|
private:
|
||||||
oatpp::os::io::Library::v_size m_ioStatus;
|
oatpp::data::v_io_size m_ioStatus;
|
||||||
oatpp::String m_message;
|
oatpp::String m_message;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
CommunicationError(oatpp::os::io::Library::v_size ioStatus, const oatpp::String& message);
|
CommunicationError(oatpp::data::v_io_size ioStatus, const oatpp::String& message);
|
||||||
oatpp::os::io::Library::v_size getIOStatus();
|
oatpp::data::v_io_size getIOStatus();
|
||||||
oatpp::String& getMessage();
|
oatpp::String& getMessage();
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -52,12 +51,12 @@ public:
|
|||||||
: ioStatus(0)
|
: ioStatus(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Info(oatpp::os::io::Library::v_size pIOStatus, const Status& pStatus)
|
Info(oatpp::data::v_io_size pIOStatus, const Status& pStatus)
|
||||||
: ioStatus(pIOStatus)
|
: ioStatus(pIOStatus)
|
||||||
, status(pStatus)
|
, status(pStatus)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size ioStatus;
|
oatpp::data::v_io_size ioStatus;
|
||||||
Status status;
|
Status status;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -159,8 +159,8 @@ Range Range::parse(oatpp::parser::ParsingCaret& caret) {
|
|||||||
caret.findRN();
|
caret.findRN();
|
||||||
endLabel.end();
|
endLabel.end();
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size start = oatpp::utils::conversion::strToInt64((const char*) startLabel.getData());
|
oatpp::data::v_io_size start = oatpp::utils::conversion::strToInt64((const char*) startLabel.getData());
|
||||||
oatpp::os::io::Library::v_size end = oatpp::utils::conversion::strToInt64((const char*) endLabel.getData());
|
oatpp::data::v_io_size end = oatpp::utils::conversion::strToInt64((const char*) endLabel.getData());
|
||||||
return Range(unitsLabel.toString(true), start, end);
|
return Range(unitsLabel.toString(true), start, end);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -220,9 +220,9 @@ ContentRange ContentRange::parse(oatpp::parser::ParsingCaret& caret) {
|
|||||||
caret.findRN();
|
caret.findRN();
|
||||||
sizeLabel.end();
|
sizeLabel.end();
|
||||||
|
|
||||||
oatpp::os::io::Library::v_size start = oatpp::utils::conversion::strToInt64((const char*) startLabel.getData());
|
oatpp::data::v_io_size start = oatpp::utils::conversion::strToInt64((const char*) startLabel.getData());
|
||||||
oatpp::os::io::Library::v_size end = oatpp::utils::conversion::strToInt64((const char*) endLabel.getData());
|
oatpp::data::v_io_size end = oatpp::utils::conversion::strToInt64((const char*) endLabel.getData());
|
||||||
oatpp::os::io::Library::v_size size = 0;
|
oatpp::data::v_io_size size = 0;
|
||||||
bool isSizeKnown = false;
|
bool isSizeKnown = false;
|
||||||
if(sizeLabel.getData()[0] != '*') {
|
if(sizeLabel.getData()[0] != '*') {
|
||||||
isSizeKnown = true;
|
isSizeKnown = true;
|
||||||
|
@ -188,16 +188,16 @@ private:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
Range(const oatpp::String& pUnits,
|
Range(const oatpp::String& pUnits,
|
||||||
const oatpp::os::io::Library::v_size& pStart,
|
const oatpp::data::v_io_size& pStart,
|
||||||
const oatpp::os::io::Library::v_size& pEnd)
|
const oatpp::data::v_io_size& pEnd)
|
||||||
: units(pUnits)
|
: units(pUnits)
|
||||||
, start(pStart)
|
, start(pStart)
|
||||||
, end(pEnd)
|
, end(pEnd)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
oatpp::String units;
|
oatpp::String units;
|
||||||
oatpp::os::io::Library::v_size start;
|
oatpp::data::v_io_size start;
|
||||||
oatpp::os::io::Library::v_size end;
|
oatpp::data::v_io_size end;
|
||||||
|
|
||||||
oatpp::String toString() const;
|
oatpp::String toString() const;
|
||||||
|
|
||||||
@ -220,9 +220,9 @@ private:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
ContentRange(const oatpp::String& pUnits,
|
ContentRange(const oatpp::String& pUnits,
|
||||||
const oatpp::os::io::Library::v_size& pStart,
|
const oatpp::data::v_io_size& pStart,
|
||||||
const oatpp::os::io::Library::v_size& pEnd,
|
const oatpp::data::v_io_size& pEnd,
|
||||||
const oatpp::os::io::Library::v_size& pSize,
|
const oatpp::data::v_io_size& pSize,
|
||||||
bool pIsSizeKnown)
|
bool pIsSizeKnown)
|
||||||
: units(pUnits)
|
: units(pUnits)
|
||||||
, start(pStart)
|
, start(pStart)
|
||||||
@ -232,9 +232,9 @@ public:
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
oatpp::String units;
|
oatpp::String units;
|
||||||
oatpp::os::io::Library::v_size start;
|
oatpp::data::v_io_size start;
|
||||||
oatpp::os::io::Library::v_size end;
|
oatpp::data::v_io_size end;
|
||||||
oatpp::os::io::Library::v_size size;
|
oatpp::data::v_io_size size;
|
||||||
bool isSizeKnown;
|
bool isSizeKnown;
|
||||||
|
|
||||||
oatpp::String toString() const;
|
oatpp::String toString() const;
|
||||||
|
@ -28,14 +28,14 @@
|
|||||||
|
|
||||||
namespace oatpp { namespace web { namespace protocol { namespace http { namespace incoming {
|
namespace oatpp { namespace web { namespace protocol { namespace http { namespace incoming {
|
||||||
|
|
||||||
os::io::Library::v_size RequestHeadersReader::readHeadersSection(const std::shared_ptr<oatpp::data::stream::IOStream>& connection,
|
data::v_io_size RequestHeadersReader::readHeadersSection(const std::shared_ptr<oatpp::data::stream::IOStream>& connection,
|
||||||
oatpp::data::stream::OutputStream* bufferStream,
|
oatpp::data::stream::OutputStream* bufferStream,
|
||||||
Result& result) {
|
Result& result) {
|
||||||
|
|
||||||
v_word32 sectionEnd = ('\r' << 24) | ('\n' << 16) | ('\r' << 8) | ('\n');
|
v_word32 sectionEnd = ('\r' << 24) | ('\n' << 16) | ('\r' << 8) | ('\n');
|
||||||
v_word32 accumulator = 0;
|
v_word32 accumulator = 0;
|
||||||
v_int32 progress = 0;
|
v_int32 progress = 0;
|
||||||
os::io::Library::v_size res;
|
data::v_io_size res;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
||||||
v_int32 desiredToRead = m_bufferSize;
|
v_int32 desiredToRead = m_bufferSize;
|
||||||
|
@ -47,7 +47,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
typedef Action (oatpp::async::AbstractCoroutine::*AsyncCallback)(const Result&);
|
typedef Action (oatpp::async::AbstractCoroutine::*AsyncCallback)(const Result&);
|
||||||
private:
|
private:
|
||||||
os::io::Library::v_size readHeadersSection(const std::shared_ptr<oatpp::data::stream::IOStream>& connection,
|
data::v_io_size readHeadersSection(const std::shared_ptr<oatpp::data::stream::IOStream>& connection,
|
||||||
oatpp::data::stream::OutputStream* bufferStream,
|
oatpp::data::stream::OutputStream* bufferStream,
|
||||||
Result& result);
|
Result& result);
|
||||||
private:
|
private:
|
||||||
|
@ -28,14 +28,14 @@
|
|||||||
|
|
||||||
namespace oatpp { namespace web { namespace protocol { namespace http { namespace incoming {
|
namespace oatpp { namespace web { namespace protocol { namespace http { namespace incoming {
|
||||||
|
|
||||||
os::io::Library::v_size ResponseHeadersReader::readHeadersSection(const std::shared_ptr<oatpp::data::stream::IOStream>& connection,
|
data::v_io_size ResponseHeadersReader::readHeadersSection(const std::shared_ptr<oatpp::data::stream::IOStream>& connection,
|
||||||
oatpp::data::stream::OutputStream* bufferStream,
|
oatpp::data::stream::OutputStream* bufferStream,
|
||||||
Result& result) {
|
Result& result) {
|
||||||
|
|
||||||
v_word32 sectionEnd = ('\r' << 24) | ('\n' << 16) | ('\r' << 8) | ('\n');
|
v_word32 sectionEnd = ('\r' << 24) | ('\n' << 16) | ('\r' << 8) | ('\n');
|
||||||
v_word32 accumulator = 0;
|
v_word32 accumulator = 0;
|
||||||
v_int32 progress = 0;
|
v_int32 progress = 0;
|
||||||
os::io::Library::v_size res;
|
data::v_io_size res;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
||||||
v_int32 desiredToRead = m_bufferSize;
|
v_int32 desiredToRead = m_bufferSize;
|
||||||
|
@ -47,7 +47,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
typedef Action (oatpp::async::AbstractCoroutine::*AsyncCallback)(const Result&);
|
typedef Action (oatpp::async::AbstractCoroutine::*AsyncCallback)(const Result&);
|
||||||
private:
|
private:
|
||||||
os::io::Library::v_size readHeadersSection(const std::shared_ptr<oatpp::data::stream::IOStream>& connection,
|
data::v_io_size readHeadersSection(const std::shared_ptr<oatpp::data::stream::IOStream>& connection,
|
||||||
oatpp::data::stream::OutputStream* bufferStream,
|
oatpp::data::stream::OutputStream* bufferStream,
|
||||||
Result& result);
|
Result& result);
|
||||||
private:
|
private:
|
||||||
|
@ -29,12 +29,12 @@
|
|||||||
|
|
||||||
namespace oatpp { namespace web { namespace protocol { namespace http { namespace incoming {
|
namespace oatpp { namespace web { namespace protocol { namespace http { namespace incoming {
|
||||||
|
|
||||||
os::io::Library::v_size SimpleBodyDecoder::readLine(const std::shared_ptr<oatpp::data::stream::InputStream>& fromStream,
|
data::v_io_size SimpleBodyDecoder::readLine(const std::shared_ptr<oatpp::data::stream::InputStream>& fromStream,
|
||||||
p_char8 buffer,
|
p_char8 buffer,
|
||||||
os::io::Library::v_size maxLineSize) {
|
data::v_io_size maxLineSize) {
|
||||||
|
|
||||||
v_char8 a;
|
v_char8 a;
|
||||||
os::io::Library::v_size count = 0;
|
data::v_io_size count = 0;
|
||||||
while (fromStream->read(&a, 1) > 0) {
|
while (fromStream->read(&a, 1) > 0) {
|
||||||
if(a != '\r') {
|
if(a != '\r') {
|
||||||
if(count + 1 > maxLineSize) {
|
if(count + 1 > maxLineSize) {
|
||||||
@ -62,7 +62,7 @@ void SimpleBodyDecoder::doChunkedDecoding(const std::shared_ptr<oatpp::data::str
|
|||||||
|
|
||||||
v_int32 maxLineSize = 8; // 0xFFFFFFFF 4Gb for chunk
|
v_int32 maxLineSize = 8; // 0xFFFFFFFF 4Gb for chunk
|
||||||
v_char8 lineBuffer[maxLineSize + 1];
|
v_char8 lineBuffer[maxLineSize + 1];
|
||||||
os::io::Library::v_size countToRead;
|
data::v_io_size countToRead;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ void SimpleBodyDecoder::decode(const Protocol::Headers& headers,
|
|||||||
if(transferEncodingIt != headers.end() && transferEncodingIt->second == Header::Value::TRANSFER_ENCODING_CHUNKED) {
|
if(transferEncodingIt != headers.end() && transferEncodingIt->second == Header::Value::TRANSFER_ENCODING_CHUNKED) {
|
||||||
doChunkedDecoding(bodyStream, toStream);
|
doChunkedDecoding(bodyStream, toStream);
|
||||||
} else {
|
} else {
|
||||||
oatpp::os::io::Library::v_size contentLength = 0;
|
oatpp::data::v_io_size contentLength = 0;
|
||||||
auto contentLengthStrIt = headers.find(Header::CONTENT_LENGTH);
|
auto contentLengthStrIt = headers.find(Header::CONTENT_LENGTH);
|
||||||
if(contentLengthStrIt == headers.end()) {
|
if(contentLengthStrIt == headers.end()) {
|
||||||
return; // DO NOTHING // it is an empty or invalid body
|
return; // DO NOTHING // it is an empty or invalid body
|
||||||
@ -127,7 +127,7 @@ oatpp::async::Action SimpleBodyDecoder::doChunkedDecodingAsync(oatpp::async::Abs
|
|||||||
bool m_lineEnding;
|
bool m_lineEnding;
|
||||||
v_char8 m_lineBuffer [16]; // used max 8
|
v_char8 m_lineBuffer [16]; // used max 8
|
||||||
void* m_skipData;
|
void* m_skipData;
|
||||||
os::io::Library::v_size m_skipSize;
|
data::v_io_size m_skipSize;
|
||||||
bool m_done = false;
|
bool m_done = false;
|
||||||
private:
|
private:
|
||||||
void prepareSkipRN() {
|
void prepareSkipRN() {
|
||||||
@ -187,7 +187,7 @@ oatpp::async::Action SimpleBodyDecoder::doChunkedDecodingAsync(oatpp::async::Abs
|
|||||||
}
|
}
|
||||||
|
|
||||||
Action onLineRead() {
|
Action onLineRead() {
|
||||||
os::io::Library::v_size countToRead = std::strtol((const char*) m_lineBuffer, nullptr, 16);
|
data::v_io_size countToRead = std::strtol((const char*) m_lineBuffer, nullptr, 16);
|
||||||
if(countToRead > 0) {
|
if(countToRead > 0) {
|
||||||
prepareSkipRN();
|
prepareSkipRN();
|
||||||
return oatpp::data::stream::transferAsync(this, yieldTo(&ChunkedDecoder::skipRN), m_fromStream, m_toStream, countToRead, m_buffer);
|
return oatpp::data::stream::transferAsync(this, yieldTo(&ChunkedDecoder::skipRN), m_fromStream, m_toStream, countToRead, m_buffer);
|
||||||
@ -226,7 +226,7 @@ oatpp::async::Action SimpleBodyDecoder::decodeAsync(oatpp::async::AbstractCorout
|
|||||||
if(transferEncodingIt != headers.end() && transferEncodingIt->second == Header::Value::TRANSFER_ENCODING_CHUNKED) {
|
if(transferEncodingIt != headers.end() && transferEncodingIt->second == Header::Value::TRANSFER_ENCODING_CHUNKED) {
|
||||||
return doChunkedDecodingAsync(parentCoroutine, actionOnReturn, bodyStream, toStream);
|
return doChunkedDecodingAsync(parentCoroutine, actionOnReturn, bodyStream, toStream);
|
||||||
} else {
|
} else {
|
||||||
oatpp::os::io::Library::v_size contentLength = 0;
|
oatpp::data::v_io_size contentLength = 0;
|
||||||
auto contentLengthStrIt = headers.find(Header::CONTENT_LENGTH);
|
auto contentLengthStrIt = headers.find(Header::CONTENT_LENGTH);
|
||||||
if(contentLengthStrIt == headers.end()) {
|
if(contentLengthStrIt == headers.end()) {
|
||||||
return actionOnReturn; // DO NOTHING // it is an empty or invalid body
|
return actionOnReturn; // DO NOTHING // it is an empty or invalid body
|
||||||
|
@ -31,9 +31,9 @@ namespace oatpp { namespace web { namespace protocol { namespace http { namespac
|
|||||||
|
|
||||||
class SimpleBodyDecoder : public BodyDecoder {
|
class SimpleBodyDecoder : public BodyDecoder {
|
||||||
private:
|
private:
|
||||||
static os::io::Library::v_size readLine(const std::shared_ptr<oatpp::data::stream::InputStream>& fromStream,
|
static data::v_io_size readLine(const std::shared_ptr<oatpp::data::stream::InputStream>& fromStream,
|
||||||
p_char8 buffer,
|
p_char8 buffer,
|
||||||
os::io::Library::v_size maxLineSize);
|
data::v_io_size maxLineSize);
|
||||||
static void doChunkedDecoding(const std::shared_ptr<oatpp::data::stream::InputStream>& from,
|
static void doChunkedDecoding(const std::shared_ptr<oatpp::data::stream::InputStream>& from,
|
||||||
const std::shared_ptr<oatpp::data::stream::OutputStream>& toStream);
|
const std::shared_ptr<oatpp::data::stream::OutputStream>& toStream);
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ public:
|
|||||||
std::shared_ptr<BufferBody> m_body;
|
std::shared_ptr<BufferBody> m_body;
|
||||||
std::shared_ptr<OutputStream> m_stream;
|
std::shared_ptr<OutputStream> m_stream;
|
||||||
const void* m_currData;
|
const void* m_currData;
|
||||||
oatpp::os::io::Library::v_size m_currDataSize;
|
oatpp::data::v_io_size m_currDataSize;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
WriteToStreamCoroutine(const std::shared_ptr<BufferBody>& body,
|
WriteToStreamCoroutine(const std::shared_ptr<BufferBody>& body,
|
||||||
|
@ -92,7 +92,7 @@ public:
|
|||||||
std::shared_ptr<oatpp::data::stream::ChunkedBuffer::Chunks> m_chunks;
|
std::shared_ptr<oatpp::data::stream::ChunkedBuffer::Chunks> m_chunks;
|
||||||
oatpp::data::stream::ChunkedBuffer::Chunks::LinkedListNode* m_currChunk;
|
oatpp::data::stream::ChunkedBuffer::Chunks::LinkedListNode* m_currChunk;
|
||||||
const void* m_currData;
|
const void* m_currData;
|
||||||
oatpp::os::io::Library::v_size m_currDataSize;
|
oatpp::data::v_io_size m_currDataSize;
|
||||||
Action m_nextAction;
|
Action m_nextAction;
|
||||||
v_char8 m_buffer[16];
|
v_char8 m_buffer[16];
|
||||||
public:
|
public:
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
void runTests() {
|
void runTests() {
|
||||||
OATPP_RUN_TEST(oatpp::test::base::RegRuleTest);
|
/*OATPP_RUN_TEST(oatpp::test::base::RegRuleTest);
|
||||||
OATPP_RUN_TEST(oatpp::test::base::CommandLineArgumentsTest);
|
OATPP_RUN_TEST(oatpp::test::base::CommandLineArgumentsTest);
|
||||||
OATPP_RUN_TEST(oatpp::test::memory::MemoryPoolTest);
|
OATPP_RUN_TEST(oatpp::test::memory::MemoryPoolTest);
|
||||||
OATPP_RUN_TEST(oatpp::test::memory::PerfTest);
|
OATPP_RUN_TEST(oatpp::test::memory::PerfTest);
|
||||||
@ -59,8 +59,8 @@ void runTests() {
|
|||||||
OATPP_RUN_TEST(oatpp::test::encoding::UnicodeTest);
|
OATPP_RUN_TEST(oatpp::test::encoding::UnicodeTest);
|
||||||
OATPP_RUN_TEST(oatpp::test::core::data::share::MemoryLabelTest);
|
OATPP_RUN_TEST(oatpp::test::core::data::share::MemoryLabelTest);
|
||||||
OATPP_RUN_TEST(oatpp::test::network::virtual_::PipeTest);
|
OATPP_RUN_TEST(oatpp::test::network::virtual_::PipeTest);
|
||||||
OATPP_RUN_TEST(oatpp::test::network::virtual_::InterfaceTest);
|
OATPP_RUN_TEST(oatpp::test::network::virtual_::InterfaceTest);*/
|
||||||
OATPP_RUN_TEST(oatpp::test::web::FullTest);
|
//OATPP_RUN_TEST(oatpp::test::web::FullTest);
|
||||||
OATPP_RUN_TEST(oatpp::test::web::FullAsyncTest);
|
OATPP_RUN_TEST(oatpp::test::web::FullAsyncTest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,14 +40,14 @@ namespace {
|
|||||||
typedef oatpp::network::virtual_::Pipe Pipe;
|
typedef oatpp::network::virtual_::Pipe Pipe;
|
||||||
|
|
||||||
const char* DATA_CHUNK = "<0123456789/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ>";
|
const char* DATA_CHUNK = "<0123456789/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ>";
|
||||||
const os::io::Library::v_size CHUNK_SIZE = std::strlen(DATA_CHUNK);
|
const data::v_io_size CHUNK_SIZE = std::strlen(DATA_CHUNK);
|
||||||
|
|
||||||
class WriterTask : public oatpp::concurrency::Runnable {
|
class WriterTask : public oatpp::concurrency::Runnable {
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Pipe> m_pipe;
|
std::shared_ptr<Pipe> m_pipe;
|
||||||
v_int32 m_chunksToTransfer;
|
v_int32 m_chunksToTransfer;
|
||||||
os::io::Library::v_size m_position = 0;
|
data::v_io_size m_position = 0;
|
||||||
os::io::Library::v_size m_transferedBytes = 0;
|
data::v_io_size m_transferedBytes = 0;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
WriterTask(const std::shared_ptr<Pipe>& pipe, v_int32 chunksToTransfer)
|
WriterTask(const std::shared_ptr<Pipe>& pipe, v_int32 chunksToTransfer)
|
||||||
|
@ -46,7 +46,7 @@ bool FullAsyncTest::onRun() {
|
|||||||
|
|
||||||
auto interface = oatpp::network::virtual_::Interface::createShared("virtualhost");
|
auto interface = oatpp::network::virtual_::Interface::createShared("virtualhost");
|
||||||
|
|
||||||
auto serverConnectionProvider = oatpp::network::virtual_::server::ConnectionProvider::createShared(interface);
|
auto serverConnectionProvider = oatpp::network::virtual_::server::ConnectionProvider::createShared(interface, true);
|
||||||
auto clientConnectionProvider = oatpp::network::virtual_::client::ConnectionProvider::createShared(interface);
|
auto clientConnectionProvider = oatpp::network::virtual_::client::ConnectionProvider::createShared(interface);
|
||||||
|
|
||||||
serverConnectionProvider->setSocketMaxAvailableToReadWrtie(1, 1);
|
serverConnectionProvider->setSocketMaxAvailableToReadWrtie(1, 1);
|
||||||
@ -69,21 +69,21 @@ bool FullAsyncTest::onRun() {
|
|||||||
std::thread clientThread([client, server, connectionHandler, objectMapper]{
|
std::thread clientThread([client, server, connectionHandler, objectMapper]{
|
||||||
|
|
||||||
for(v_int32 i = 0; i < 10; i ++) {
|
for(v_int32 i = 0; i < 10; i ++) {
|
||||||
|
/*
|
||||||
{ /* test simple GET */
|
{ // test simple GET
|
||||||
auto response = client->getRoot();
|
auto response = client->getRoot();
|
||||||
auto value = response->readBodyToString();
|
auto value = response->readBodyToString();
|
||||||
OATPP_ASSERT(value == "Hello World Async!!!");
|
OATPP_ASSERT(value == "Hello World Async!!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
{ /* test GET with path parameter */
|
{ // test GET with path parameter
|
||||||
auto response = client->getWithParams("my_test_param-Async");
|
auto response = client->getWithParams("my_test_param-Async");
|
||||||
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
||||||
OATPP_ASSERT(dto);
|
OATPP_ASSERT(dto);
|
||||||
OATPP_ASSERT(dto->testValue == "my_test_param-Async");
|
OATPP_ASSERT(dto->testValue == "my_test_param-Async");
|
||||||
}
|
}
|
||||||
|
|
||||||
{ /* test GET with header parameter */
|
{ // test GET with header parameter
|
||||||
auto response = client->getWithHeaders("my_test_header-Async");
|
auto response = client->getWithHeaders("my_test_header-Async");
|
||||||
//auto str = response->readBodyToString();
|
//auto str = response->readBodyToString();
|
||||||
//OATPP_LOGE("AAA", "code=%d, str='%s'", response->statusCode, str->c_str());
|
//OATPP_LOGE("AAA", "code=%d, str='%s'", response->statusCode, str->c_str());
|
||||||
@ -92,12 +92,24 @@ bool FullAsyncTest::onRun() {
|
|||||||
OATPP_ASSERT(dto->testValue == "my_test_header-Async");
|
OATPP_ASSERT(dto->testValue == "my_test_header-Async");
|
||||||
}
|
}
|
||||||
|
|
||||||
{ /* test POST with body */
|
{ // test POST with body
|
||||||
auto response = client->postBody("my_test_body-Async");
|
auto response = client->postBody("my_test_body-Async");
|
||||||
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
||||||
OATPP_ASSERT(dto);
|
OATPP_ASSERT(dto);
|
||||||
OATPP_ASSERT(dto->testValue == "my_test_body-Async");
|
OATPP_ASSERT(dto->testValue == "my_test_body-Async");
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
{ // test Big Echo with body
|
||||||
|
oatpp::data::stream::ChunkedBuffer stream;
|
||||||
|
for(v_int32 i = 0; i < oatpp::data::buffer::IOBuffer::BUFFER_SIZE; i++) {
|
||||||
|
stream.write("0123456789", 10);
|
||||||
|
}
|
||||||
|
auto data = stream.toString();
|
||||||
|
auto response = client->echoBody(data);
|
||||||
|
auto returnedData = response->readBodyToString();
|
||||||
|
OATPP_ASSERT(returnedData);
|
||||||
|
OATPP_ASSERT(returnedData == data);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,28 +71,28 @@ bool FullTest::onRun() {
|
|||||||
std::thread clientThread([client, server, objectMapper]{
|
std::thread clientThread([client, server, objectMapper]{
|
||||||
|
|
||||||
for(v_int32 i = 0; i < 10; i ++) {
|
for(v_int32 i = 0; i < 10; i ++) {
|
||||||
|
|
||||||
{ /* test simple GET */
|
{ // test simple GET
|
||||||
auto response = client->getRoot();
|
auto response = client->getRoot();
|
||||||
auto value = response->readBodyToString();
|
auto value = response->readBodyToString();
|
||||||
OATPP_ASSERT(value == "Hello World!!!");
|
OATPP_ASSERT(value == "Hello World!!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
{ /* test GET with path parameter */
|
{ // test GET with path parameter
|
||||||
auto response = client->getWithParams("my_test_param");
|
auto response = client->getWithParams("my_test_param");
|
||||||
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
||||||
OATPP_ASSERT(dto);
|
OATPP_ASSERT(dto);
|
||||||
OATPP_ASSERT(dto->testValue == "my_test_param");
|
OATPP_ASSERT(dto->testValue == "my_test_param");
|
||||||
}
|
}
|
||||||
|
|
||||||
{ /* test GET with header parameter */
|
{ // test GET with header parameter
|
||||||
auto response = client->getWithHeaders("my_test_header");
|
auto response = client->getWithHeaders("my_test_header");
|
||||||
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
||||||
OATPP_ASSERT(dto);
|
OATPP_ASSERT(dto);
|
||||||
OATPP_ASSERT(dto->testValue == "my_test_header");
|
OATPP_ASSERT(dto->testValue == "my_test_header");
|
||||||
}
|
}
|
||||||
|
|
||||||
{ /* test POST with body */
|
{ // test POST with body
|
||||||
auto response = client->postBody("my_test_body");
|
auto response = client->postBody("my_test_body");
|
||||||
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
auto dto = response->readBodyToDto<app::TestDto>(objectMapper);
|
||||||
OATPP_ASSERT(dto);
|
OATPP_ASSERT(dto);
|
||||||
|
@ -39,6 +39,7 @@ class Client : public oatpp::web::client::ApiClient {
|
|||||||
API_CALL("GET", "params/{param}", getWithParams, PATH(String, param))
|
API_CALL("GET", "params/{param}", getWithParams, PATH(String, param))
|
||||||
API_CALL("GET", "headers", getWithHeaders, HEADER(String, param, "X-TEST-HEADER"))
|
API_CALL("GET", "headers", getWithHeaders, HEADER(String, param, "X-TEST-HEADER"))
|
||||||
API_CALL("POST", "body", postBody, BODY_STRING(String, body))
|
API_CALL("POST", "body", postBody, BODY_STRING(String, body))
|
||||||
|
API_CALL("POST", "echo", echoBody, BODY_STRING(String, body))
|
||||||
|
|
||||||
#include OATPP_CODEGEN_END(ApiClient)
|
#include OATPP_CODEGEN_END(ApiClient)
|
||||||
};
|
};
|
||||||
|
@ -39,7 +39,7 @@ private:
|
|||||||
static constexpr const char* TAG = "test::web::app::ControllerAsync";
|
static constexpr const char* TAG = "test::web::app::ControllerAsync";
|
||||||
public:
|
public:
|
||||||
ControllerAsync(const std::shared_ptr<ObjectMapper>& objectMapper)
|
ControllerAsync(const std::shared_ptr<ObjectMapper>& objectMapper)
|
||||||
: oatpp::web::server::api::ApiController(objectMapper)
|
: oatpp::web::server::api::ApiController(objectMapper)
|
||||||
{}
|
{}
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -105,6 +105,22 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ENDPOINT_ASYNC("POST", "echo", Echo) {
|
||||||
|
|
||||||
|
ENDPOINT_ASYNC_INIT(Echo)
|
||||||
|
|
||||||
|
Action act() {
|
||||||
|
OATPP_LOGD(TAG, "POST body(echo). Reading body...");
|
||||||
|
return request->readBodyToStringAsync(this, &PostBody::onBodyRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
Action onBodyRead(const String& body) {
|
||||||
|
OATPP_LOGD(TAG, "POST echo size=%d", body->getSize());
|
||||||
|
return _return(controller->createResponse(Status::CODE_200, body));
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
#include OATPP_CODEGEN_END(ApiController)
|
#include OATPP_CODEGEN_END(ApiController)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user