forked from quic-go/quic-go
fix client handshake failure when the server supports unknown versions
This commit is contained in:
@@ -18,10 +18,9 @@ const (
|
||||
Version37 VersionNumber = gquicVersion0 + 3*0x100 + 0x7 + iota
|
||||
Version38
|
||||
Version39
|
||||
VersionTLS VersionNumber = 101
|
||||
VersionWhatever VersionNumber = 0 // for when the version doesn't matter
|
||||
VersionUnsupported VersionNumber = -1
|
||||
VersionUnknown VersionNumber = -2
|
||||
VersionTLS VersionNumber = 101
|
||||
VersionWhatever VersionNumber = 0 // for when the version doesn't matter
|
||||
VersionUnknown VersionNumber = -1
|
||||
)
|
||||
|
||||
// SupportedVersions lists the versions that the server supports
|
||||
@@ -41,8 +40,6 @@ func (vn VersionNumber) String() string {
|
||||
switch vn {
|
||||
case VersionWhatever:
|
||||
return "whatever"
|
||||
case VersionUnsupported:
|
||||
return "unsupported"
|
||||
case VersionUnknown:
|
||||
return "unknown"
|
||||
case VersionTLS:
|
||||
@@ -79,15 +76,15 @@ func IsSupportedVersion(supported []VersionNumber, v VersionNumber) bool {
|
||||
|
||||
// ChooseSupportedVersion finds the best version in the overlap of ours and theirs
|
||||
// ours is a slice of versions that we support, sorted by our preference (descending)
|
||||
// theirs is a slice of versions offered by the peer. The order does not matter
|
||||
// if no suitable version is found, it returns VersionUnsupported
|
||||
func ChooseSupportedVersion(ours, theirs []VersionNumber) VersionNumber {
|
||||
// theirs is a slice of versions offered by the peer. The order does not matter.
|
||||
// The bool returned indicates if a matching version was found.
|
||||
func ChooseSupportedVersion(ours, theirs []VersionNumber) (VersionNumber, bool) {
|
||||
for _, ourVer := range ours {
|
||||
for _, theirVer := range theirs {
|
||||
if ourVer == theirVer {
|
||||
return ourVer
|
||||
return ourVer, true
|
||||
}
|
||||
}
|
||||
}
|
||||
return VersionUnsupported
|
||||
return 0, false
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ var _ = Describe("Version", func() {
|
||||
Expect(Version39.String()).To(Equal("gQUIC 39"))
|
||||
Expect(VersionTLS.String()).To(ContainSubstring("TLS"))
|
||||
Expect(VersionWhatever.String()).To(Equal("whatever"))
|
||||
Expect(VersionUnsupported.String()).To(Equal("unsupported"))
|
||||
Expect(VersionUnknown.String()).To(Equal("unknown"))
|
||||
// check with unsupported version numbers from the wiki
|
||||
Expect(VersionNumber(0x51303039).String()).To(Equal("gQUIC 9"))
|
||||
@@ -63,22 +62,31 @@ var _ = Describe("Version", func() {
|
||||
It("finds the supported version", func() {
|
||||
supportedVersions := []VersionNumber{1, 2, 3}
|
||||
other := []VersionNumber{6, 5, 4, 3}
|
||||
Expect(ChooseSupportedVersion(supportedVersions, other)).To(Equal(VersionNumber(3)))
|
||||
ver, ok := ChooseSupportedVersion(supportedVersions, other)
|
||||
Expect(ok).To(BeTrue())
|
||||
Expect(ver).To(Equal(VersionNumber(3)))
|
||||
})
|
||||
|
||||
It("picks the preferred version", func() {
|
||||
supportedVersions := []VersionNumber{2, 1, 3}
|
||||
other := []VersionNumber{3, 6, 1, 8, 2, 10}
|
||||
Expect(ChooseSupportedVersion(supportedVersions, other)).To(Equal(VersionNumber(2)))
|
||||
ver, ok := ChooseSupportedVersion(supportedVersions, other)
|
||||
Expect(ok).To(BeTrue())
|
||||
Expect(ver).To(Equal(VersionNumber(2)))
|
||||
})
|
||||
|
||||
It("says when no matching version was found", func() {
|
||||
_, ok := ChooseSupportedVersion([]VersionNumber{1}, []VersionNumber{2})
|
||||
Expect(ok).To(BeFalse())
|
||||
})
|
||||
|
||||
It("handles empty inputs", func() {
|
||||
supportedVersions := []VersionNumber{102, 101}
|
||||
Expect(ChooseSupportedVersion(supportedVersions, nil)).To(Equal(VersionUnsupported))
|
||||
Expect(ChooseSupportedVersion(supportedVersions, []VersionNumber{})).To(Equal(VersionUnsupported))
|
||||
supportedVersions = []VersionNumber{}
|
||||
Expect(ChooseSupportedVersion(supportedVersions, []VersionNumber{1, 2})).To(Equal(VersionUnsupported))
|
||||
Expect(ChooseSupportedVersion(supportedVersions, []VersionNumber{})).To(Equal(VersionUnsupported))
|
||||
_, ok := ChooseSupportedVersion([]VersionNumber{102, 101}, []VersionNumber{})
|
||||
Expect(ok).To(BeFalse())
|
||||
_, ok = ChooseSupportedVersion([]VersionNumber{}, []VersionNumber{1, 2})
|
||||
Expect(ok).To(BeFalse())
|
||||
_, ok = ChooseSupportedVersion([]VersionNumber{}, []VersionNumber{})
|
||||
Expect(ok).To(BeFalse())
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user