Documentation ¶
Overview ¶
Package transport implements the low level concerns of sending and receiving bytes.
Index ¶
- func CanonicalizeHeaderKey(k string) string
- func IsBadRequestError(err error) bool
- func IsTimeoutError(err error) bool
- func IsUnexpectedError(err error) bool
- type Channel
- type Deps
- type Encoding
- type Filter
- type FilterFunc
- type Handler
- type Headers
- type Inbound
- type Interceptor
- type InterceptorFunc
- type MapRegistry
- type Options
- type Outbound
- type Outbounds
- type Registry
- type Request
- type Response
- type ResponseWriter
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func CanonicalizeHeaderKey ¶
CanonicalizeHeaderKey canonicalizes the given header key for storage into the Headers map.
func IsBadRequestError ¶
IsBadRequestError returns true if the request could not be processed because it was invalid.
func IsTimeoutError ¶
IsTimeoutError return true if the given error is a TimeoutError.
func IsUnexpectedError ¶
IsUnexpectedError returns true if the server failed to process the request because of an unhandled error.
Types ¶
type Channel ¶
type Channel interface { // Name of the service making the request. Caller() string // Name of the service to which the request is being made. Service() string // Returns an outbound to send the request through. // // MAY be called multiple times for a request. MAY return different outbounds // for each call. The returned outbound MUST have already been started. GetOutbound() Outbound }
Channel scopes outbounds to a single caller-service pair.
func IdentityChannel ¶
IdentityChannel constructs a simple Channel for the given caller-service pair which always returns the given Outbound.
type Deps ¶
type Deps struct {
// contains filtered or unexported fields
}
Deps is a struct shared by all inbounds and outbounds in the context of a dispatcher. The dispatcher starts every transport with these dependencies. A zero Deps struct is suitable for testing and provides noop implementations of all dependencies.
var NoDeps Deps
NoDeps is a singleton zero Deps instance.
func (Deps) Tracer ¶ added in v0.2.0
func (d Deps) Tracer() opentracing.Tracer
Tracer provides the opentracing Tracer instance needed by transports.
func (Deps) WithTracer ¶ added in v0.2.0
WithTracer returns a variant of these dependencies with a given opentracing Tracer.
type Filter ¶
type Filter interface {
Call(ctx context.Context, request *Request, out Outbound) (*Response, error)
}
Filter defines transport-level middleware for Outbounds.
Filters MAY ¶
- change the context - change the request - change the returned response - handle the returned error - call the given outbound zero or more times
Filters MUST ¶
- always return a non-nil Response or error. - be thread-safe
Filters are re-used across requests and MAY be called multiple times on the same request.
var NopFilter Filter = nopFilter{}
NopFilter is a filter that does not do anything special. It simply calls the underlying Outbound.
type FilterFunc ¶
FilterFunc adapts a function into a Filter.
type Handler ¶
type Handler interface { // Handle the given request, writing the response to the given // ResponseWriter. // // An error may be returned in case of failures. BadRequestError must be // returned for invalid requests. All other failures are treated as // UnexpectedErrors. Handle( ctx context.Context, opts Options, req *Request, resw ResponseWriter, ) error }
Handler handles a single transport-level request.
func ApplyInterceptor ¶
func ApplyInterceptor(h Handler, i Interceptor) Handler
ApplyInterceptor applies the given Interceptor to the given Handler.
type Headers ¶
Headers is the transport-level representation of application headers.
Keys in the map MUST be canonicalized with CanonicalizeHeaderKey.
You probably want to look at yarpc.Headers instead.
func HeadersFromMap ¶
HeadersFromMap builds a new Headers object from the given map of header key-value pairs.
func NewHeadersWithCapacity ¶
NewHeadersWithCapacity builds a new Headers object with the given capacity.
func (Headers) Del ¶
Del deletes the header with the given name from the Headers map.
This is a no-op if the key does not exist.
func (Headers) Items ¶
Items returns the underlying map for this Headers map.
Keys in the map are normalized using CanonicalizeHeaderKey.
The returned map MUST NOT be mutated.
func (Headers) With ¶
With returns a Headers object with the given key-value pair added to it. The returned object MAY not point to the same Headers underlying data store as the original Headers so the returned Headers MUST always be used instead of the original object.
headers = headers.With("foo", "bar").With("baz", "qux")
type Inbound ¶
type Inbound interface { // Starts accepting new requests and dispatches them to the given Handler. // // The function MUST return immediately, although it SHOULD block until // the inbound is ready to start accepting new requests. // // Implementations can assume that this function is called at most once. Start(handler Handler, deps Deps) error // Stops the inbound. No new requests will be processed. // // This MAY block while the server drains ongoing requests. Stop() error }
Inbound is a transport that knows how to receive requests for procedure calls.
type Interceptor ¶
type Interceptor interface { Handle( ctx context.Context, opts Options, req *Request, resw ResponseWriter, h Handler, ) error }
Interceptor defines a transport-level middleware for Inbounds.
Interceptors MAY ¶
- change the context - change the request - call the ResponseWriter - modify the response body by wrapping the ResponseWriter - handle the returned error - call the given handler zero or more times
Interceptors MUST be thread-safe.
Interceptors are re-used across requests and MAY be called multiple times for the same request.
var NopInterceptor Interceptor = nopInterceptor{}
NopInterceptor is a interceptor that does not do anything special. It simply calls the underlying Handler.
type InterceptorFunc ¶
InterceptorFunc adapts a function into an Interceptor.
func (InterceptorFunc) Handle ¶
func (f InterceptorFunc) Handle(ctx context.Context, opts Options, req *Request, resw ResponseWriter, h Handler) error
Handle for InterceptorFunc
type MapRegistry ¶
type MapRegistry struct {
// contains filtered or unexported fields
}
MapRegistry is a Registry that maintains a map of the registered procedures.
func NewMapRegistry ¶
func NewMapRegistry(defaultService string) MapRegistry
NewMapRegistry builds a new MapRegistry that uses the given name as the default service name.
func (MapRegistry) GetHandler ¶
func (m MapRegistry) GetHandler(service, procedure string) (Handler, error)
GetHandler retrieves the Handler for the given Procedure or returns an error.
func (MapRegistry) Register ¶
func (m MapRegistry) Register(service, procedure string, handler Handler)
Register registers the procedure with the MapRegistry.
type Options ¶
type Options struct {
// contains filtered or unexported fields
}
Options act as an extension point for transports to configure behavior of other parts of the system.
A component that that wishes to be customizable based on transport.Options should declare a private type and key values off that.
package foo type bar struct{} func OptionFoo(v string) (o transport.Options) { return o.With(bar{}, v) }
A transport that wishes to change behavior simply needs to provide an Options object, merging OptionFoo into it.
func (myOutbound) Options() (opts transport.Options) { return opts.Merge(foo.OptionFoo("hello"), bar.OptionBar(false)) }
Now the implementation of foo can use Options.Get to act differently based on the outbound's options.
func (Options) Merge ¶
Merge returns a copy of an Options object with items from all the given Options merged into it.
Values in the rightmost Options object take precedence in case of conflicts.
type Outbound ¶
type Outbound interface { // Sets up the outbound to start making calls. // // This MUST block until the outbound is ready to start sending requests. // // Implementations can assume that this function is called at most once. Start(deps Deps) error // Stops the outbound, cleaning up any resources held by the Outbound. Stop() error // Options for all requests made through this Outbound. Options() Options // Call sends the given request through this transport and returns its // response. // // This MUST NOT be called before Start() has been called successfully. This // MAY panic if called without calling Start(). This MUST be safe to call // concurrently. Call(ctx context.Context, request *Request) (*Response, error) }
Outbound is a transport that knows how to send requests for procedure calls.
func ApplyFilter ¶
ApplyFilter applies the given Filter to the given Outbound.
type Registry ¶
type Registry interface { // Registers a procedure with this registry under the given service name. // // service may be empty to indicate that the default service name should // be used. Register(service, procedure string, handler Handler) // Gets the handler for the given service, procedure tuple. An // UnrecognizedProcedureError will be returned if the handler does not // exist. // // service may be empty to indicate that the default service name should // be used. GetHandler(service, procedure string) (Handler, error) }
Registry maintains and provides access to a collection of procedures and their handlers.
type Request ¶
type Request struct { // Name of the service making the request. Caller string // Name of the service to which the request is being made. // The service refers to the canonical traffic group for the service. Service string // Name of the encoding used for the request body. Encoding Encoding // Name of the procedure being called. Procedure string // Headers for the request. Headers Headers // ShardKey is an opaque string that is meaningful to the destined service // for how to relay a request within a cluster to the shard that owns the // key. ShardKey string // RoutingKey refers to a traffic group for the destined service, and when // present may override the service name for purposes of routing. RoutingKey string // RoutingDelegate refers to the traffic group for a service that proxies // for the destined service for routing purposes. The routing delegate may // override the routing key and service. RoutingDelegate string // Request payload. Body io.Reader }
Request is the low level request representation.
type Response ¶
type Response struct { Headers Headers Body io.ReadCloser }
Response is the low level response representation.
type ResponseWriter ¶
type ResponseWriter interface { io.Writer // AddHeaders adds the given headers to the response. If called, this MUST // be called before any invocation of Write(). // // This MUST NOT panic if Headers is nil. AddHeaders(Headers) // SetApplicationError specifies that this response contains an // application error. If called, this MUST be called before any invocation // of Write(). SetApplicationError() }
ResponseWriter allows Handlers to write responses in a streaming fashion.