validator

package
v2.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 22, 2024 License: Apache-2.0 Imports: 4 Imported by: 32

Documentation

Overview

Package validator

`validator` is a generic request contents validator server-side middleware for gRPC.

Request Validator Middleware

Validating input is important, and hard. It also causes a lot of boilerplate code. This middleware checks for the existence of a `Validate` method on each of the messages of a gRPC request. This includes the single request of the `Unary` calls, as well as each message of the inbound Stream calls. In case of a validation failure, an `InvalidArgument` gRPC status is returned, along with a description of the validation failure.

While it is generic, it was intended to be used with https://github.com/mwitkow/go-proto-validators, a Go protocol buffers codegen plugin that creates the `Validate` methods (including nested messages) based on declarative options in the `.proto` files themselves. For example:

syntax = "proto3";
package validator.examples;
import "github.com/mwitkow/go-proto-validators/validator.proto";

message InnerMessage {
  // some_integer can only be in range (1, 100).
  int32 some_integer = 1 [(validator.field) = {int_gt: 0, int_lt: 100}];
  // some_float can only be in range (0;1).
  double some_float = 2 [(validator.field) = {float_gte: 0, float_lte: 1}];
}

message OuterMessage {
  // important_string must be a lowercase alpha-numeric of 5 to 30 characters (RE2 syntax).
  string important_string = 1 [(validator.field) = {regex: "^[a-z]{2,5}$"}];
  // proto3 doesn't have `required`, the `msg_exist` enforces presence of InnerMessage.
  InnerMessage inner = 2 [(validator.field) = {msg_exists : true}];
}

The `OuterMessage.Validate` would include validation of regexes, existence of the InnerMessage and the range values within it. The `grpc_validator` middleware would then automatically use that to check all messages processed by the server.

Please consult https://github.com/mwitkow/go-proto-validators for details on `protoc` invocation and other parameters of customization.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func StreamServerInterceptor

func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor

StreamServerInterceptor returns a new streaming server interceptor that validates incoming messages.

Note that generated codes prior to protoc-gen-validate v0.6.0 do not provide an all-validation interface. In this case the interceptor fallbacks to legacy validation and `all` is ignored. The stage at which invalid messages will be rejected with `InvalidArgument` varies based on the type of the RPC. For `ServerStream` (1:m) requests, it will happen before reaching any userspace handlers. For `ClientStream` (n:1) or `BidiStream` (n:m) RPCs, the messages will be rejected on calls to `stream.Recv()`.

func UnaryClientInterceptor

func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor

UnaryClientInterceptor returns a new unary client interceptor that validates outgoing messages.

Invalid messages will be rejected with `InvalidArgument` before sending the request to server. Note that generated codes prior to protoc-gen-validate v0.6.0 do not provide an all-validation interface. In this case the interceptor fallbacks to legacy validation and `all` is ignored.

func UnaryServerInterceptor

func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor

UnaryServerInterceptor returns a new unary server interceptor that validates incoming messages.

Invalid messages will be rejected with `InvalidArgument` before reaching any userspace handlers. Note that generated codes prior to protoc-gen-validate v0.6.0 do not provide an all-validation interface. In this case the interceptor fallbacks to legacy validation and `all` is ignored.

Types

type OnValidationErrCallback

type OnValidationErrCallback func(ctx context.Context, err error)

type Option

type Option func(*options)

func WithFailFast

func WithFailFast() Option

WithFailFast tells validator to immediately stop doing further validation after first validation error. This option is ignored if message is only supporting validator.validatorLegacy interface.

func WithOnValidationErrCallback

func WithOnValidationErrCallback(onValidationErrCallback OnValidationErrCallback) Option

WithOnValidationErrCallback registers function that will be invoked on validation error(s).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL