Updated brynet to 1.0.9.

This commit is contained in:
Relintai 2021-01-29 17:26:17 +01:00
parent 4b64bf5864
commit bf688577fb
7 changed files with 268 additions and 96 deletions

View File

@ -29,11 +29,11 @@ void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, Web
std::cout << "frame enter of type:" << int(opcode) << std::endl; std::cout << "frame enter of type:" << int(opcode) << std::endl;
std::cout << "payload is:" << payload << std::endl; std::cout << "payload is:" << payload << std::endl;
// echo frame // echo frame
auto frame = std::make_shared<std::string>(); //auto frame = std::make_shared<std::string>();
WebSocketFormat::wsFrameBuild(payload.c_str(), payload.size(), *frame, WebSocketFormat::WebSocketFrameType::TEXT_FRAME, true, false); //WebSocketFormat::wsFrameBuild(payload.c_str(), payload.size(), *frame, WebSocketFormat::WebSocketFrameType::TEXT_FRAME, true, false);
httpSession->send(frame); //httpSession->send(frame);
} }
void HTTPServer::configure() { void HTTPServer::configure() {

View File

@ -1,3 +1,3 @@
#pragma once #pragma once
#define BRYNET_VERSION 1008000 #define BRYNET_VERSION 1009000

View File

@ -11,6 +11,6 @@
#endif #endif
#if (__cplusplus >= 201703L || \ #if (__cplusplus >= 201703L || \
(defined(_MSC_VER) && _MSC_VER >= 1910)) (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L))
#define BRYNET_HAVE_LANG_CXX17 1 #define BRYNET_HAVE_LANG_CXX17 1
#endif #endif

View File

