Skip to content

Commit c4d590a

Browse files
authored
Merge 98e6d44 into e3ffe79
2 parents e3ffe79 + 98e6d44 commit c4d590a

File tree

5 files changed

+86
-109
lines changed

5 files changed

+86
-109
lines changed

ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/types/exceptions/exceptions.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ class TYdbException : public yexception {
1212
TYdbException(const std::string& reason);
1313
};
1414

15+
class TAuthenticationError : public TYdbException {
16+
public:
17+
TAuthenticationError(const std::string& reason);
18+
};
19+
1520
class TContractViolation : public TYdbException {
1621
public:
1722
TContractViolation(const std::string& reason);

ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.cpp

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,25 @@ namespace NYdb::inline Dev {
88

99
bool IsTokenCorrect(const std::string& in) {
1010
for (char c : in) {
11-
if (!(IsAsciiAlnum(c) || IsAsciiPunct(c) || c == ' '))
11+
if (!(IsAsciiAlnum(c) || IsAsciiPunct(c) || c == ' ')) {
1212
return false;
13+
}
1314
}
1415
return true;
1516
}
1617

1718
std::string GetAuthInfo(TDbDriverStatePtr p) {
18-
auto token = p->CredentialsProvider->GetAuthInfo();
19-
if (!IsTokenCorrect(token)) {
20-
throw TContractViolation("token is incorrect, illegal characters found");
19+
try {
20+
auto token = p->CredentialsProvider->GetAuthInfo();
21+
if (!IsTokenCorrect(token)) {
22+
throw TAuthenticationError("token is incorrect, illegal characters found");
23+
}
24+
return token;
25+
} catch (const TAuthenticationError& e) {
26+
throw e;
27+
} catch (const std::exception& e) {
28+
throw TAuthenticationError(TStringBuilder() << "Can't get Authentication info from CredentialsProvider. " << e.what());
2129
}
22-
return token;
2330
}
2431

2532
void SetDatabaseHeader(TCallMeta& meta, const std::string& database) {
@@ -442,4 +449,40 @@ void TGRpcConnectionsImpl::EnqueueResponse(IObjectInQueue* action) {
442449
});
443450
}
444451

452+
TCallMeta TGRpcConnectionsImpl::MakeCallMeta(const TRpcRequestSettings& requestSettings, const TDbDriverStatePtr& dbState) const {
453+
TCallMeta meta;
454+
meta.Timeout = requestSettings.Deadline;
455+
#ifndef YDB_GRPC_UNSECURE_AUTH
456+
meta.CallCredentials = dbState->CallCredentials;
457+
#else
458+
if (requestSettings.UseAuth && dbState->CredentialsProvider && dbState->CredentialsProvider->IsValid()) {
459+
meta.Aux.push_back({YDB_AUTH_TICKET_HEADER, GetAuthInfo(dbState)});
460+
}
461+
#endif
462+
if (!requestSettings.TraceId.empty()) {
463+
meta.Aux.push_back({YDB_TRACE_ID_HEADER, requestSettings.TraceId});
464+
}
465+
466+
if (!requestSettings.RequestType.empty()) {
467+
meta.Aux.push_back({YDB_REQUEST_TYPE_HEADER, requestSettings.RequestType});
468+
}
469+
470+
if (!requestSettings.TraceParent.empty()) {
471+
meta.Aux.push_back({OTEL_TRACE_HEADER, requestSettings.TraceParent});
472+
}
473+
474+
if (!dbState->Database.empty()) {
475+
// See TDbDriverStateTracker::GetDriverState to find place where we do quote non ASCII characters
476+
meta.Aux.push_back({YDB_DATABASE_HEADER, dbState->Database});
477+
}
478+
479+
static const std::string clientPid = GetClientPIDHeaderValue();
480+
481+
meta.Aux.push_back({YDB_SDK_BUILD_INFO_HEADER, CreateSDKBuildInfo()});
482+
meta.Aux.push_back({YDB_CLIENT_PID, clientPid});
483+
meta.Aux.insert(meta.Aux.end(), requestSettings.Header.begin(), requestSettings.Header.end());
484+
485+
return meta;
486+
}
487+
445488
} // namespace NYdb

ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.h

Lines changed: 28 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ class ICredentialsProvider;
3232
using TDeferredResultCb = std::function<void(google::protobuf::Any*, TPlainStatus status)>;
3333

3434
std::string GetAuthInfo(TDbDriverStatePtr p);
35-
void SetDatabaseHeader(TCallMeta& meta, const std::string& database);
3635
std::string CreateSDKBuildInfo();
3736

3837
class TGRpcConnectionsImpl
@@ -236,43 +235,17 @@ class TGRpcConnectionsImpl
236235
}
237236

