Skip to content

Commit 46c7f6f

Browse files
Fix parsing queue url in new SQS Json API
1 parent 62a41e4 commit 46c7f6f

File tree

3 files changed

+48
-17
lines changed

3 files changed

+48
-17
lines changed

ydb/core/ymq/base/utils.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
3+
#include <util/generic/string.h>
4+
#include <util/string/split.h>
5+
6+
constexpr TStringBuf PRIVATE_REQUEST_PATH_PREFIX = "/private";
7+
8+
namespace NKikimr::NSQS {
9+
static inline bool IsPrivateRequest(const TStringBuf& path) {
10+
return path.StartsWith(PRIVATE_REQUEST_PATH_PREFIX);
11+
}
12+
13+
static inline TString GetRequestPathPart(TStringBuf path, size_t partIdx, bool isPrivateRequest) {
14+
if (isPrivateRequest) {
15+
path.SkipPrefix(PRIVATE_REQUEST_PATH_PREFIX);
16+
}
17+
18+
TVector<TStringBuf> items;
19+
StringSplitter(path).Split('/').AddTo(&items);
20+
if (items.size() > partIdx) {
21+
return TString(items[partIdx]);
22+
}
23+
return TString();
24+
}
25+
26+
static inline TString ExtractQueueNameFromPath(const TStringBuf path, bool isPrivateRequest) {
27+
return GetRequestPathPart(path, 2, isPrivateRequest);
28+
}
29+
30+
static inline TString ExtractAccountNameFromPath(const TStringBuf path, bool isPrivateRequest) {
31+
return GetRequestPathPart(path, 1, isPrivateRequest);
32+
}
33+
}

ydb/core/ymq/http/http.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <ydb/core/ymq/base/helpers.h>
1212
#include <ydb/core/ymq/base/limits.h>
1313
#include <ydb/core/ymq/base/secure_protobuf_printer.h>
14+
#include <ydb/core/ymq/base/utils.h>
1415

1516
#include <ydb/library/actors/core/actorsystem.h>
1617
#include <ydb/library/actors/core/log.h>
@@ -28,6 +29,7 @@
2829
#include <util/string/split.h>
2930
#include <library/cpp/string_utils/url/url.h>
3031

32+
3133
namespace NKikimr::NSQS {
3234

3335
using NKikimrClient::TSqsRequest;
@@ -277,14 +279,6 @@ TString THttpRequest::GetRequestPathPart(TStringBuf path, size_t partIdx) const
277279
return TString();
278280
}
279281

280-
TString THttpRequest::ExtractQueueNameFromPath(const TStringBuf path) {
281-
return GetRequestPathPart(path, 2);
282-
}
283-
284-
TString THttpRequest::ExtractAccountNameFromPath(const TStringBuf path) {
285-
return GetRequestPathPart(path, 1);
286-
}
287-
288282
void THttpRequest::ExtractQueueAndAccountNames(const TStringBuf path) {
289283
if (Action_ == EAction::ModifyPermissions)
290284
return;
@@ -296,9 +290,11 @@ void THttpRequest::ExtractQueueAndAccountNames(const TStringBuf path) {
296290

297291
QueueName_ = *QueryParams_.QueueName;
298292
} else {
299-
const auto pathAndQuery = QueryParams_.QueueUrl ? GetPathAndQuery(*QueryParams_.QueueUrl) : GetPathAndQuery(path);
300-
QueueName_ = ExtractQueueNameFromPath(pathAndQuery);
301-
AccountName_ = ExtractAccountNameFromPath(pathAndQuery);
293+
const auto pathAndQuery = QueryParams_.QueueUrl
294+
? GetPathAndQuery(*QueryParams_.QueueUrl)
295+
: GetPathAndQuery(path);
296+
QueueName_ = NKikimr::NSQS::ExtractQueueNameFromPath(pathAndQuery, IsPrivateRequest_);
297+
AccountName_ = NKikimr::NSQS::ExtractAccountNameFromPath(pathAndQuery, IsPrivateRequest_);
302298

303299
if (IsProxyAction(Action_)) {
304300
if (QueryParams_.QueueUrl && *QueryParams_.QueueUrl) {
@@ -381,9 +377,7 @@ void THttpRequest::ParseCgiParameters(const TCgiParameters& params) {
381377
}
382378

383379
void THttpRequest::ParsePrivateRequestPathPrefix(const TStringBuf& path) {
384-
if (path.StartsWith(PRIVATE_REQUEST_PATH_PREFIX)) {
385-
IsPrivateRequest_ = true;
386-
}
380+
IsPrivateRequest_ = NKikimr::NSQS::IsPrivateRequest(path);
387381
}
388382

389383
ui64 THttpRequest::CalculateRequestSizeInBytes(const THttpInput& input, const ui64 contentLength) const {

ydb/services/ymq/utils.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <util/generic/string.h>
44
#include <util/generic/maybe.h>
55
#include <util/string/split.h>
6+
#include <ydb/core/ymq/base/utils.h>
67

78
namespace NKikimr::NYmq {
89
inline static TMaybe<std::pair<TString, TString>> CloudIdAndResourceIdFromQueueUrl(const TString& queueUrl) {
@@ -13,10 +14,13 @@ namespace NKikimr::NYmq {
1314

1415
auto restOfUrl = queueUrl.substr(protocolSeparator + 3);
1516
auto parts = StringSplitter(restOfUrl).Split('/').ToList<TString>();
16-
if (parts.size() != 4) {
17+
if (parts.size() < 3) {
1718
return Nothing();
1819
}
1920

20-
return std::pair<TString, TString>(parts[1], parts[2]);
21+
bool isPrivateRequest = NKikimr::NSQS::IsPrivateRequest(restOfUrl);
22+
TString queueName = NKikimr::NSQS::ExtractQueueNameFromPath(restOfUrl, isPrivateRequest);
23+
TString accountName = NKikimr::NSQS::ExtractAccountNameFromPath(restOfUrl, isPrivateRequest);
24+
return std::pair<TString, TString>(std::move(accountName), std::move(queueName));
2125
}
22-
}
26+
}

0 commit comments

Comments
 (0)