github.com/alejandroesc/spdy@v0.0.0-20200317064415-01a02f0eb389/versions.go (about)

     1  // Copyright 2014 Jamie Hall. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package spdy
     6  
     7  import (
     8  	"errors"
     9  	"sort"
    10  )
    11  
    12  // SPDY version of this implementation.
    13  const DEFAULT_SPDY_VERSION = 3.1
    14  
    15  // Version factors.
    16  var supportedVersions = map[float64]struct{}{
    17  	2:   struct{}{},
    18  	3:   struct{}{},
    19  	3.1: struct{}{},
    20  }
    21  
    22  const minVersion = 2
    23  const maxVersion = 3.1
    24  
    25  // SupportedVersions will return a slice of supported SPDY versions.
    26  // The returned versions are sorted into order of most recent first.
    27  func SupportedVersions() []float64 {
    28  	s := make([]float64, 0, len(supportedVersions))
    29  	for v, _ := range supportedVersions {
    30  		s = append(s, v)
    31  	}
    32  	sort.Sort(sort.Reverse(sort.Float64Slice(s)))
    33  	return s
    34  }
    35  
    36  var npnStrings = map[float64]string{
    37  	2:   "spdy/2",
    38  	3:   "spdy/3",
    39  	3.1: "spdy/3.1",
    40  }
    41  
    42  // npn returns the NPN version strings for the SPDY versions
    43  // currently enabled, plus HTTP/1.1.
    44  func npn() []string {
    45  	v := SupportedVersions()
    46  	s := make([]string, 0, len(v)+1)
    47  	for _, v := range v {
    48  		if str := npnStrings[float64(v)]; str != "" {
    49  			s = append(s, str)
    50  		}
    51  	}
    52  	s = append(s, "http/1.1")
    53  	return s
    54  }
    55  
    56  // SupportedVersion determines if the provided SPDY version is
    57  // supported by this instance of the library. This can be modified
    58  // with EnableSpdyVersion and DisableSpdyVersion.
    59  func SupportedVersion(v float64) bool {
    60  	_, s := supportedVersions[v]
    61  	return s
    62  }
    63  
    64  // EnableSpdyVersion can re-enable support for versions of SPDY
    65  // that have been disabled by DisableSpdyVersion.
    66  func EnableSpdyVersion(v float64) error {
    67  	if v == 0 {
    68  		return errors.New("Error: version 0 is invalid.")
    69  	}
    70  	if v < minVersion {
    71  		return errors.New("Error: SPDY version too old.")
    72  	}
    73  	if v > maxVersion {
    74  		return errors.New("Error: SPDY version too new.")
    75  	}
    76  	supportedVersions[v] = struct{}{}
    77  	return nil
    78  }
    79  
    80  // DisableSpdyVersion can be used to disable support for the
    81  // given SPDY version. This process can be undone by using
    82  // EnableSpdyVersion.
    83  func DisableSpdyVersion(v float64) error {
    84  	if v == 0 {
    85  		return errors.New("Error: version 0 is invalid.")
    86  	}
    87  	if v < minVersion {
    88  		return errors.New("Error: SPDY version too old.")
    89  	}
    90  	if v > maxVersion {
    91  		return errors.New("Error: SPDY version too new.")
    92  	}
    93  	delete(supportedVersions, v)
    94  	return nil
    95  }