userver
C++ Async Framework
Toggle main menu visibility
Documentation
API Groups
Namespaces
Reference
Class List
Class Index
File List
Macros
All
e
i
l
r
t
u
Functions
Macros
e
i
l
r
t
u
Examples
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Modules
Pages
Concepts
Loading...
Searching...
No Matches
middleware.cpp
1
#
include
<
grpc
-
protovalidate
/
server
/
middleware
.
hpp
>
2
3
#
include
<
fmt
/
core
.
h
>
4
#
include
<
google
/
protobuf
/
arena
.
h
>
5
6
#
include
<
userver
/
logging
/
log
.
hpp
>
7
#
include
<
userver
/
ugrpc
/
status_utils
.
hpp
>
8
9
#
include
<
grpc
-
protovalidate
/
impl
/
utils
.
hpp
>
10
11
USERVER_NAMESPACE_BEGIN
12
13
namespace
grpc_protovalidate::
server
{
14
15
const
ValidationSettings
&
Settings
::
Get
(
std
::
string_view
method_name
)
const
{
16
auto
it
=
per_method
.
find
(
method_name
);
17
return
it
!=
per_method
.
end
() ?
it
->
second
:
global
;
18
}
19
20
Middleware
::
Middleware
(
const
Settings
&
settings
)
21
:
settings_
(
settings
),
validator_factory_
(
grpc_protovalidate
::
impl
::
CreateProtoValidatorFactory
()) {}
22
23
Middleware
::~
Middleware
() =
default
;
24
25
void
Middleware
::
PostRecvMessage
(
ugrpc
::
server
::
MiddlewareCallContext
&
context
,
google
::
protobuf
::
Message
&
request
)
26
const
{
27
const
auto
&
settings
=
settings_
.
Get
(
context
.
GetCallName
());
28
google
::
protobuf
::
Arena
arena
;
29
30
auto
validator
=
validator_factory_
->
NewValidator
(&
arena
,
settings
.
fail_fast
);
31
auto
result
=
validator
.
Validate
(
request
);
32
33
if
(!
result
.
ok
()) {
34
// Usually that means some CEL expression in a proto file can not be parsed or evaluated.
35
context
.
SetError
(
grpc
::
Status
{
36
grpc
::
StatusCode
::
INTERNAL
,
37
fmt
::
format
(
38
"Validator internal error (check request constraints in the proto file): {}"
,
result
.
status
().
ToString
()
39
)});
40
}
else
if
(
result
.
value
().
violations_size
() > 0) {
41
for
(
const
auto
&
violation
:
result
.
value
().
violations
()) {
42
LOG_ERROR
() <<
"Request constraint violation: "
<<
violation
.
proto
();
43
}
44
45
if
(
settings
.
send_violations
) {
46
google
::
rpc
::
Status
gstatus
;
47
gstatus
.
set_code
(
grpc
::
StatusCode
::
INVALID_ARGUMENT
);
48
gstatus
.
set_message
(
fmt
::
format
(
"Request violates constraints (count={})"
,
result
.
value
().
violations_size
())
49
);
50
gstatus
.
add_details
()->
PackFrom
(
result
.
value
().
proto
());
51
context
.
SetError
(
ugrpc
::
ToGrpcStatus
(
gstatus
));
52
}
else
{
53
context
.
SetError
(
grpc
::
Status
{
54
grpc
::
StatusCode
::
INVALID_ARGUMENT
,
55
fmt
::
format
(
"Request violates constraints (count={})"
,
result
.
value
().
violations_size
())});
56
}
57
}
else
{
58
LOG_DEBUG
() <<
"Request is valid"
;
59
}
60
}
25
void
Middleware
::
PostRecvMessage
(
ugrpc
::
server
::
MiddlewareCallContext
&
context
,
google
::
protobuf
::
Message
&
request
) {
…
}
61
62
}
// namespace grpc_protovalidate::server
63
64
USERVER_NAMESPACE_END
grpc-protovalidate
src
grpc-protovalidate
server
middleware.cpp
Generated on Wed Apr 30 2025 15:49:15 for userver by
Doxygen
1.13.2