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 }