diff options
author | Rorkh <78957156+Rorkh@users.noreply.github.com> | 2022-01-27 01:56:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-27 01:56:45 +0100 |
commit | 5fe1fe899bfe55b1c27fb03a7d7e76b0b67b9cc7 (patch) | |
tree | 555ed9a75b3d3c168fcd4b1461c8c6965e32cf3d /src/Protocol | |
parent | Update to libdeflate 1.9 (diff) | |
download | cuberite-5fe1fe899bfe55b1c27fb03a7d7e76b0b67b9cc7.tar cuberite-5fe1fe899bfe55b1c27fb03a7d7e76b0b67b9cc7.tar.gz cuberite-5fe1fe899bfe55b1c27fb03a7d7e76b0b67b9cc7.tar.bz2 cuberite-5fe1fe899bfe55b1c27fb03a7d7e76b0b67b9cc7.tar.lz cuberite-5fe1fe899bfe55b1c27fb03a7d7e76b0b67b9cc7.tar.xz cuberite-5fe1fe899bfe55b1c27fb03a7d7e76b0b67b9cc7.tar.zst cuberite-5fe1fe899bfe55b1c27fb03a7d7e76b0b67b9cc7.zip |
Diffstat (limited to 'src/Protocol')
-rw-r--r-- | src/Protocol/ProtocolRecognizer.cpp | 36 | ||||
-rw-r--r-- | src/Protocol/ProtocolRecognizer.h | 3 |
2 files changed, 39 insertions, 0 deletions
diff --git a/src/Protocol/ProtocolRecognizer.cpp b/src/Protocol/ProtocolRecognizer.cpp index ba179c1bf..9062eb9b5 100644 --- a/src/Protocol/ProtocolRecognizer.cpp +++ b/src/Protocol/ProtocolRecognizer.cpp @@ -90,6 +90,11 @@ void cMultiVersionProtocol::HandleIncomingDataInRecognitionStage(cClientHandle & return; } + if (TryHandleHTTPRequest(a_Client, a_Data)) + { + return; + } + // TODO: recover from git history // Unlengthed protocol, ... @@ -238,6 +243,37 @@ void cMultiVersionProtocol::SendDisconnect(cClientHandle & a_Client, const AStri +bool cMultiVersionProtocol::TryHandleHTTPRequest(cClientHandle & a_Client, ContiguousByteBuffer & a_Data) +{ + const auto RedirectUrl = cRoot::Get()->GetServer()->GetCustomRedirectUrl(); + + if (RedirectUrl.empty()) + { + return false; + } + + ContiguousByteBuffer Buffer; + m_Buffer.ReadSome(Buffer, 10U); + m_Buffer.ResetRead(); + + // The request line, hastily decoded with the hope that it's encoded in US-ASCII. + const std::string_view Value(reinterpret_cast<const char *>(Buffer.data()), Buffer.size()); + + if (Value == u8"GET / HTTP") + { + const auto Response = fmt::format(u8"HTTP/1.0 303 See Other\r\nLocation: {}\r\n\r\n", cRoot::Get()->GetServer()->GetCustomRedirectUrl()); + a_Client.SendData({ reinterpret_cast<const std::byte *>(Response.data()), Response.size() }); + a_Client.Destroy(); + return true; + } + + return false; +} + + + + + std::unique_ptr<cProtocol> cMultiVersionProtocol::TryRecognizeLengthedProtocol(cClientHandle & a_Client) { UInt32 PacketType; diff --git a/src/Protocol/ProtocolRecognizer.h b/src/Protocol/ProtocolRecognizer.h index 0a923e78f..8b7848199 100644 --- a/src/Protocol/ProtocolRecognizer.h +++ b/src/Protocol/ProtocolRecognizer.h @@ -59,6 +59,9 @@ private: /** Handles and responds to unsupported clients sending pings. */ void HandleIncomingDataInOldPingResponseStage(cClientHandle & a_Client, ContiguousByteBufferView a_Data); + /* Checks if incoming data is an HTTP request and handles it if it is. */ + bool TryHandleHTTPRequest(cClientHandle & a_Client, ContiguousByteBuffer & a_Data); + /** Tries to recognize a protocol in the lengthed family (1.7+), based on m_Buffer. Returns a cProtocol_XXX instance if recognized. */ std::unique_ptr<cProtocol> TryRecognizeLengthedProtocol(cClientHandle & a_Client); |