/* * * Copyright 2020 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // Package unix implements a resolver for unix targets. package unix import ( "fmt" "google.golang.org/grpc/internal/transport/networktype" "google.golang.org/grpc/resolver" ) const unixScheme = "unix" const unixAbstractScheme = "unix-abstract" type builder struct { scheme string } func (b *builder) Build(target resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (resolver.Resolver, error) { if target.Authority != "" { return nil, fmt.Errorf("invalid (non-empty) authority: %v", target.Authority) } // gRPC was parsing the dial target manually before PR #4817, and we // switched to using url.Parse() in that PR. To avoid breaking existing // resolver implementations we ended up stripping the leading "/" from the // endpoint. This obviously does not work for the "unix" scheme. Hence we // end up using the parsed URL instead. endpoint := target.URL.Path if endpoint == "" { endpoint = target.URL.Opaque } addr := resolver.Address{Addr: endpoint} if b.scheme == unixAbstractScheme { // prepend "\x00" to address for unix-abstract addr.Addr = "\x00" + addr.Addr } cc.UpdateState(resolver.State{Addresses: []resolver.Address{networktype.Set(addr, "unix")}}) return &nopResolver{}, nil } func (b *builder) Scheme() string { return b.scheme } type nopResolver struct { } func (*nopResolver) ResolveNow(resolver.ResolveNowOptions) {} func (*nopResolver) Close() {} func init() { resolver.Register(&builder{scheme: unixScheme}) resolver.Register(&builder{scheme: unixAbstractScheme}) }