aboutsummaryrefslogtreecommitdiff
path: root/src/server/bnetserver/Server/Session.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/bnetserver/Server/Session.cpp')
-rw-r--r--src/server/bnetserver/Server/Session.cpp38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/server/bnetserver/Server/Session.cpp b/src/server/bnetserver/Server/Session.cpp
index a5ede8d6524..4d54562501f 100644
--- a/src/server/bnetserver/Server/Session.cpp
+++ b/src/server/bnetserver/Server/Session.cpp
@@ -654,12 +654,37 @@ void Battlenet::Session::CheckIpCallback(PreparedQueryResult result)
bool Battlenet::Session::Update()
{
+ EncryptableBuffer* queued;
+ MessageBuffer buffer((std::size_t(BufferSizes::Read)));
+ while (_bufferQueue.Dequeue(queued))
+ {
+ std::size_t packetSize = queued->Buffer.GetActiveSize();
+ if (queued->Encrypt)
+ _crypt.EncryptSend(queued->Buffer.GetReadPointer(), packetSize);
+
+ if (buffer.GetRemainingSpace() < packetSize)
+ {
+ QueuePacket(std::move(buffer));
+ buffer.Resize(std::size_t(BufferSizes::Read));
+ }
+
+ if (buffer.GetRemainingSpace() >= packetSize)
+ buffer.Write(queued->Buffer.GetReadPointer(), packetSize);
+ else // single packet larger than 16384 bytes - client will reject.
+ QueuePacket(std::move(queued->Buffer));
+
+ delete queued;
+ }
+
+ if (buffer.GetActiveSize() > 0)
+ QueuePacket(std::move(buffer));
+
if (!BattlenetSocket::Update())
return false;
if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
- auto callback = std::move(_queryCallback);
+ auto callback = _queryCallback;
_queryCallback = nullptr;
callback(_queryFuture.get());
}
@@ -679,15 +704,12 @@ void Battlenet::Session::AsyncWrite(ServerPacket* packet)
packet->Write();
- MessageBuffer buffer;
- buffer.Write(packet->GetData(), packet->GetSize());
+ EncryptableBuffer* buffer = new EncryptableBuffer();
+ buffer->Buffer.Write(packet->GetData(), packet->GetSize());
+ buffer->Encrypt = _crypt.IsInitialized();
delete packet;
- std::unique_lock<std::mutex> guard(_writeLock);
-
- _crypt.EncryptSend(buffer.GetReadPointer(), buffer.GetActiveSize());
-
- QueuePacket(std::move(buffer), guard);
+ _bufferQueue.Enqueue(buffer);
}
inline void ReplaceResponse(Battlenet::ServerPacket** oldResponse, Battlenet::ServerPacket* newResponse)