1 #include <samchon/protocol/IWebClientBase.hpp> 5 #include <boost/asio.hpp> 7 #include <samchon/ByteArray.hpp> 8 #include <samchon/WeakString.hpp> 9 #include <samchon/library/XML.hpp> 10 #include <samchon/protocol/Invoke.hpp> 20 IWebClientBase::IWebClientBase()
30 shared_ptr<Invoke> binaryInvoke;
33 unsigned char mask = DIRECTION() == SERVER ? 128 : 0;
38 boost::system::error_code error;
41 socket->read_some(boost::asio::buffer(piece), error);
49 unsigned char typeHeader = piece.
read<
unsigned char>();
50 if (piece.leftSize() == 0)
54 unsigned char sizeHeader = piece.
read<
unsigned char>() - mask;
55 if (piece.leftSize() == 0)
60 if (sizeHeader == 126)
62 if (piece.leftSize() <
sizeof(
unsigned short))
63 listenMoreBytes(piece, error);
70 else if (sizeHeader == 127)
72 if (piece.leftSize() <
sizeof(
unsigned long long))
73 listenMoreBytes(piece, error);
82 if (typeHeader == (
unsigned char)129)
83 binaryInvoke = listenString(size, piece, error);
84 else if (typeHeader == (
unsigned char)130 && binaryInvoke !=
nullptr)
85 listenBinary(size, piece, binaryInvoke, error);
91 auto IWebClientBase::listenString(
size_t size,
ByteArray &piece, boost::system::error_code &error) -> shared_ptr<Invoke>
96 data.append(piece.
read<
string>());
99 while (data.size() < size)
102 socket->read_some(boost::asio::buffer(piece), error);
104 data.append(piece.
read<
string>());
108 size_t start = data.find(
"<invoke listener=");
109 size_t end = data.rfind(
"</invoke>");
110 if (start == string::npos || end == string::npos)
113 WeakString wstr(&data[0], &data[end +
string(
"</invoke").size()]);
114 shared_ptr<XML> xml(
new XML(wstr));
116 shared_ptr<Invoke> invoke(
new Invoke());
117 invoke->construct(xml);
119 for (
size_t i = 0; i < invoke->size(); i++)
120 if (invoke->at(i)->getType() ==
"ByteArray")
126 void IWebClientBase::listenBinary(
size_t size,
ByteArray &piece, shared_ptr<Invoke> invoke, boost::system::error_code &error)
131 for (paramIndex = 0; paramIndex < invoke->size(); paramIndex++)
132 if (invoke->at(paramIndex)->getType() ==
"ByteArray")
135 if (byteArray.size() == 0 && byteArray.capacity() == size)
149 piece.begin() + std::min(piece.size(), size)
152 while (data->size() < size)
155 socket->read_some(boost::asio::buffer(piece), error);
161 piece.begin() + std::min(piece.size(), size - data->size())
165 for(
size_t i = paramIndex + 1; i < invoke->size(); i++)
166 if(invoke->at(i)->getType() ==
"ByteArray")
172 void IWebClientBase::listenMoreBytes(
ByteArray &piece, boost::system::error_code &error)
177 socket->read_some(boost::asio::buffer(piece), error);
181 piece.
write(myPiece);
186 unique_lock<mutex> uk(*
sendMtx);
187 boost::system::error_code error;
189 sendString(invoke->toXML()->toString(), error);
194 for (
size_t i = 0; i < invoke->size(); i++)
195 if (invoke->at(i)->getType() ==
"ByteArray")
197 sendBinary(invoke->at(i)->referValue<
ByteArray>(), error);
207 void IWebClientBase::sendSizeHeader(
unsigned char type,
size_t size, boost::system::error_code &error)
212 unsigned char mask = (DIRECTION() == CLIENT) ? 128 : 0;
216 header.
write((
unsigned char)size + mask);
218 else if (size <= 66535)
220 header.
write((
unsigned char)126 + mask);
225 header.
write((
unsigned char)127 + mask);
229 socket->write_some(boost::asio::buffer(header), error);
232 void IWebClientBase::sendString(
const string &data, boost::system::error_code &error)
234 sendSizeHeader(TEXT_HEADER, data.size(), error);
239 socket->write_some(boost::asio::buffer(data), error);
if (error)
return;
241 void IWebClientBase::sendBinary(
const ByteArray &data, boost::system::error_code &error)
243 sendSizeHeader(BINARY_HEADER, data.size(), error);
248 socket->write_some(boost::asio::buffer(data), error);
if (error)
return;
auto getPosition() const -> size_t
Get position.
virtual void sendData(std::shared_ptr< Invoke >) override
Sends message to a related system.
virtual void listen() override
Listens message from a related system.
auto read() const -> T
Read data.
void writeReversely(const T &val)
Write a data.
std::mutex * sendMtx
A mutex for sending message.
Package of network protocol and libraries.
An interface for a client.
Standard message of network I/O.
Socket * socket
Socket for network I/O.
virtual void _replyData(std::shared_ptr< Invoke >)
A method for pre-processing replied Invoke message.
XML is a class representing xml object.
auto readReversely() const -> T
Read a reversed data.
virtual auto BUFFER_SIZE() const -> size_t
Buffer size of network I/O.
Top level namespace of products built from samchon.
void write(const T &val)
Write a data.
A string class only references characeters, reference only.