aboutsummaryrefslogtreecommitdiff
path: root/zenhttp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-09-27 12:34:52 +0200
committerStefan Boberg <[email protected]>2021-09-27 12:34:52 +0200
commitf0036eada7f6bcf6e08afe3ea8517367ed73450e (patch)
treeb1ce3466bba36175cad369028fad1b410a34b5ec /zenhttp
parentFixed httpsys Windows compilation error (diff)
parentGetWindowsErrorAsString() -> GetSystemErrorAsString() (diff)
downloadzen-f0036eada7f6bcf6e08afe3ea8517367ed73450e.tar.xz
zen-f0036eada7f6bcf6e08afe3ea8517367ed73450e.zip
Merged latest from main
Diffstat (limited to 'zenhttp')
-rw-r--r--zenhttp/httpserver.cpp38
-rw-r--r--zenhttp/httpsys.cpp22
-rw-r--r--zenhttp/httpsys.h13
-rw-r--r--zenhttp/include/zenhttp/httpcommon.h2
4 files changed, 67 insertions, 8 deletions
diff --git a/zenhttp/httpserver.cpp b/zenhttp/httpserver.cpp
index 599c99a18..795e81ea8 100644
--- a/zenhttp/httpserver.cpp
+++ b/zenhttp/httpserver.cpp
@@ -128,6 +128,30 @@ HttpContentType (*ParseContentType)(const std::string_view& ContentTypeString) =
//////////////////////////////////////////////////////////////////////////
+const std::string_view
+ToString(HttpVerb Verb)
+{
+ switch (Verb)
+ {
+ case HttpVerb::kGet:
+ return "GET"sv;
+ case HttpVerb::kPut:
+ return "PUT"sv;
+ case HttpVerb::kPost:
+ return "POST"sv;
+ case HttpVerb::kDelete:
+ return "DELETE"sv;
+ case HttpVerb::kHead:
+ return "HEAD"sv;
+ case HttpVerb::kCopy:
+ return "COPY"sv;
+ case HttpVerb::kOptions:
+ return "OPTIONS"sv;
+ default:
+ return "???"sv;
+ }
+}
+
const char*
ReasonStringForHttpResultCode(int HttpCode)
{
@@ -295,9 +319,17 @@ HttpServerRequest::WriteResponse(HttpResponseCode ResponseCode, CbPackage Data)
void
HttpServerRequest::WriteResponse(HttpResponseCode ResponseCode, CbObject Data)
{
- SharedBuffer Buf = Data.GetBuffer();
- std::array<IoBuffer, 1> Buffers{IoBufferBuilder::MakeCloneFromMemory(Buf.GetData(), Buf.GetSize())};
- return WriteResponse(ResponseCode, HttpContentType::kCbObject, Buffers);
+ if (m_AcceptType == HttpContentType::kJSON)
+ {
+ ExtendableStringBuilder<1024> Sb;
+ WriteResponse(ResponseCode, HttpContentType::kJSON, Data.ToJson(Sb).ToView());
+ }
+ else
+ {
+ SharedBuffer Buf = Data.GetBuffer();
+ std::array<IoBuffer, 1> Buffers{IoBufferBuilder::MakeCloneFromMemory(Buf.GetData(), Buf.GetSize())};
+ return WriteResponse(ResponseCode, HttpContentType::kCbObject, Buffers);
+ }
}
void
diff --git a/zenhttp/httpsys.cpp b/zenhttp/httpsys.cpp
index 997491613..26bba5484 100644
--- a/zenhttp/httpsys.cpp
+++ b/zenhttp/httpsys.cpp
@@ -417,7 +417,7 @@ HttpMessageResponseRequest::HandleCompletion(ULONG IoResult, ULONG_PTR NumberOfB
if (IoResult != NO_ERROR)
{
- ZEN_WARN("response aborted due to error: '{}'", GetErrorAsString(IoResult));
+ ZEN_WARN("response aborted due to error: '{}'", GetSystemErrorAsString(IoResult));
// if one transmit failed there's really no need to go on
return nullptr;
@@ -553,7 +553,10 @@ HttpMessageResponseRequest::IssueRequest(std::error_code& ErrorCode)
CancelThreadpoolIo(Iocp);
- ZEN_ERROR("failed to send HTTP response (error: '{}'), request URL: '{}'", GetErrorAsString(SendResult), HttpReq->pRawUrl);
+ ZEN_ERROR("failed to send HTTP response (error: '{}'), request URL: '{}', request id: {}",
+ GetSystemErrorAsString(SendResult),
+ HttpReq->pRawUrl,
+ HttpReq->RequestId);
ErrorCode = MakeErrorCode(SendResult);
}
@@ -572,7 +575,10 @@ HttpMessageResponseRequest::IssueRequest(std::error_code& ErrorCode)
\/ \/ \/
*/
-HttpSysServer::HttpSysServer(unsigned int ThreadCount) : m_ThreadPool(ThreadCount)
+HttpSysServer::HttpSysServer(unsigned int ThreadCount)
+: m_Log(logging::Get("http"))
+, m_RequestLog(logging::Get("http_requests"))
+, m_ThreadPool(ThreadCount)
{
ULONG Result = HttpInitialize(HTTPAPI_VERSION_2, HTTP_INITIALIZE_SERVER, nullptr);
@@ -668,6 +674,8 @@ HttpSysServer::Initialize(const wchar_t* UrlPath)
else
{
m_IsOk = true;
+
+ ZEN_INFO("Started http.sys server at '{}'", WideToUtf8(UrlPath));
}
}
@@ -947,6 +955,14 @@ HttpSysTransaction::HandleCompletion(ULONG IoResult, ULONG_PTR NumberOfBytesTran
return Status::kRequestPending;
}
+ if (m_HttpServer.m_IsRequestLoggingEnabled)
+ {
+ if (m_HandlerRequest.has_value())
+ {
+ m_HttpServer.m_RequestLog.info("{} {}", ToString(m_HandlerRequest->RequestVerb()), m_HandlerRequest->RelativeUri());
+ }
+ }
+
// Transaction done, caller should clean up (delete) this instance
return Status::kDone;
}
diff --git a/zenhttp/httpsys.h b/zenhttp/httpsys.h
index 6616817ec..2e51c538f 100644
--- a/zenhttp/httpsys.h
+++ b/zenhttp/httpsys.h
@@ -20,6 +20,10 @@
# include <atlbase.h>
# include <http.h>
+namespace spdlog {
+class logger;
+}
+
namespace zen {
/**
@@ -56,8 +60,13 @@ private:
void UnregisterService(const char* Endpoint, HttpService& Service);
private:
- bool m_IsOk = false;
- bool m_IsHttpInitialized = false;
+ spdlog::logger& m_Log;
+ spdlog::logger& m_RequestLog;
+ spdlog::logger& Log() { return m_Log; }
+
+ bool m_IsOk = false;
+ bool m_IsHttpInitialized = false;
+ bool m_IsRequestLoggingEnabled = false;
WinIoThreadPool m_ThreadPool;
std::wstring m_BaseUri; // http://*:nnnn/
diff --git a/zenhttp/include/zenhttp/httpcommon.h b/zenhttp/include/zenhttp/httpcommon.h
index 08f1b47a9..62070061c 100644
--- a/zenhttp/include/zenhttp/httpcommon.h
+++ b/zenhttp/include/zenhttp/httpcommon.h
@@ -40,6 +40,8 @@ enum class HttpVerb : uint8_t
gsl_DEFINE_ENUM_BITMASK_OPERATORS(HttpVerb);
+const std::string_view ToString(HttpVerb Verb);
+
enum class HttpResponseCode
{
// 1xx - Informational