59 lines
1.8 KiB
Go
59 lines
1.8 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package protocolversion
|
|
|
|
import (
|
|
"context"
|
|
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/metadata"
|
|
|
|
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
|
|
)
|
|
|
|
// UnaryClientInterceptor returns an interceptor for the client to set
|
|
// the proper headers based on the attached VersionInfo. The VersionInfo is
|
|
// misnamed in this case and represents the client info.
|
|
func UnaryClientInterceptor(serverInfo *vagrant_server.VersionInfo) grpc.UnaryClientInterceptor {
|
|
return func(
|
|
ctx context.Context,
|
|
method string,
|
|
req, reply interface{},
|
|
cc *grpc.ClientConn,
|
|
invoker grpc.UnaryInvoker,
|
|
opts ...grpc.CallOption) error {
|
|
ctx = metadata.AppendToOutgoingContext(ctx,
|
|
HeaderClientApiProtocol, EncodeHeader(
|
|
serverInfo.Api.Minimum, serverInfo.Api.Current),
|
|
HeaderClientEntrypointProtocol, EncodeHeader(
|
|
serverInfo.Entrypoint.Minimum, serverInfo.Entrypoint.Current),
|
|
HeaderClientVersion, serverInfo.Version,
|
|
)
|
|
|
|
return invoker(ctx, method, req, reply, cc, opts...)
|
|
}
|
|
}
|
|
|
|
// StreamClientInterceptor returns an interceptor for the client to set
|
|
// the proper headers for stream APIs.
|
|
func StreamClientInterceptor(serverInfo *vagrant_server.VersionInfo) grpc.StreamClientInterceptor {
|
|
return func(
|
|
ctx context.Context,
|
|
desc *grpc.StreamDesc,
|
|
cc *grpc.ClientConn,
|
|
method string,
|
|
streamer grpc.Streamer,
|
|
opts ...grpc.CallOption) (grpc.ClientStream, error) {
|
|
ctx = metadata.AppendToOutgoingContext(ctx,
|
|
HeaderClientApiProtocol, EncodeHeader(
|
|
serverInfo.Api.Minimum, serverInfo.Api.Current),
|
|
HeaderClientEntrypointProtocol, EncodeHeader(
|
|
serverInfo.Entrypoint.Minimum, serverInfo.Entrypoint.Current),
|
|
HeaderClientVersion, serverInfo.Version,
|
|
)
|
|
|
|
return streamer(ctx, desc, cc, method, opts...)
|
|
}
|
|
}
|