Refactor. Multipart reader.

This commit is contained in:
lganzzzo 2019-12-30 16:56:49 +02:00
parent 75e8ab283c
commit bc5df03d05
5 changed files with 54 additions and 16 deletions

View File

@ -136,14 +136,52 @@ void AsyncPartsParser::setDefaultPartReader(const std::shared_ptr<AsyncPartReade
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// InMemoryReader
Reader::Reader(Multipart* multipart)
Reader::Reader(Multipart* multipart, data::stream::ReadCallback* readCallback)
: m_partsParser(std::make_shared<PartsParser>(multipart))
, m_parser(multipart->getBoundary(), m_partsParser, nullptr)
, m_readCallback(readCallback)
{}
data::v_io_size Reader::write(const void *data, v_buff_size count) {
m_parser.parseNext((p_char8) data, count);
return count;
void Reader::readAll() {
data::v_io_size res = -1;
data::buffer::IOBuffer buffer;
while(!m_parser.finished()) {
res = m_readCallback->read(buffer.getData(), buffer.getSize());
if(res > 0) {
m_parser.parseNext((p_char8)buffer.getData(), res);
} else {
switch(res) {
case data::IOError::RETRY_READ:
continue;
case data::IOError::RETRY_WRITE:
continue;
case data::IOError::SUGGEST_ACTION_READ:
throw std::runtime_error("[oatpp::web::mime::multipart::Reader::readAll()]: "
"Error. Async SUGGEST_ACTION_READ requested. "
"ReadCallback should not operate in Async mode. ");
case data::IOError::SUGGEST_ACTION_WRITE:
throw std::runtime_error("[oatpp::web::mime::multipart::Reader::readAll()]: "
"Error. Async SUGGEST_ACTION_WRITE requested. "
"ReadCallback should not operate in Async mode.");
default:
return;
}
}
}
}
void Reader::setPartReader(const oatpp::String& partName, const std::shared_ptr<PartReader>& reader) {

View File

@ -170,21 +170,21 @@ public:
/**
* In memory Multipart reader.
* Extends - &id:oatpp::data::stream::WriteCallback;.
*/
class Reader : public oatpp::data::stream::WriteCallback {
class Reader {
private:
std::shared_ptr<PartsParser> m_partsParser;
StatefulParser m_parser;
data::stream::ReadCallback* m_readCallback;
public:
/**
* Constructor.
* @param multipart - Multipart object to save read data to.
*/
Reader(Multipart* multipart);
Reader(Multipart* multipart, data::stream::ReadCallback*);
data::v_io_size write(const void *data, v_buff_size count) override;
void readAll();
/**
* Set named part reader. <br>

View File

@ -240,11 +240,11 @@ void FullAsyncTest::onRun() {
multipart = std::make_shared<oatpp::web::mime::multipart::Multipart>(response->getHeaders());
oatpp::web::mime::multipart::Reader multipartReader(multipart.get());
oatpp::web::mime::multipart::Reader multipartReader(multipart.get(), response->getBodyStream().get());
multipartReader.setPartReader("value1", std::make_shared<oatpp::web::mime::multipart::InMemoryPartReader>(10));
multipartReader.setPartReader("value2", std::make_shared<oatpp::web::mime::multipart::InMemoryPartReader>(10));
response->transferBody(&multipartReader);
multipartReader.readAll();
OATPP_ASSERT(multipart->getAllParts().size() == 2);
auto part1 = multipart->getNamedPart("value1");

View File

@ -415,11 +415,11 @@ void FullTest::onRun() {
multipart = std::make_shared<oatpp::web::mime::multipart::Multipart>(response->getHeaders());
oatpp::web::mime::multipart::Reader multipartReader(multipart.get());
oatpp::web::mime::multipart::Reader multipartReader(multipart.get(), response->getBodyStream().get());
multipartReader.setPartReader("value1", std::make_shared<oatpp::web::mime::multipart::InMemoryPartReader>(10));
multipartReader.setPartReader("value2", std::make_shared<oatpp::web::mime::multipart::InMemoryPartReader>(10));
response->transferBody(&multipartReader);
multipartReader.readAll();
OATPP_ASSERT(multipart->getAllParts().size() == 2);
auto part1 = multipart->getNamedPart("value1");

View File

@ -206,10 +206,10 @@ public:
auto multipart = std::make_shared<oatpp::web::mime::multipart::Multipart>(request->getHeaders());
oatpp::web::mime::multipart::Reader multipartReader(multipart.get());
oatpp::web::mime::multipart::Reader multipartReader(multipart.get(), request->getBodyStream().get());
multipartReader.setDefaultPartReader(std::make_shared<oatpp::web::mime::multipart::InMemoryPartReader>(10));
request->transferBody(&multipartReader);
multipartReader.readAll();
auto responseBody = std::make_shared<oatpp::web::protocol::http::outgoing::MultipartBody>(multipart, chunkSize->getValue());
@ -225,7 +225,7 @@ public:
auto multipart = std::make_shared<multipart::Multipart>(request->getHeaders());
/* Create multipart reader. */
multipart::Reader multipartReader(multipart.get());
multipart::Reader multipartReader(multipart.get(), request->getBodyStream().get());
/* Configure to read part with name "part1" into memory */
multipartReader.setPartReader("part1", multipart::createInMemoryPartReader(256 /* max-data-size */));
@ -237,7 +237,7 @@ public:
multipartReader.setDefaultPartReader(multipart::createInMemoryPartReader(16 * 1024 /* max-data-size */));
/* Read multipart body */
request->transferBody(&multipartReader);
multipartReader.readAll();
/* Print number of uploaded parts */
OATPP_LOGD("Multipart", "parts_count=%d", multipart->count());