aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/zenhttp/httpclient.cpp23
-rw-r--r--src/zenhttp/httpserver.cpp5
-rw-r--r--src/zenhttp/include/zenhttp/httpserver.h2
-rw-r--r--src/zenhttp/servers/httpasio.cpp23
-rw-r--r--src/zenhttp/servers/httpplugin.cpp3
-rw-r--r--src/zenhttp/servers/httpsys.cpp29
6 files changed, 78 insertions, 7 deletions
diff --git a/src/zenhttp/httpclient.cpp b/src/zenhttp/httpclient.cpp
index 0544bf5c8..c77be8624 100644
--- a/src/zenhttp/httpclient.cpp
+++ b/src/zenhttp/httpclient.cpp
@@ -402,7 +402,14 @@ TEST_CASE("httpclient")
{
if (HttpServiceRequest.RelativeUri() == "yo")
{
- return HttpServiceRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, "hey man");
+ if (HttpServiceRequest.IsLocalMachineRequest())
+ {
+ return HttpServiceRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, "hey family");
+ }
+ else
+ {
+ return HttpServiceRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, "hey stranger");
+ }
}
return HttpServiceRequest.WriteResponse(HttpResponseCode::OK);
}
@@ -440,6 +447,7 @@ TEST_CASE("httpclient")
HttpClient::Response TestResponse = Client.Get("/test/yo");
CHECK(TestResponse.IsSuccess());
+ CHECK_EQ(TestResponse.AsText(), "hey family");
}
if (IsIPv6Capable())
@@ -452,6 +460,7 @@ TEST_CASE("httpclient")
HttpClient::Response TestResponse = Client.Get("/test/yo");
CHECK(TestResponse.IsSuccess());
+ CHECK_EQ(TestResponse.AsText(), "hey family");
}
{
@@ -463,6 +472,7 @@ TEST_CASE("httpclient")
HttpClient::Response TestResponse = Client.Get("/test/yo");
CHECK(TestResponse.IsSuccess());
+ CHECK_EQ(TestResponse.AsText(), "hey family");
}
# if 0
{
@@ -474,7 +484,9 @@ TEST_CASE("httpclient")
HttpClient::Response TestResponse = Client.Get("/test/yo");
CHECK(TestResponse.IsSuccess());
+ CHECK_EQ(TestResponse.AsText(), "hey family");
}
+ Sleep(20000);
# endif // 0
AsioServer->RequestExit();
}
@@ -483,7 +495,7 @@ TEST_CASE("httpclient")
# if ZEN_PLATFORM_WINDOWS
SUBCASE("httpsys")
{
- Ref<HttpServer> HttpSysServer = CreateHttpSysServer(HttpSysConfig{.ForceLoopback = true});
+ Ref<HttpServer> HttpSysServer = CreateHttpSysServer(HttpSysConfig{.ForceLoopback = false});
int Port = HttpSysServer->Initialize(7575, TmpDir.Path());
REQUIRE(Port != -1);
@@ -511,6 +523,7 @@ TEST_CASE("httpclient")
HttpClient::Response TestResponse = Client.Get("/test/yo");
CHECK(TestResponse.IsSuccess());
+ CHECK_EQ(TestResponse.AsText(), "hey family");
}
if (IsIPv6Capable())
@@ -523,6 +536,7 @@ TEST_CASE("httpclient")
HttpClient::Response TestResponse = Client.Get("/test/yo");
CHECK(TestResponse.IsSuccess());
+ CHECK_EQ(TestResponse.AsText(), "hey family");
}
{
@@ -534,6 +548,7 @@ TEST_CASE("httpclient")
HttpClient::Response TestResponse = Client.Get("/test/yo");
CHECK(TestResponse.IsSuccess());
+ CHECK_EQ(TestResponse.AsText(), "hey family");
}
# if 0
{
@@ -543,9 +558,11 @@ TEST_CASE("httpclient")
ZEN_INFO("Request using {}", Client.GetBaseUri());
- HttpClient::Response TestResponse = Client.Get("/test");
+ HttpClient::Response TestResponse = Client.Get("/test/yo");
CHECK(TestResponse.IsSuccess());
+ CHECK_EQ(TestResponse.AsText(), "hey family");
}
+ Sleep(20000);
# endif // 0
HttpSysServer->RequestExit();
}
diff --git a/src/zenhttp/httpserver.cpp b/src/zenhttp/httpserver.cpp
index c4e67d4ed..8985120b0 100644
--- a/src/zenhttp/httpserver.cpp
+++ b/src/zenhttp/httpserver.cpp
@@ -1310,7 +1310,10 @@ TEST_CASE("http.common")
{
TestHttpServerRequest(HttpService& Service, std::string_view Uri) : HttpServerRequest(Service) { m_Uri = Uri; }
virtual IoBuffer ReadPayload() override { return IoBuffer(); }
- virtual void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::span<IoBuffer> Blobs) override
+
+ virtual bool IsLocalMachineRequest() const override { return false; }
+
+ virtual void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::span<IoBuffer> Blobs) override
{
ZEN_UNUSED(ResponseCode, ContentType, Blobs);
}
diff --git a/src/zenhttp/include/zenhttp/httpserver.h b/src/zenhttp/include/zenhttp/httpserver.h
index 6660bebf9..f0a667686 100644
--- a/src/zenhttp/include/zenhttp/httpserver.h
+++ b/src/zenhttp/include/zenhttp/httpserver.h
@@ -89,6 +89,8 @@ public:
CbObject ReadPayloadObject();
CbPackage ReadPayloadPackage();
+ virtual bool IsLocalMachineRequest() const = 0;
+
/** Respond with payload
No data will have been sent when any of these functions return. Instead, the response will be transmitted
diff --git a/src/zenhttp/servers/httpasio.cpp b/src/zenhttp/servers/httpasio.cpp
index 76fea65b3..8bfbd8b37 100644
--- a/src/zenhttp/servers/httpasio.cpp
+++ b/src/zenhttp/servers/httpasio.cpp
@@ -529,12 +529,18 @@ public:
class HttpAsioServerRequest : public HttpServerRequest
{
public:
- HttpAsioServerRequest(HttpRequestParser& Request, HttpService& Service, IoBuffer PayloadBuffer, uint32_t RequestNumber);
+ HttpAsioServerRequest(HttpRequestParser& Request,
+ HttpService& Service,
+ IoBuffer PayloadBuffer,
+ uint32_t RequestNumber,
+ bool IsLocalMachineRequest);
~HttpAsioServerRequest();
virtual Oid ParseSessionId() const override;
virtual uint32_t ParseRequestId() const override;
+ virtual bool IsLocalMachineRequest() const override;
+
virtual IoBuffer ReadPayload() override;
virtual void WriteResponse(HttpResponseCode ResponseCode) override;
virtual void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::span<IoBuffer> Blobs) override;
@@ -550,6 +556,7 @@ public:
HttpRequestParser& m_Request;
uint32_t m_RequestNumber = 0; // Note: different to request ID which is derived from headers
IoBuffer m_PayloadBuffer;
+ bool m_IsLocalMachineRequest;
std::unique_ptr<HttpResponse> m_Response;
};
@@ -1168,7 +1175,9 @@ HttpServerConnection::HandleRequest()
{
ZEN_TRACE_CPU("asio::HandleRequest");
- HttpAsioServerRequest Request(m_RequestData, *Service, m_RequestData.Body(), RequestNumber);
+ bool IsLocalConnection = m_Socket->local_endpoint().address() == m_Socket->remote_endpoint().address();
+
+ HttpAsioServerRequest Request(m_RequestData, *Service, m_RequestData.Body(), RequestNumber, IsLocalConnection);
ZEN_TRACE_VERBOSE("handle request, connection: {}, request: {}'", m_ConnectionId, RequestNumber);
@@ -1634,11 +1643,13 @@ private:
HttpAsioServerRequest::HttpAsioServerRequest(HttpRequestParser& Request,
HttpService& Service,
IoBuffer PayloadBuffer,
- uint32_t RequestNumber)
+ uint32_t RequestNumber,
+ bool IsLocalMachineRequest)
: HttpServerRequest(Service)
, m_Request(Request)
, m_RequestNumber(RequestNumber)
, m_PayloadBuffer(std::move(PayloadBuffer))
+, m_IsLocalMachineRequest(IsLocalMachineRequest)
{
const int PrefixLength = Service.UriPrefixLength();
@@ -1710,6 +1721,12 @@ HttpAsioServerRequest::ParseRequestId() const
return m_Request.RequestId();
}
+bool
+HttpAsioServerRequest::IsLocalMachineRequest() const
+{
+ return m_IsLocalMachineRequest;
+}
+
IoBuffer
HttpAsioServerRequest::ReadPayload()
{
diff --git a/src/zenhttp/servers/httpplugin.cpp b/src/zenhttp/servers/httpplugin.cpp
index b9217ed87..1a630c16f 100644
--- a/src/zenhttp/servers/httpplugin.cpp
+++ b/src/zenhttp/servers/httpplugin.cpp
@@ -143,6 +143,9 @@ public:
HttpPluginServerRequest(const HttpPluginServerRequest&) = delete;
HttpPluginServerRequest& operator=(const HttpPluginServerRequest&) = delete;
+ // As this is plugin transport connection used for specialized connections we assume it is not a machine local connection
+ virtual bool IsLocalMachineRequest() const /* override*/ { return false; }
+
virtual Oid ParseSessionId() const override;
virtual uint32_t ParseRequestId() const override;
diff --git a/src/zenhttp/servers/httpsys.cpp b/src/zenhttp/servers/httpsys.cpp
index 0d2bb8fbd..01c4559a1 100644
--- a/src/zenhttp/servers/httpsys.cpp
+++ b/src/zenhttp/servers/httpsys.cpp
@@ -313,6 +313,8 @@ public:
virtual Oid ParseSessionId() const override;
virtual uint32_t ParseRequestId() const override;
+ virtual bool IsLocalMachineRequest() const;
+
virtual IoBuffer ReadPayload() override;
virtual void WriteResponse(HttpResponseCode ResponseCode) override;
virtual void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::span<IoBuffer> Blobs) override;
@@ -1814,6 +1816,33 @@ HttpSysServerRequest::ParseRequestId() const
return 0;
}
+bool
+HttpSysServerRequest::IsLocalMachineRequest() const
+{
+ const PSOCKADDR LocalAddress = m_HttpTx.HttpRequest()->Address.pLocalAddress;
+ const PSOCKADDR RemoteAddress = m_HttpTx.HttpRequest()->Address.pRemoteAddress;
+ if (LocalAddress->sa_family != RemoteAddress->sa_family)
+ {
+ return false;
+ }
+ if (LocalAddress->sa_family == AF_INET)
+ {
+ const SOCKADDR_IN& LocalAddressv4 = (const SOCKADDR_IN&)(*LocalAddress);
+ const SOCKADDR_IN& RemoteAddressv4 = (const SOCKADDR_IN&)(*RemoteAddress);
+ return LocalAddressv4.sin_addr.S_un.S_addr == RemoteAddressv4.sin_addr.S_un.S_addr;
+ }
+ else if (LocalAddress->sa_family == AF_INET6)
+ {
+ const SOCKADDR_IN6& LocalAddressv6 = (const SOCKADDR_IN6&)(*LocalAddress);
+ const SOCKADDR_IN6& RemoteAddressv6 = (const SOCKADDR_IN6&)(*RemoteAddress);
+ return memcmp(&LocalAddressv6.sin6_addr, &RemoteAddressv6.sin6_addr, sizeof(in6_addr)) == 0;
+ }
+ else
+ {
+ return false;
+ }
+}
+
IoBuffer
HttpSysServerRequest::ReadPayload()
{