mirror of
https://github.com/oatpp/oatpp.git
synced 2025-02-23 17:40:28 +08:00
Refactor. Multipart reader.
This commit is contained in:
parent
75e8ab283c
commit
bc5df03d05
@ -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) {
|
||||
|
@ -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>
|
||||
|
@ -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");
|
||||
|
@ -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");
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user