238237
TCallMeta meta;
239-
meta.Timeout = requestSettings.Deadline;
240-
#ifndef YDB_GRPC_UNSECURE_AUTH
241-
meta.CallCredentials = dbState->CallCredentials;
242-
#else
243-
if (requestSettings.UseAuth && dbState->CredentialsProvider && dbState->CredentialsProvider->IsValid()) {
244-
try {
245-
meta.Aux.push_back({ YDB_AUTH_TICKET_HEADER, GetAuthInfo(dbState) });
246-
} catch (const std::exception& e) {
247-
userResponseCb(
248-
nullptr,
249-
TPlainStatus(
250-
EStatus::CLIENT_UNAUTHENTICATED,
251-
TStringBuilder() << "Can't get Authentication info from CredentialsProvider. " << e.what()
252-
)
253-
);
254-
return;
255-
}
256-
}
257-
#endif
258-
if (!requestSettings.TraceId.empty()) {
259-
meta.Aux.push_back({YDB_TRACE_ID_HEADER, requestSettings.TraceId});
260-
}
261238

262-
if (!requestSettings.RequestType.empty()) {
263-
meta.Aux.push_back({YDB_REQUEST_TYPE_HEADER, requestSettings.RequestType});
264-
}
265-
266-
if (!dbState->Database.empty()) {
267-
SetDatabaseHeader(meta, dbState->Database);
239+
try {
240+
meta = MakeCallMeta(requestSettings, dbState);
241+
} catch (const TAuthenticationError& e) {
242+
userResponseCb(
243+
nullptr,
244+
TPlainStatus(EStatus::CLIENT_UNAUTHENTICATED, e.what())
245+
);
246+
return;
268247
}
269248

270-
static const std::string clientPid = GetClientPIDHeaderValue();
271-
272-
meta.Aux.push_back({YDB_SDK_BUILD_INFO_HEADER, CreateSDKBuildInfo()});
273-
meta.Aux.push_back({YDB_CLIENT_PID, clientPid});
274-
meta.Aux.insert(meta.Aux.end(), requestSettings.Header.begin(), requestSettings.Header.end());
275-
276249
dbState->StatCollector.IncGRpcInFlight();
277250
dbState->StatCollector.IncGRpcInFlightByHost(endpoint.GetEndpoint());
278251

@@ -463,42 +436,21 @@ class TGRpcConnectionsImpl
463436
}
464437

