passthrough.go raw

   1  /*
   2   *
   3   * Copyright 2017 gRPC authors.
   4   *
   5   * Licensed under the Apache License, Version 2.0 (the "License");
   6   * you may not use this file except in compliance with the License.
   7   * You may obtain a copy of the License at
   8   *
   9   *     http://www.apache.org/licenses/LICENSE-2.0
  10   *
  11   * Unless required by applicable law or agreed to in writing, software
  12   * distributed under the License is distributed on an "AS IS" BASIS,
  13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14   * See the License for the specific language governing permissions and
  15   * limitations under the License.
  16   *
  17   */
  18  
  19  // Package passthrough implements a pass-through resolver. It sends the target
  20  // name without scheme back to gRPC as resolved address.
  21  package passthrough
  22  
  23  import (
  24  	"errors"
  25  
  26  	"google.golang.org/grpc/resolver"
  27  )
  28  
  29  const scheme = "passthrough"
  30  
  31  type passthroughBuilder struct{}
  32  
  33  func (*passthroughBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
  34  	if target.Endpoint() == "" && opts.Dialer == nil {
  35  		return nil, errors.New("passthrough: received empty target in Build()")
  36  	}
  37  	r := &passthroughResolver{
  38  		target: target,
  39  		cc:     cc,
  40  	}
  41  	r.start()
  42  	return r, nil
  43  }
  44  
  45  func (*passthroughBuilder) Scheme() string {
  46  	return scheme
  47  }
  48  
  49  type passthroughResolver struct {
  50  	target resolver.Target
  51  	cc     resolver.ClientConn
  52  }
  53  
  54  func (r *passthroughResolver) start() {
  55  	r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint()}}})
  56  }
  57  
  58  func (*passthroughResolver) ResolveNow(resolver.ResolveNowOptions) {}
  59  
  60  func (*passthroughResolver) Close() {}
  61  
  62  func init() {
  63  	resolver.Register(&passthroughBuilder{})
  64  }
  65