/*
Copyright The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Code generated by applyconfiguration-gen. DO NOT EDIT.

package v1

import (
	apisv1 "sigs.k8s.io/gateway-api/apis/v1"
)

// HTTPExternalAuthFilterApplyConfiguration represents a declarative configuration of the HTTPExternalAuthFilter type for use
// with apply.
//
// HTTPExternalAuthFilter defines a filter that modifies requests by sending
// request details to an external authorization server.
//
// Support: Extended
// Feature Name: HTTPRouteExternalAuth
type HTTPExternalAuthFilterApplyConfiguration struct {
	// ExternalAuthProtocol describes which protocol to use when communicating with an
	// ext_authz authorization server.
	//
	// When this is set to GRPC, each backend must use the Envoy ext_authz protocol
	// on the port specified in `backendRefs`. Requests and responses are defined
	// in the protobufs explained at:
	// https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/auth/v3/external_auth.proto
	//
	// When this is set to HTTP, each backend must respond with a `200` status
	// code in on a successful authorization. Any other code is considered
	// an authorization failure.
	//
	// Feature Names:
	// GRPC Support - HTTPRouteExternalAuthGRPC
	// HTTP Support - HTTPRouteExternalAuthHTTP
	ExternalAuthProtocol *apisv1.HTTPRouteExternalAuthProtocol `json:"protocol,omitempty"`
	// BackendRef is a reference to a backend to send authorization
	// requests to.
	//
	// The backend must speak the selected protocol (GRPC or HTTP) on the
	// referenced port.
	//
	// If the backend service requires TLS, use BackendTLSPolicy to tell the
	// implementation to supply the TLS details to be used to connect to that
	// backend.
	BackendRef *BackendObjectReferenceApplyConfiguration `json:"backendRef,omitempty"`
	// GRPCAuthConfig contains configuration for communication with ext_authz
	// protocol-speaking backends.
	//
	// If unset, implementations must assume the default behavior for each
	// included field is intended.
	GRPCAuthConfig *GRPCAuthConfigApplyConfiguration `json:"grpc,omitempty"`
	// HTTPAuthConfig contains configuration for communication with HTTP-speaking
	// backends.
	//
	// If unset, implementations must assume the default behavior for each
	// included field is intended.
	HTTPAuthConfig *HTTPAuthConfigApplyConfiguration `json:"http,omitempty"`
	// ForwardBody controls if requests to the authorization server should include
	// the body of the client request; and if so, how big that body is allowed
	// to be.
	//
	// It is expected that implementations will buffer the request body up to
	// `forwardBody.maxSize` bytes. Bodies over that size must be rejected with a
	// 4xx series error (413 or 403 are common examples), and fail processing
	// of the filter.
	//
	// If unset, or `forwardBody.maxSize` is set to `0`, then the body will not
	// be forwarded.
	//
	// Feature Name: HTTPRouteExternalAuthForwardBody
	ForwardBody *ForwardBodyConfigApplyConfiguration `json:"forwardBody,omitempty"`
}

// HTTPExternalAuthFilterApplyConfiguration constructs a declarative configuration of the HTTPExternalAuthFilter type for use with
// apply.
func HTTPExternalAuthFilter() *HTTPExternalAuthFilterApplyConfiguration {
	return &HTTPExternalAuthFilterApplyConfiguration{}
}

// WithExternalAuthProtocol sets the ExternalAuthProtocol field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the ExternalAuthProtocol field is set to the value of the last call.
func (b *HTTPExternalAuthFilterApplyConfiguration) WithExternalAuthProtocol(value apisv1.HTTPRouteExternalAuthProtocol) *HTTPExternalAuthFilterApplyConfiguration {
	b.ExternalAuthProtocol = &value
	return b
}

// WithBackendRef sets the BackendRef field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the BackendRef field is set to the value of the last call.
func (b *HTTPExternalAuthFilterApplyConfiguration) WithBackendRef(value *BackendObjectReferenceApplyConfiguration) *HTTPExternalAuthFilterApplyConfiguration {
	b.BackendRef = value
	return b
}

// WithGRPCAuthConfig sets the GRPCAuthConfig field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the GRPCAuthConfig field is set to the value of the last call.
func (b *HTTPExternalAuthFilterApplyConfiguration) WithGRPCAuthConfig(value *GRPCAuthConfigApplyConfiguration) *HTTPExternalAuthFilterApplyConfiguration {
	b.GRPCAuthConfig = value
	return b
}

// WithHTTPAuthConfig sets the HTTPAuthConfig field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the HTTPAuthConfig field is set to the value of the last call.
func (b *HTTPExternalAuthFilterApplyConfiguration) WithHTTPAuthConfig(value *HTTPAuthConfigApplyConfiguration) *HTTPExternalAuthFilterApplyConfiguration {
	b.HTTPAuthConfig = value
	return b
}

// WithForwardBody sets the ForwardBody field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the ForwardBody field is set to the value of the last call.
func (b *HTTPExternalAuthFilterApplyConfiguration) WithForwardBody(value *ForwardBodyConfigApplyConfiguration) *HTTPExternalAuthFilterApplyConfiguration {
	b.ForwardBody = value
	return b
}
