util.go raw

   1  /*
   2   *
   3   * Copyright 2020 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 credentials
  20  
  21  import (
  22  	"crypto/tls"
  23  )
  24  
  25  const alpnProtoStrH2 = "h2"
  26  
  27  // AppendH2ToNextProtos appends h2 to next protos.
  28  func AppendH2ToNextProtos(ps []string) []string {
  29  	for _, p := range ps {
  30  		if p == alpnProtoStrH2 {
  31  			return ps
  32  		}
  33  	}
  34  	ret := make([]string, 0, len(ps)+1)
  35  	ret = append(ret, ps...)
  36  	return append(ret, alpnProtoStrH2)
  37  }
  38  
  39  // CloneTLSConfig returns a shallow clone of the exported
  40  // fields of cfg, ignoring the unexported sync.Once, which
  41  // contains a mutex and must not be copied.
  42  //
  43  // If cfg is nil, a new zero tls.Config is returned.
  44  //
  45  // TODO: inline this function if possible.
  46  func CloneTLSConfig(cfg *tls.Config) *tls.Config {
  47  	if cfg == nil {
  48  		return &tls.Config{}
  49  	}
  50  
  51  	return cfg.Clone()
  52  }
  53