summaryrefslogtreecommitdiffstats
path: root/src/Protocol
diff options
context:
space:
mode:
Diffstat (limited to 'src/Protocol')
-rw-r--r--src/Protocol/ProtocolRecognizer.cpp36
-rw-r--r--src/Protocol/ProtocolRecognizer.h3
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);