storj/pkg/rpc/rpcpeer/peer.go
Jeff Wendling 17e9044c0f pkg/rpc/rpcpeer: check both drpc and grpc for peers on a context
we don't know if an incoming connection is from drpc or grpc during
the migration time, so check both.

Change-Id: I2418dde8b651dcc4a23726057178465224a48103
2019-11-01 17:04:53 -06:00

43 lines
1.1 KiB
Go

// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package rpcpeer
import (
"context"
"crypto/tls"
"net"
"github.com/zeebo/errs"
)
// Error is the class of errors returned by this package.
var Error = errs.Class("rpcpeer")
// Peer represents an rpc peer.
type Peer struct {
Addr net.Addr
State tls.ConnectionState
}
// peerKey is used as a unique value for context keys.
type peerKey struct{}
// NewContext returns a new context with the peer associated as a value.
func NewContext(ctx context.Context, peer *Peer) context.Context {
return context.WithValue(ctx, peerKey{}, peer)
}
// FromContext returns the peer that was previously associated by NewContext.
func FromContext(ctx context.Context) (*Peer, error) {
if peer, ok := ctx.Value(peerKey{}).(*Peer); ok {
return peer, nil
} else if peer, drpcErr := drpcInternalFromContext(ctx); drpcErr == nil {
return peer, nil
} else if peer, grpcErr := grpcInternalFromContext(ctx); grpcErr == nil {
return peer, nil
} else {
return nil, errs.Combine(drpcErr, grpcErr)
}
}