aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-01-22 13:22:21 +0100
committerGitHub <[email protected]>2024-01-22 13:22:21 +0100
commitd0630968516f31a9c6ebc9a5643b7cd19f6cb184 (patch)
treea2bbf71b93f0254415f13cebcb41ac9d808db312 /src
parentjobqueue - allow multiple threads to report progress/messages (#635) (diff)
downloadzen-d0630968516f31a9c6ebc9a5643b7cd19f6cb184.tar.xz
zen-d0630968516f31a9c6ebc9a5643b7cd19f6cb184.zip
improved errors from jupiter upstream (#636)
* get more detailed error messages from jupiter upstream
Diffstat (limited to 'src')
-rw-r--r--src/zenhttp/httpserver.cpp11
-rw-r--r--src/zenserver/projectstore/jupiterremoteprojectstore.cpp27
-rw-r--r--src/zenserver/upstream/jupiter.cpp50
3 files changed, 82 insertions, 6 deletions
diff --git a/src/zenhttp/httpserver.cpp b/src/zenhttp/httpserver.cpp
index 3270855ad..dcbeac907 100644
--- a/src/zenhttp/httpserver.cpp
+++ b/src/zenhttp/httpserver.cpp
@@ -94,6 +94,7 @@ MapContentTypeToString(HttpContentType ContentType)
static constinit uint32_t HashBinary = HashStringDjb2("application/octet-stream"sv);
static constinit uint32_t HashJson = HashStringDjb2("json"sv);
static constinit uint32_t HashApplicationJson = HashStringDjb2("application/json"sv);
+static constinit uint32_t HashApplicationProblemJson = HashStringDjb2("application/problem+json"sv);
static constinit uint32_t HashYaml = HashStringDjb2("yaml"sv);
static constinit uint32_t HashTextYaml = HashStringDjb2("text/yaml"sv);
static constinit uint32_t HashText = HashStringDjb2("text/plain"sv);
@@ -132,6 +133,7 @@ struct HashedTypeEntry
{HashCompactBinaryPackageOffer, HttpContentType::kCbPackageOffer},
{HashJson, HttpContentType::kJSON},
{HashApplicationJson, HttpContentType::kJSON},
+ {HashApplicationProblemJson, HttpContentType::kJSON},
{HashYaml, HttpContentType::kYAML},
{HashTextYaml, HttpContentType::kYAML},
{HashText, HttpContentType::kText},
@@ -156,7 +158,14 @@ ParseContentTypeImpl(const std::string_view& ContentTypeString)
{
if (!ContentTypeString.empty())
{
- const uint32_t CtHash = HashStringDjb2(ContentTypeString);
+ size_t ContentEnd = ContentTypeString.find(';');
+ if (ContentEnd == std::string_view::npos)
+ {
+ ContentEnd = ContentTypeString.length();
+ }
+ std::string_view ContentString(ContentTypeString.substr(0, ContentEnd));
+
+ const uint32_t CtHash = HashStringDjb2(ContentString);
if (auto It = std::lower_bound(std::begin(TypeHashTable),
std::end(TypeHashTable),
diff --git a/src/zenserver/projectstore/jupiterremoteprojectstore.cpp b/src/zenserver/projectstore/jupiterremoteprojectstore.cpp
index fbc3c8e16..9d8f6c17b 100644
--- a/src/zenserver/projectstore/jupiterremoteprojectstore.cpp
+++ b/src/zenserver/projectstore/jupiterremoteprojectstore.cpp
@@ -256,6 +256,28 @@ private:
{
std::string Text;
int32_t ErrorCode = 0;
+ if (Response.ErrorCode != 0 || !Response.Success)
+ {
+ if (Response.Response)
+ {
+ HttpContentType ContentType = Response.Response.GetContentType();
+ if (ContentType == ZenContentType::kText || ContentType == ZenContentType::kJSON)
+ {
+ ExtendableStringBuilder<256> SB;
+ SB.Append("\n");
+ SB.Append(std::string_view(reinterpret_cast<const std::string::value_type*>(Response.Response.GetData()),
+ Response.Response.GetSize()));
+ Text = SB.ToString();
+ }
+ else if (ContentType == ZenContentType::kCbObject)
+ {
+ ExtendableStringBuilder<256> SB;
+ SB.Append("\n");
+ CompactBinaryToJson(Response.Response.GetView(), SB);
+ Text = SB.ToString();
+ }
+ }
+ }
if (Response.ErrorCode != 0)
{
ErrorCode = Response.ErrorCode;
@@ -263,11 +285,6 @@ private:
else if (!Response.Success)
{
ErrorCode = gsl::narrow<int32_t>(HttpResponseCode::InternalServerError);
- if (Response.Response.GetContentType() == ZenContentType::kText)
- {
- Text =
- std::string(reinterpret_cast<const std::string::value_type*>(Response.Response.GetData()), Response.Response.GetSize());
- }
}
return {.ErrorCode = ErrorCode, .ElapsedSeconds = Response.ElapsedSeconds, .Reason = Response.Reason, .Text = Text};
}
diff --git a/src/zenserver/upstream/jupiter.cpp b/src/zenserver/upstream/jupiter.cpp
index a67c497ad..e4d45e316 100644
--- a/src/zenserver/upstream/jupiter.cpp
+++ b/src/zenserver/upstream/jupiter.cpp
@@ -157,6 +157,31 @@ namespace detail {
return Response;
}
+ static std::optional<zen::HttpContentType> TryGetContentType(const cpr::Response& Response)
+ {
+ if (auto It = Response.header.find("Content-Type"); It != Response.header.end())
+ {
+ zen::HttpContentType ContentType = zen::ParseContentType(It->second);
+ if (ContentType != zen::HttpContentType::kUnknownContentType)
+ {
+ return ContentType;
+ }
+ }
+ return {};
+ }
+
+ static IoBuffer MakeBufferFromResponseIfKnownFormat(const cpr::Response& Response)
+ {
+ std::optional<zen::HttpContentType> ContentType = TryGetContentType(Response);
+ if (ContentType)
+ {
+ IoBuffer Buffer = IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size());
+ Buffer.SetContentType(ContentType.value());
+ return Buffer;
+ }
+ return {};
+ }
+
} // namespace detail
CloudCacheSession::CloudCacheSession(CloudCacheClient* CacheClient) : m_Log(CacheClient->Logger()), m_CacheClient(CacheClient)
@@ -203,6 +228,7 @@ CloudCacheSession::GetRef(std::string_view Namespace, std::string_view BucketId,
}
else
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::GetRef failed GET. "
"Elapsed: {} s, "
@@ -252,6 +278,7 @@ CloudCacheSession::GetBlob(std::string_view Namespace, const IoHash& Key)
}
else
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::GetBlob failed GET. "
"Elapsed: {} s, "
@@ -305,6 +332,12 @@ CloudCacheSession::GetCompressedBlob(std::string_view Namespace, const IoHash& K
}
else
{
+ std::optional<zen::HttpContentType> ContentType = detail::TryGetContentType(Response);
+ if (ContentType.has_value())
+ {
+ Result.Response = std::move(Payload);
+ Result.Response.SetContentType(ContentType.value());
+ }
ZEN_WARN(
"CloudCacheSession::GetCompressedBlob failed GET. "
"Elapsed: {} s, "
@@ -362,6 +395,12 @@ CloudCacheSession::GetInlineBlob(std::string_view Namespace,
}
else
{
+ std::optional<zen::HttpContentType> ContentType = detail::TryGetContentType(Response);
+ if (ContentType.has_value())
+ {
+ Result.Response = std::move(Payload);
+ Result.Response.SetContentType(ContentType.value());
+ }
ZEN_WARN(
"CloudCacheSession::GetInlineBlob failed GET. "
"Elapsed: {} s, "
@@ -423,6 +462,7 @@ CloudCacheSession::GetObject(std::string_view Namespace, const IoHash& Key)
}
else
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::GetObject failed GET. "
"Elapsed: {} s, "
@@ -490,6 +530,7 @@ CloudCacheSession::PutRef(std::string_view Namespace, std::string_view BucketId,
}
else
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::PutRef failed PUT. "
"Elapsed: {} s, "
@@ -559,6 +600,7 @@ CloudCacheSession::FinalizeRef(std::string_view Namespace, std::string_view Buck
}
else
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::FinalizeRef failed PUT. "
"Elapsed: {} s, "
@@ -611,6 +653,7 @@ CloudCacheSession::PutBlob(std::string_view Namespace, const IoHash& Key, IoBuff
CloudCacheResult Result = detail::ConvertResponse(Response);
if (!Result.Success)
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::PutBlob failed PUT. "
"Elapsed: {} s, "
@@ -677,6 +720,7 @@ CloudCacheSession::PutCompressedBlob(std::string_view Namespace, const IoHash& K
CloudCacheResult Result = detail::ConvertResponse(Response);
if (!Result.Success)
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::PutCompressedBlob failed PUT. "
"Elapsed: {} s, "
@@ -735,6 +779,7 @@ CloudCacheSession::PutCompressedBlob(std::string_view Namespace, const IoHash& K
CloudCacheResult Result = detail::ConvertResponse(Response);
if (!Result.Success)
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::PutCompressedBlob failed PUT. "
"Elapsed: {} s, "
@@ -784,6 +829,7 @@ CloudCacheSession::PutObject(std::string_view Namespace, const IoHash& Key, IoBu
CloudCacheResult Result = detail::ConvertResponse(Response);
if (!Result.Success)
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::PutObject failed PUT. "
"Elapsed: {} s, "
@@ -833,6 +879,7 @@ CloudCacheSession::RefExists(std::string_view Namespace, std::string_view Bucket
CloudCacheResult Result = detail::ConvertResponse(Response);
if (!Result.Success)
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::RefExists failed PUT. "
"Elapsed: {} s, "
@@ -888,6 +935,7 @@ CloudCacheSession::GetObjectReferences(std::string_view Namespace, const IoHash&
}
else
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::GetObjectReferences failed PUT. "
"Elapsed: {} s, "
@@ -996,6 +1044,7 @@ CloudCacheSession::CacheTypeExists(std::string_view Namespace, std::string_view
CloudCacheResult Result = detail::ConvertResponse(Response);
if (!Result.Success)
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::CacheTypeExists failed GET. "
"Elapsed: {} s, "
@@ -1061,6 +1110,7 @@ CloudCacheSession::CacheTypeExists(std::string_view Namespace, std::string_view
}
else
{
+ Result.Response = detail::MakeBufferFromResponseIfKnownFormat(Response);
ZEN_WARN(
"CloudCacheSession::CacheTypeExists failed GET. "
"Elapsed: {} s, "