465438
WithServiceConnection<TService>(
466-
[request, responseCb = std::move(responseCb), rpc, requestSettings, context = std::move(context), dbState](TPlainStatus status, TConnection serviceConnection, TEndpointKey endpoint) mutable {
439+
[this, request, responseCb = std::move(responseCb), rpc, requestSettings, context = std::move(context), dbState](TPlainStatus status, TConnection serviceConnection, TEndpointKey endpoint) mutable {
467440
if (!status.Ok()) {
468441
responseCb(std::move(status), nullptr);
469442
return;
470443
}
471444

472445
TCallMeta meta;
473-
meta.Timeout = requestSettings.Deadline;
474-
#ifndef YDB_GRPC_UNSECURE_AUTH
475-
meta.CallCredentials = dbState->CallCredentials;
476-
#else
477-
if (requestSettings.UseAuth && dbState->CredentialsProvider && dbState->CredentialsProvider->IsValid()) {
478-
try {
479-
meta.Aux.push_back({ YDB_AUTH_TICKET_HEADER, GetAuthInfo(dbState) });
480-
} catch (const std::exception& e) {
481-
responseCb(
482-
TPlainStatus(
483-
EStatus::CLIENT_UNAUTHENTICATED,
484-
TStringBuilder() << "Can't get Authentication info from CredentialsProvider. " << e.what()
485-
),
486-
nullptr
487-
);
488-
return;
489-
}
490-
}
491-
#endif
492-
if (!requestSettings.TraceId.empty()) {
493-
meta.Aux.push_back({YDB_TRACE_ID_HEADER, requestSettings.TraceId});
494-
}
495-
496-
if (!requestSettings.RequestType.empty()) {
497-
meta.Aux.push_back({YDB_REQUEST_TYPE_HEADER, requestSettings.RequestType});
498-
}
499-
500-
if (!dbState->Database.empty()) {
501-
SetDatabaseHeader(meta, dbState->Database);
446+
try {
447+
meta = MakeCallMeta(requestSettings, dbState);
448+
} catch (const TAuthenticationError& e) {
449+
responseCb(
450+
TPlainStatus(EStatus::CLIENT_UNAUTHENTICATED, e.what()),
451+
nullptr
452+
);
453+
return;
502454
}
503455

504456
dbState->StatCollector.IncGRpcInFlight();
@@ -557,49 +509,24 @@ class TGRpcConnectionsImpl
557509
}
558510

559511
WithServiceConnection<TService>(
560-
[connectedCallback = std::move(connectedCallback), rpc, requestSettings, context = std::move(context), dbState]
512+
[this, connectedCallback = std::move(connectedCallback), rpc, requestSettings, context = std::move(context), dbState]
561513
(TPlainStatus status, TConnection serviceConnection, TEndpointKey endpoint) mutable {
562514
if (!status.Ok()) {
563515
connectedCallback(std::move(status), nullptr);
564516
return;
565517
}
566518

567519
TCallMeta meta;
568-
#ifndef YDB_GRPC_UNSECURE_AUTH
569-
meta.CallCredentials = dbState->CallCredentials;
570-
#else
571-
if (requestSettings.UseAuth && dbState->CredentialsProvider && dbState->CredentialsProvider->IsValid()) {
572-
try {
573-
meta.Aux.push_back({ YDB_AUTH_TICKET_HEADER, GetAuthInfo(dbState) });
574-
} catch (const std::exception& e) {
575-
connectedCallback(
576-
TPlainStatus(
577-
EStatus::CLIENT_UNAUTHENTICATED,
578-
TStringBuilder() << "Can't get Authentication info from CredentialsProvider. " << e.what()
579-
),
580-
nullptr
581-
);
582-
return;
583-
}
584-
}
585-
#endif
586-
if (!requestSettings.TraceId.empty()) {
587-
meta.Aux.push_back({YDB_TRACE_ID_HEADER, requestSettings.TraceId});
588-
}
589-
590-
if (!requestSettings.RequestType.empty()) {
591-
meta.Aux.push_back({YDB_REQUEST_TYPE_HEADER, requestSettings.RequestType});
592-
}
593-
594-
if (!dbState->Database.empty()) {
595-
SetDatabaseHeader(meta, dbState->Database);
520+
try {
521+
meta = MakeCallMeta(requestSettings, dbState);
522+
} catch (const TAuthenticationError& e) {
523+
connectedCallback(
524+
TPlainStatus(EStatus::CLIENT_UNAUTHENTICATED, e.what()),
525+
nullptr
526+
);
527+
return;
596528
}
597529

598-
static const std::string clientPid = GetClientPIDHeaderValue();
599-
meta.Aux.push_back({YDB_SDK_BUILD_INFO_HEADER, CreateSDKBuildInfo()});
600-
meta.Aux.push_back({YDB_CLIENT_PID, clientPid});
601-
meta.Aux.insert(meta.Aux.end(), requestSettings.Header.begin(), requestSettings.Header.end());
602-
603530
dbState->StatCollector.IncGRpcInFlight();
604531
dbState->StatCollector.IncGRpcInFlightByHost(endpoint.GetEndpoint());
605532

@@ -751,6 +678,8 @@ class TGRpcConnectionsImpl
751678
void EnqueueResponse(IObjectInQueue* action);
752679

753680
private:
681+
TCallMeta MakeCallMeta(const TRpcRequestSettings& requestSettings, const TDbDriverStatePtr& dbState) const;
682+
754683
std::mutex ExtensionsLock_;
755684
::NMonitoring::TMetricRegistry* MetricRegistryPtr_ = nullptr;
756685

ydb/public/sdk/cpp/src/client/impl/internal/rpc_request_settings/settings.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,15 @@ struct TRpcRequestSettings {
1919
} EndpointPolicy = TEndpointPolicy::UsePreferredEndpointOptionally;
2020
bool UseAuth = true;
2121
NYdb::TDeadline Deadline = NYdb::TDeadline::Max();
22+
std::string TraceParent;
2223

2324
template <typename TRequestSettings>
2425
static TRpcRequestSettings Make(const TRequestSettings& settings, const TEndpointKey& preferredEndpoint = {}, TEndpointPolicy endpointPolicy = TEndpointPolicy::UsePreferredEndpointOptionally) {
2526
TRpcRequestSettings rpcSettings;
2627
rpcSettings.TraceId = settings.TraceId_;
2728
rpcSettings.RequestType = settings.RequestType_;
2829
rpcSettings.Header = settings.Header_;
29-
30-
if (!settings.TraceParent_.empty()) {
31-
rpcSettings.Header.emplace_back("traceparent", settings.TraceParent_);
32-
}
33-
30+
rpcSettings.TraceParent = settings.TraceParent_;
3431
rpcSettings.PreferredEndpoint = preferredEndpoint;
3532
rpcSettings.EndpointPolicy = endpointPolicy;
3633
rpcSettings.UseAuth = true;

ydb/public/sdk/cpp/src/client/types/exceptions/exceptions.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ TYdbException::TYdbException(const std::string& reason) {
66
Append(reason);
77
}
88

9+
TAuthenticationError::TAuthenticationError(const std::string& reason)
10+
: TYdbException(reason) {}
11+
912
TContractViolation::TContractViolation(const std::string& reason)
1013
: TYdbException(reason) {}
1114

0 commit comments

Comments
 (0)