@ -16,7 +16,7 @@ namespace brynet { namespace base {
public: public:
BasePacketWriter(char* buffer, BasePacketWriter(char* buffer,
size_t len, size_t len,
bool useBigEndian = true, bool useBigEndian = false,
bool isAutoMalloc = false) bool isAutoMalloc = false)
: :
mIsAutoMalloc(isAutoMalloc), mIsAutoMalloc(isAutoMalloc),
@ -248,49 +248,85 @@ namespace brynet { namespace base {
public: public:
BasePacketReader(const char* buffer, BasePacketReader(const char* buffer,
size_t len, size_t len,
bool useBigEndian = true) : bool useBigEndian = false) :
mBigEndian(useBigEndian), mBigEndian(useBigEndian),
mMaxLen(len) mSize(len)
{ {
mPos = 0; mPos = 0;
mSavedPos = 0;
mBuffer = buffer; mBuffer = buffer;
} }
virtual ~BasePacketReader() = default; virtual ~BasePacketReader() = default;
void useBigEndian()
{
mBigEndian = true;
}
void useLittleEndian()
{
mBigEndian = false;
}
void savePos()
{
mSavedPos = mPos;
}
size_t savedPos() const
{
return mSavedPos;
}
size_t getLeft() const size_t getLeft() const
{ {
if (mPos > mMaxLen) if (mPos > mSize)
{ {
throw std::out_of_range("current pos is greater than max len"); throw std::out_of_range("current pos is greater than max len");
} }
return mMaxLen - mPos; return mSize - mPos;
} }
const char* getBuffer() const bool enough(size_t len) const
{
if (mPos > mSize)
{
return false;
}
return (mSize - mPos) >= len;
}
const char* begin() const
{ {
return mBuffer; return mBuffer;
} }
void skipAll() const char* currentBuffer() const
{ {
mPos = mMaxLen; return mBuffer+mPos;
} }
size_t getPos() const void consumeAll()
{
mPos = mSize;
savePos();
}
size_t currentPos() const
{ {
return mPos; return mPos;
} }
size_t getMaxPos() const size_t size() const
{ {
return mMaxLen; return mSize;
} }
void addPos(size_t diff) void addPos(size_t diff)
{ {
const auto tmpPos = mPos + diff; const auto tmpPos = mPos + diff;
if (tmpPos > mMaxLen) if (tmpPos > mSize)
{ {
throw std::out_of_range("diff is to big"); throw std::out_of_range("diff is to big");
} }
@ -360,11 +396,11 @@ namespace brynet { namespace base {
void read(T& value) void read(T& value)
{ {
static_assert(std::is_same<T, typename std::remove_pointer<T>::type>::value, static_assert(std::is_same<T, typename std::remove_pointer<T>::type>::value,
"T must a nomal type"); "T must a normal type");
static_assert(std::is_pod<T>::value, static_assert(std::is_pod<T>::value,
"T must a pod type"); "T must a pod type");
if ((mPos + sizeof(value)) > mMaxLen) if ((mPos + sizeof(value)) > mSize)
{ {
throw std::out_of_range("T size is to big"); throw std::out_of_range("T size is to big");
} }
@ -374,17 +410,18 @@ namespace brynet { namespace base {
} }
protected: protected:
const bool mBigEndian; bool mBigEndian;
const size_t mMaxLen; const size_t mSize;
const char* mBuffer; const char* mBuffer;
size_t mPos; size_t mPos;
size_t mSavedPos;
}; };
template<size_t SIZE> template<size_t SIZE>
class AutoMallocPacket : public BasePacketWriter class AutoMallocPacket : public BasePacketWriter
{ {
public: public:
explicit AutoMallocPacket(bool useBigEndian = true, explicit AutoMallocPacket(bool useBigEndian = false,
bool isAutoMalloc = false) bool isAutoMalloc = false)
: :
BasePacketWriter(mData, SIZE, useBigEndian, isAutoMalloc) BasePacketWriter(mData, SIZE, useBigEndian, isAutoMalloc)

View File

@ -144,9 +144,10 @@ namespace brynet { namespace net {
std::shared_ptr<PromiseReceive> setupPromiseReceive(const TcpConnection::Ptr& session) std::shared_ptr<PromiseReceive> setupPromiseReceive(const TcpConnection::Ptr& session)
{ {
auto promiseReceive = std::make_shared<PromiseReceive>(); auto promiseReceive = std::make_shared<PromiseReceive>();
session->setDataCallback([promiseReceive](const char* buffer, session->setDataCallback([promiseReceive](brynet::base::BasePacketReader& reader) {
size_t len) { auto procLen = promiseReceive->process(reader.begin(), reader.size());
return promiseReceive->process(buffer, len); reader.addPos(procLen);
reader.savePos();
}); });
return promiseReceive; return promiseReceive;

View File

@ -7,12 +7,14 @@
#include <cassert> #include <cassert>
#include <cstring> #include <cstring>
#include <cmath> #include <cmath>
#include <type_traits>
#include <brynet/base/Buffer.hpp> #include <brynet/base/Buffer.hpp>
#include <brynet/base/Timer.hpp> #include <brynet/base/Timer.hpp>
#include <brynet/base/NonCopyable.hpp> #include <brynet/base/NonCopyable.hpp>
#include <brynet/base/Any.hpp> #include <brynet/base/Any.hpp>
#include <brynet/base/Noexcept.hpp> #include <brynet/base/Noexcept.hpp>
#include <brynet/base/Packet.hpp>
#include <brynet/net/SocketLibFunction.hpp> #include <brynet/net/SocketLibFunction.hpp>
#include <brynet/net/Channel.hpp> #include <brynet/net/Channel.hpp>
#include <brynet/net/EventLoop.hpp> #include <brynet/net/EventLoop.hpp>
@ -34,6 +36,53 @@ extern "C" {
namespace brynet { namespace net { namespace brynet { namespace net {
class SendableMsg
{
public:
using Ptr = std::shared_ptr<SendableMsg>;
virtual ~SendableMsg() = default;
virtual const void * data() = 0;
virtual size_t size() = 0;
};
class StringSendMsg : public SendableMsg
{
public:
explicit StringSendMsg(const char* buffer, size_t len)
:
mMsg(buffer, len)
{}
explicit StringSendMsg(std::string buffer)
:
mMsg(std::move(buffer))
{}
const void* data() override
{
return static_cast<const void*>(mMsg.data());
}
size_t size() override
{
return mMsg.size();
}
private:
std::string mMsg;
};
static SendableMsg::Ptr MakeStringMsg(const char* buffer, size_t len)
{
return std::make_shared<StringSendMsg>(buffer, len);
}
static SendableMsg::Ptr MakeStringMsg(std::string buffer)
{
return std::make_shared<StringSendMsg>(std::move(buffer));
}
class TcpConnection : public Channel, class TcpConnection : public Channel,
public brynet::base::NonCopyable, public brynet::base::NonCopyable,
public std::enable_shared_from_this<TcpConnection> public std::enable_shared_from_this<TcpConnection>
@ -42,11 +91,10 @@ namespace brynet { namespace net {
using Ptr = std::shared_ptr<TcpConnection>; using Ptr = std::shared_ptr<TcpConnection>;
using EnterCallback = std::function<void(Ptr)>; using EnterCallback = std::function<void(Ptr)>;
using DataCallback = std::function<size_t(const char* buffer, size_t len)>; using DataCallback = std::function<void(brynet::base::BasePacketReader&)>;
using DisconnectedCallback = std::function<void(Ptr)>; using DisconnectedCallback = std::function<void(Ptr)>;
using PacketSendedCallback = std::function<void(void)>; using PacketSendedCallback = std::function<void(void)>;
using HighWaterCallback = std::function<void(void)>;
using PacketPtr = std::shared_ptr<std::string>;
public: public:
Ptr static Create(TcpSocket::Ptr socket, Ptr static Create(TcpSocket::Ptr socket,
@ -104,9 +152,9 @@ namespace brynet { namespace net {
#endif #endif
eventLoop->runAsyncFunctor([session]() eventLoop->runAsyncFunctor([session]()
{ {
session->onEnterEventLoop(); session->onEnterEventLoop();
}); });
return session; return session;
} }
@ -116,56 +164,79 @@ namespace brynet { namespace net {
} }
//TODO::如果所属EventLoop已经没有工作则可能导致内存无限大因为所投递的请求都没有得到处理 //TODO::如果所属EventLoop已经没有工作则可能导致内存无限大因为所投递的请求都没有得到处理
void send(
const SendableMsg::Ptr& msg,
PacketSendedCallback&& callback = nullptr
)
{
auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor([sharedThis, msg, callback]() mutable
{
if(sharedThis->mAlreadyClose)
{
return;
}
const auto len = msg->size();
sharedThis->mSendingMsgSize += len;
sharedThis->mSendList.emplace_back(PendingPacket{
std::move(msg),
len,
std::move(callback) });
sharedThis->runAfterFlush();
if(sharedThis->mSendingMsgSize > sharedThis->mHighWaterSize &&
sharedThis->mHighWaterCallback != nullptr)
{
sharedThis->mHighWaterCallback();
}
});
}
void send( void send(
const char* buffer, const char* buffer,
size_t len, size_t len,
PacketSendedCallback&& callback = nullptr) PacketSendedCallback&& callback = nullptr)
{ {
send(makePacket(buffer, len), std::move(callback)); send(MakeStringMsg(buffer, len), std::move(callback));
} }
template<typename PacketType>
void send( void send(
PacketType&& packet, std::string buffer,
PacketSendedCallback&& PacketSendedCallback&& callback = nullptr)
callback = nullptr)
{ {
auto packetCapture = std::forward<PacketType>(packet); send(MakeStringMsg(std::move(buffer)), std::move(callback));
auto callbackCapture = std::move(callback);
auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor(
[sharedThis, packetCapture, callbackCapture]() mutable {
const auto len = packetCapture->size();
sharedThis->mSendList.emplace_back(PendingPacket{
std::move(packetCapture),
len,
std::move(callbackCapture) });
sharedThis->runAfterFlush();
});
} }
void setDataCallback(DataCallback&& cb) // setDataCallback(std::function<void(brynet::base::BasePacketReader&)>
template<typename Callback>
void setDataCallback(Callback&& cb)
{ {
verifyArgType(cb, &Callback::operator());
auto sharedThis = shared_from_this(); auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor([sharedThis, cb]() mutable { mEventLoop->runAsyncFunctor([sharedThis, cb]() mutable
sharedThis->mDataCallback = std::move(cb); {
sharedThis->mDataCallback = cb;
sharedThis->processRecvMessage(); sharedThis->processRecvMessage();
}); });
} }
void setDisConnectCallback(DisconnectedCallback&& cb) void setDisConnectCallback(DisconnectedCallback&& cb)
{ {
auto sharedThis = shared_from_this(); auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor([sharedThis, cb]() mutable { mEventLoop->runAsyncFunctor([sharedThis, cb]() mutable
{
sharedThis->mDisConnectCallback = std::move(cb); sharedThis->mDisConnectCallback = std::move(cb);
}); });
} }
/* if checkTime is zero, will cancel check heartbeat */ /* if checkTime is zero, will cancel check heartbeat */
void setHeartBeat(std::chrono::nanoseconds checkTime) void setHeartBeat(std::chrono::nanoseconds checkTime)
{ {
auto sharedThis = shared_from_this(); auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor([sharedThis, checkTime]() { mEventLoop->runAsyncFunctor([sharedThis, checkTime]()
{
if (sharedThis->mTimer.lock() != nullptr) if (sharedThis->mTimer.lock() != nullptr)
{ {
sharedThis->mTimer.lock()->cancel(); sharedThis->mTimer.lock()->cancel();
@ -174,25 +245,50 @@ namespace brynet { namespace net {
sharedThis->mCheckTime = checkTime; sharedThis->mCheckTime = checkTime;
sharedThis->startPingCheckTimer(); sharedThis->startPingCheckTimer();
});
}
void setHighWaterCallback(HighWaterCallback cb, size_t size)
{
auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor([=]() mutable
{
sharedThis->mHighWaterCallback = std::move(cb);
sharedThis->mHighWaterSize = size;
});
}
void postShrinkReceiveBuffer()
{
auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor([=]()
{
mEventLoop->runFunctorAfterLoop([=]()
{
sharedThis->shrinkReceiveBuffer();
}); });
});
} }
void postDisConnect() void postDisConnect()
{ {
auto sharedThis = shared_from_this(); auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor([sharedThis]() { mEventLoop->runAsyncFunctor([sharedThis]()
{
sharedThis->procCloseInLoop(); sharedThis->procCloseInLoop();
}); });
} }
void postShutdown() void postShutdown()
{ {
auto sharedThis = shared_from_this(); auto sharedThis = shared_from_this();
mEventLoop->runAsyncFunctor([sharedThis]() { mEventLoop->runAsyncFunctor([sharedThis]()
sharedThis->mEventLoop->runFunctorAfterLoop([sharedThis]() { {
sharedThis->mEventLoop->runFunctorAfterLoop([sharedThis]()
{
sharedThis->procShutdownInLoop(); sharedThis->procShutdownInLoop();
});
}); });
});
} }
const std::string& getIP() const const std::string& getIP() const
@ -200,11 +296,6 @@ namespace brynet { namespace net {
return mIP; return mIP;
} }
static TcpConnection::PacketPtr makePacket(const char* buffer, size_t len)
{
return std::make_shared<std::string>(buffer, len);
}
protected: protected:
TcpConnection(TcpSocket::Ptr socket, TcpConnection(TcpSocket::Ptr socket,
size_t maxRecvBufferSize, size_t maxRecvBufferSize,
@ -221,7 +312,9 @@ namespace brynet { namespace net {
mEventLoop(std::move(eventLoop)), mEventLoop(std::move(eventLoop)),
mAlreadyClose(false), mAlreadyClose(false),
mMaxRecvBufferSize(maxRecvBufferSize), mMaxRecvBufferSize(maxRecvBufferSize),
mEnterCallback(std::move(enterCallback)) mSendingMsgSize(0),
mEnterCallback(std::move(enterCallback)),
mHighWaterSize(0)
{ {
mRecvData = false; mRecvData = false;
mCheckTime = std::chrono::steady_clock::duration::zero(); mCheckTime = std::chrono::steady_clock::duration::zero();
@ -292,6 +385,29 @@ namespace brynet { namespace net {
} }
} }
void shrinkReceiveBuffer()
{
auto newSize = buffer_getreadvalidcount(mRecvBuffer.get());
if (newSize == 0)
{
newSize = std::min<size_t>(16 * 1024, mMaxRecvBufferSize);
}
if(newSize == buffer_getsize(mRecvBuffer.get()))
{
return;
}
std::unique_ptr<struct brynet::base::buffer_s, BufferDeleter>
newBuffer(brynet::base::buffer_new(newSize));
buffer_write(newBuffer.get(),
buffer_getreadptr(mRecvBuffer.get()),
buffer_getreadvalidcount(mRecvBuffer.get()));
mRecvBuffer = std::move(newBuffer);
mCurrentTanhXDiff = 0;
mRecvBuffOriginSize = newSize;
}
/* must called in network thread */ /* must called in network thread */
bool onEnterEventLoop() bool onEnterEventLoop()
{ {
@ -548,6 +664,12 @@ namespace brynet { namespace net {
buffer_adjustto_head(mRecvBuffer.get()); buffer_adjustto_head(mRecvBuffer.get());
} }
if (buffer_getreadvalidcount(mRecvBuffer.get())
== buffer_getsize(mRecvBuffer.get()))
{
growRecvBuffer();
}
const auto tryRecvLen = buffer_getwritevalidcount(mRecvBuffer.get()); const auto tryRecvLen = buffer_getwritevalidcount(mRecvBuffer.get());
if (tryRecvLen == 0) if (tryRecvLen == 0)
{ {
@ -612,11 +734,6 @@ namespace brynet { namespace net {
mRecvData = true; mRecvData = true;
buffer_addwritepos(mRecvBuffer.get(), static_cast<size_t>(retlen)); buffer_addwritepos(mRecvBuffer.get(), static_cast<size_t>(retlen));
if (buffer_getreadvalidcount(mRecvBuffer.get())
== buffer_getsize(mRecvBuffer.get()))
{
growRecvBuffer();
}
if (notInSSL && retlen < static_cast<int>(tryRecvLen)) if (notInSSL && retlen < static_cast<int>(tryRecvLen))
{ {
@ -662,7 +779,7 @@ namespace brynet { namespace net {
static const int SENDBUF_SIZE = 1024 * 32; static const int SENDBUF_SIZE = 1024 * 32;
if (threadLocalSendBuf == nullptr) if (threadLocalSendBuf == nullptr)
{ {
threadLocalSendBuf = (char*)malloc(SENDBUF_SIZE); threadLocalSendBuf = static_cast<char*>(malloc(SENDBUF_SIZE));
} }
#ifdef BRYNET_USE_OPENSSL #ifdef BRYNET_USE_OPENSSL
@ -675,13 +792,13 @@ namespace brynet { namespace net {
while (!mSendList.empty() && mCanWrite) while (!mSendList.empty() && mCanWrite)
{ {
char* sendptr = threadLocalSendBuf; auto sendptr = threadLocalSendBuf;
size_t wait_send_size = 0; size_t wait_send_size = 0;
for (auto it = mSendList.begin(); it != mSendList.end(); ++it) for (auto it = mSendList.begin(); it != mSendList.end(); ++it)
{ {
auto& packet = *it; auto& packet = *it;
auto packetLeftBuf = (char*)(packet.data->c_str() + (packet.data->size() - packet.left)); auto packetLeftBuf = (char*)(packet.data->data()) + packet.data->size() - packet.left;
const auto packetLeftLen = packet.left; const auto packetLeftLen = packet.left;
if ((wait_send_size + packetLeftLen) > SENDBUF_SIZE) if ((wait_send_size + packetLeftLen) > SENDBUF_SIZE)
@ -694,7 +811,7 @@ namespace brynet { namespace net {
break; break;
} }
memcpy(sendptr + wait_send_size, packetLeftBuf, packetLeftLen); memcpy(static_cast<void*>(sendptr + wait_send_size), static_cast<void*>(packetLeftBuf), packetLeftLen);
wait_send_size += packetLeftLen; wait_send_size += packetLeftLen;
} }
@ -759,6 +876,7 @@ namespace brynet { namespace net {
{ {
(packet.mCompleteCallback)(); (packet.mCompleteCallback)();
} }
mSendingMsgSize -= packet.data->size();
it = mSendList.erase(it); it = mSendList.erase(it);
} }
@ -791,7 +909,7 @@ namespace brynet { namespace net {
size_t ready_send_len = 0; size_t ready_send_len = 0;
for (const auto& p : mSendList) for (const auto& p : mSendList)
{ {
iov[num].iov_base = (void*)(p.data->c_str() + (p.data->size() - p.left)); iov[num].iov_base = (void*)(static_cast<const char*>(p.data->data()) + p.data->size() - p.left);
iov[num].iov_len = p.left; iov[num].iov_len = p.left;
ready_send_len += p.left; ready_send_len += p.left;
@ -837,6 +955,7 @@ namespace brynet { namespace net {
{ {
b.mCompleteCallback(); b.mCompleteCallback();
} }
mSendingMsgSize -= b.data->size();
it = mSendList.erase(it); it = mSendList.erase(it);
} }
@ -889,9 +1008,11 @@ namespace brynet { namespace net {
}); });
mCanWrite = false; mCanWrite = false;
mDisConnectCallback = nullptr;
mDataCallback = nullptr; mDataCallback = nullptr;
mDisConnectCallback = nullptr;
mHighWaterCallback = nullptr;
mRecvBuffer = nullptr; mRecvBuffer = nullptr;
mSendList.clear();
} }
void procCloseInLoop() void procCloseInLoop()
@ -1064,16 +1185,25 @@ namespace brynet { namespace net {
{ {
if (mDataCallback != nullptr && buffer_getreadvalidcount(mRecvBuffer.get()) > 0) if (mDataCallback != nullptr && buffer_getreadvalidcount(mRecvBuffer.get()) > 0)
{ {
const auto proclen = mDataCallback(buffer_getreadptr(mRecvBuffer.get()), auto reader = brynet::base::BasePacketReader(buffer_getreadptr(mRecvBuffer.get()),
buffer_getreadvalidcount(mRecvBuffer.get())); buffer_getreadvalidcount(mRecvBuffer.get()), false);
assert(proclen <= buffer_getreadvalidcount(mRecvBuffer.get())); mDataCallback(reader);
if (proclen <= buffer_getreadvalidcount(mRecvBuffer.get())) const auto consumedLen = reader.savedPos();
assert(consumedLen <= reader.size());
if (consumedLen <= reader.size())
{ {
buffer_addreadpos(mRecvBuffer.get(), proclen); buffer_addreadpos(mRecvBuffer.get(), consumedLen);
} }
} }
} }
template<typename CallbackType, typename Arg>
static void verifyArgType(const CallbackType&, void(CallbackType::*)(Arg&) const)
{
static_assert(std::is_reference<Arg&>::value, "arg must be reference type");
static_assert(!std::is_const<typename std::remove_const<Arg>::type>::value, "arg can't be const type");
}
private: private:
#ifdef BRYNET_PLATFORM_WINDOWS #ifdef BRYNET_PLATFORM_WINDOWS
@ -1105,17 +1235,20 @@ namespace brynet { namespace net {
struct PendingPacket struct PendingPacket
{ {
PacketPtr data; SendableMsg::Ptr data;
size_t left; size_t left;
PacketSendedCallback mCompleteCallback; PacketSendedCallback mCompleteCallback;
}; };
using PacketListType = std::deque<PendingPacket>; using PacketListType = std::deque<PendingPacket>;
PacketListType mSendList; PacketListType mSendList;
size_t mSendingMsgSize;
EnterCallback mEnterCallback; EnterCallback mEnterCallback;
DataCallback mDataCallback; DataCallback mDataCallback;
DisconnectedCallback mDisConnectCallback; DisconnectedCallback mDisConnectCallback;
HighWaterCallback mHighWaterCallback;
size_t mHighWaterSize;
bool mIsPostFlush; bool mIsPostFlush;

View File

@ -32,7 +32,7 @@ namespace brynet { namespace net { namespace http {
void send(PacketType&& packet, void send(PacketType&& packet,
TcpConnection::PacketSendedCallback&& callback = nullptr) TcpConnection::PacketSendedCallback&& callback = nullptr)
{ {
mSession->send(std::forward<TcpConnection::PacketPtr>(packet), mSession->send(std::forward<PacketType&&>(packet),
std::move(callback)); std::move(callback));
} }
void send(const char* packet, void send(const char* packet,
@ -196,25 +196,26 @@ namespace brynet { namespace net { namespace http {
auto httpParser = std::make_shared<HTTPParser>(HTTP_BOTH); auto httpParser = std::make_shared<HTTPParser>(HTTP_BOTH);
session->setDataCallback([httpSession, httpParser]( session->setDataCallback([httpSession, httpParser](
const char* buffer, size_t len) { brynet::base::BasePacketReader& reader) {
size_t retlen = 0; size_t retLen = 0;
if (httpParser->isWebSocket()) if (httpParser->isWebSocket())
{ {
retlen = HttpService::ProcessWebSocket(buffer, retLen = HttpService::ProcessWebSocket( reader.begin(),
len, reader.size(),
httpParser, httpParser,
httpSession); httpSession);
} }
else else
{ {
retlen = HttpService::ProcessHttp(buffer, retLen = HttpService::ProcessHttp( reader.begin(),
len, reader.size(),
httpParser, httpParser,
httpSession); httpSession);
} }
return retlen; reader.addPos(retLen);
reader.savePos();
}); });
} }