package transport import ( "context" "net/url" // init encoding _ "github.com/go-kratos/kratos/v2/encoding/json" _ "github.com/go-kratos/kratos/v2/encoding/proto" _ "github.com/go-kratos/kratos/v2/encoding/xml" _ "github.com/go-kratos/kratos/v2/encoding/yaml" ) // Server is transport server. type Server interface { Start(context.Context) error Stop(context.Context) error } // Endpointer is registry endpoint. type Endpointer interface { Endpoint() (*url.URL, error) } // Header is the storage medium used by a Header. type Header interface { Get(key string) string Set(key string, value string) Keys() []string } // Transporter is transport context value interface. type Transporter interface { Kind() string Endpoint() string Operation() string Header() Header } type serverTransportKey struct{} type clientTransportKey struct{} // NewServerContext returns a new Context that carries value. func NewServerContext(ctx context.Context, tr Transporter) context.Context { return context.WithValue(ctx, serverTransportKey{}, tr) } // FromServerContext returns the Transport value stored in ctx, if any. func FromServerContext(ctx context.Context) (tr Transporter, ok bool) { tr, ok = ctx.Value(serverTransportKey{}).(Transporter) return } // NewClientContext returns a new Context that carries value. func NewClientContext(ctx context.Context, tr Transporter) context.Context { return context.WithValue(ctx, clientTransportKey{}, tr) } // FromClientContext returns the Transport value stored in ctx, if any. func FromClientContext(ctx context.Context) (tr Transporter, ok bool) { tr, ok = ctx.Value(clientTransportKey{}).(Transporter) return }