diff options
| author | Stefan Boberg <[email protected]> | 2021-09-27 12:34:52 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-09-27 12:34:52 +0200 |
| commit | f0036eada7f6bcf6e08afe3ea8517367ed73450e (patch) | |
| tree | b1ce3466bba36175cad369028fad1b410a34b5ec /zenhttp | |
| parent | Fixed httpsys Windows compilation error (diff) | |
| parent | GetWindowsErrorAsString() -> GetSystemErrorAsString() (diff) | |
| download | zen-f0036eada7f6bcf6e08afe3ea8517367ed73450e.tar.xz zen-f0036eada7f6bcf6e08afe3ea8517367ed73450e.zip | |
Merged latest from main
Diffstat (limited to 'zenhttp')
| -rw-r--r-- | zenhttp/httpserver.cpp | 38 | ||||
| -rw-r--r-- | zenhttp/httpsys.cpp | 22 | ||||
| -rw-r--r-- | zenhttp/httpsys.h | 13 | ||||
| -rw-r--r-- | zenhttp/include/zenhttp/httpcommon.h | 2 |
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 |