/*
 *
 * 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 ( ) const unixScheme = "unix" const unixAbstractScheme = "unix-abstract" type builder struct { scheme string } func ( *builder) ( resolver.Target, resolver.ClientConn, resolver.BuildOptions) (resolver.Resolver, error) { if .URL.Host != "" { return nil, fmt.Errorf("invalid (non-empty) authority: %v", .URL.Host) } // 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. := .URL.Path if == "" { = .URL.Opaque } := resolver.Address{Addr: } if .scheme == unixAbstractScheme { // We can not prepend \0 as c++ gRPC does, as in Golang '@' is used to signify we do // not want trailing \0 in address. .Addr = "@" + .Addr } .UpdateState(resolver.State{Addresses: []resolver.Address{networktype.Set(, "unix")}}) return &nopResolver{}, nil } func ( *builder) () string { return .scheme } type nopResolver struct { } func (*nopResolver) (resolver.ResolveNowOptions) {} func (*nopResolver) () {} func () { resolver.Register(&builder{scheme: unixScheme}) resolver.Register(&builder{scheme: unixAbstractScheme}) }