diff options
author | mokhotskii <mokhotskii@ydb.tech> | 2022-12-15 11:36:07 +0300 |
---|---|---|
committer | mokhotskii <mokhotskii@ydb.tech> | 2022-12-15 11:36:07 +0300 |
commit | 5a94c3988f52cb5576b9a46c4a44d30f4c434d29 (patch) | |
tree | 0adab5988fee376b56fa9a84d36763779644bc3b | |
parent | efa2826f69f315b00238f1b9c597b8d4344ac96f (diff) | |
download | ydb-5a94c3988f52cb5576b9a46c4a44d30f4c434d29.tar.gz |
Fix to/from cbor behavior + add x-amz-crc32 header
Add additional conversion before to_cbor call
Add x-amz-crc32 header
-rw-r--r-- | ydb/core/http_proxy/http_req.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/ydb/core/http_proxy/http_req.cpp b/ydb/core/http_proxy/http_req.cpp index 11462c2b88..3dcaaf4829 100644 --- a/ydb/core/http_proxy/http_req.cpp +++ b/ydb/core/http_proxy/http_req.cpp @@ -6,6 +6,7 @@ #include <library/cpp/actors/http/http_proxy.h> #include <library/cpp/cgiparam/cgiparam.h> +#include <library/cpp/digest/old_crc/crc.h> #include <library/cpp/http/misc/parsed_request.h> #include <library/cpp/http/server/response.h> #include <library/cpp/json/json_reader.h> @@ -197,6 +198,7 @@ namespace NKikimr::NHttpProxy { constexpr TStringBuf REQUEST_FORWARDED_FOR = "x-forwarded-for"; constexpr TStringBuf REQUEST_TARGET_HEADER = "x-amz-target"; constexpr TStringBuf REQUEST_CONTENT_TYPE_HEADER = "content-type"; + constexpr TStringBuf CRC32_HEADER = "x-amz-crc32"; static const TString CREDENTIAL_PARAM = "credential"; template<class TProtoService, class TProtoRequest, class TProtoResponse, class TProtoResult, class TProtoCall, class TRpcEv> @@ -683,8 +685,8 @@ namespace NKikimr::NHttpProxy { new NHttp::THttpOutgoingResponse(request, "HTTP", "1.1", status, message); response->Set<&NHttp::THttpResponse::Connection>(request->GetConnection()); response->Set(REQUEST_ID_HEADER_EXT, RequestId); - if (!contentType.empty() && !body.empty()) { + response->Set(CRC32_HEADER, ToString(crc32(body.data(), body.size()))); response->Set<&NHttp::THttpResponse::ContentType>(contentType); if (!request->Endpoint->CompressContentTypes.empty()) { contentType = contentType.Before(';'); @@ -704,6 +706,16 @@ namespace NKikimr::NHttpProxy { } return response; }; + auto strByMimeAws = [](MimeTypes contentType) { + switch (contentType) { + case MIME_JSON: + return "application/x-amz-json-1.1"; + case MIME_CBOR: + return "application/x-amz-cbor-1.1"; + default: + return strByMime(contentType); + } + }; if (ResponseData.Status == NYdb::EStatus::SUCCESS) { LOG_SP_INFO_S(ctx, NKikimrServices::HTTP_PROXY, "reply ok"); @@ -716,11 +728,12 @@ namespace NKikimr::NHttpProxy { ResponseData.Body["message"] = ResponseData.ErrorText; ResponseData.Body["__type"] = StatusToErrorType(ResponseData.Status); } + auto response = createResponse( Request, TStringBuilder() << (ui32)StatusToHttpCode(ResponseData.Status), StatusToErrorType(ResponseData.Status), - strByMime(ContentType), + strByMimeAws(ContentType), ResponseData.DumpBody(ContentType) ); @@ -758,7 +771,7 @@ namespace NKikimr::NHttpProxy { switch (contentType) { case MIME_CBOR: { auto toCborStr = NJson::WriteJson(Body, false); - auto toCbor = nlohmann::json::to_cbor({toCborStr.begin(), toCborStr.end()}); + auto toCbor = nlohmann::json::to_cbor(nlohmann::json::parse(toCborStr)); return {(char*)&toCbor[0], toCbor.size()}; } default: { |