diff --git a/ydb/core/ymq/base/utils.h b/ydb/core/ymq/base/utils.h new file mode 100644 index 000000000000..bb121621c9e9 --- /dev/null +++ b/ydb/core/ymq/base/utils.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +constexpr TStringBuf PRIVATE_REQUEST_PATH_PREFIX = "/private"; + +namespace NKikimr::NSQS { + static inline bool IsPrivateRequest(const TStringBuf& path) { + return path.StartsWith(PRIVATE_REQUEST_PATH_PREFIX); + } + + static inline TString GetRequestPathPart(TStringBuf path, size_t partIdx, bool isPrivateRequest) { + if (isPrivateRequest) { + path.SkipPrefix(PRIVATE_REQUEST_PATH_PREFIX); + } + + TVector items; + StringSplitter(path).Split('/').AddTo(&items); + if (items.size() > partIdx) { + return TString(items[partIdx]); + } + return TString(); + } + + static inline TString ExtractQueueNameFromPath(const TStringBuf path, bool isPrivateRequest) { + return GetRequestPathPart(path, 2, isPrivateRequest); + } + + static inline TString ExtractAccountNameFromPath(const TStringBuf path, bool isPrivateRequest) { + return GetRequestPathPart(path, 1, isPrivateRequest); + } +} diff --git a/ydb/core/ymq/http/http.cpp b/ydb/core/ymq/http/http.cpp index b652a9f408b5..7cb47162509a 100644 --- a/ydb/core/ymq/http/http.cpp +++ b/ydb/core/ymq/http/http.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -48,8 +49,6 @@ const std::vector PRIVATE_TOKENS_HEADERS = { const TString CREDENTIAL_PARAM = "credential"; -constexpr TStringBuf PRIVATE_REQUEST_PATH_PREFIX = "/private"; - const TSet ModifyPermissionsActions = {"GrantPermissions", "RevokePermissions", "SetPermissions"}; bool IsPrivateTokenHeader(TStringBuf headerName) { @@ -264,26 +263,9 @@ bool THttpRequest::DoReply(const TReplyParams& p) { } } -TString THttpRequest::GetRequestPathPart(TStringBuf path, size_t partIdx) const { - if (IsPrivateRequest_) { - path.SkipPrefix(PRIVATE_REQUEST_PATH_PREFIX); - } - - TVector items; - StringSplitter(path).Split('/').AddTo(&items); - if (items.size() > partIdx) { - return TString(items[partIdx]); - } - return TString(); -} - TString THttpRequest::ExtractQueueNameFromPath(const TStringBuf path) { - return GetRequestPathPart(path, 2); -} - -TString THttpRequest::ExtractAccountNameFromPath(const TStringBuf path) { - return GetRequestPathPart(path, 1); -} + return NKikimr::NSQS::ExtractQueueNameFromPath(path, IsPrivateRequest_); +}; void THttpRequest::ExtractQueueAndAccountNames(const TStringBuf path) { if (Action_ == EAction::ModifyPermissions) @@ -296,9 +278,11 @@ void THttpRequest::ExtractQueueAndAccountNames(const TStringBuf path) { QueueName_ = *QueryParams_.QueueName; } else { - const auto pathAndQuery = QueryParams_.QueueUrl ? GetPathAndQuery(*QueryParams_.QueueUrl) : GetPathAndQuery(path); + const auto pathAndQuery = QueryParams_.QueueUrl + ? GetPathAndQuery(*QueryParams_.QueueUrl) + : GetPathAndQuery(path); QueueName_ = ExtractQueueNameFromPath(pathAndQuery); - AccountName_ = ExtractAccountNameFromPath(pathAndQuery); + AccountName_ = NKikimr::NSQS::ExtractAccountNameFromPath(pathAndQuery, IsPrivateRequest_); if (IsProxyAction(Action_)) { if (QueryParams_.QueueUrl && *QueryParams_.QueueUrl) { @@ -381,9 +365,7 @@ void THttpRequest::ParseCgiParameters(const TCgiParameters& params) { } void THttpRequest::ParsePrivateRequestPathPrefix(const TStringBuf& path) { - if (path.StartsWith(PRIVATE_REQUEST_PATH_PREFIX)) { - IsPrivateRequest_ = true; - } + IsPrivateRequest_ = NKikimr::NSQS::IsPrivateRequest(path); } ui64 THttpRequest::CalculateRequestSizeInBytes(const THttpInput& input, const ui64 contentLength) const { diff --git a/ydb/core/ymq/http/http.h b/ydb/core/ymq/http/http.h index b190e1e6cc6d..81f2254aeeba 100644 --- a/ydb/core/ymq/http/http.h +++ b/ydb/core/ymq/http/http.h @@ -56,7 +56,6 @@ class THttpRequest : public TRequestReplier { TString GetRequestPathPart(TStringBuf path, size_t partIdx) const; TString ExtractQueueNameFromPath(const TStringBuf path); - TString ExtractAccountNameFromPath(const TStringBuf path); ui64 CalculateRequestSizeInBytes(const THttpInput& input, const ui64 contentLength) const; void ExtractQueueAndAccountNames(const TStringBuf path); diff --git a/ydb/services/ymq/utils.h b/ydb/services/ymq/utils.h index 5a5aeb22462a..d5cd58f8a3bf 100644 --- a/ydb/services/ymq/utils.h +++ b/ydb/services/ymq/utils.h @@ -3,6 +3,7 @@ #include #include #include +#include namespace NKikimr::NYmq { inline static TMaybe> CloudIdAndResourceIdFromQueueUrl(const TString& queueUrl) { @@ -13,10 +14,13 @@ namespace NKikimr::NYmq { auto restOfUrl = queueUrl.substr(protocolSeparator + 3); auto parts = StringSplitter(restOfUrl).Split('/').ToList(); - if (parts.size() != 4) { + if (parts.size() < 3) { return Nothing(); } - return std::pair(parts[1], parts[2]); + bool isPrivateRequest = NKikimr::NSQS::IsPrivateRequest(restOfUrl); + TString queueName = NKikimr::NSQS::ExtractQueueNameFromPath(restOfUrl, isPrivateRequest); + TString accountName = NKikimr::NSQS::ExtractAccountNameFromPath(restOfUrl, isPrivateRequest); + return std::pair(std::move(accountName), std::move(queueName)); } -} \ No newline at end of file +}