compression_method.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. package protocol
  4. // CompressionMethodID is the ID for a CompressionMethod
  5. type CompressionMethodID byte
  6. const (
  7. compressionMethodNull CompressionMethodID = 0
  8. )
  9. // CompressionMethod represents a TLS Compression Method
  10. type CompressionMethod struct {
  11. ID CompressionMethodID
  12. }
  13. // CompressionMethods returns all supported CompressionMethods
  14. func CompressionMethods() map[CompressionMethodID]*CompressionMethod {
  15. return map[CompressionMethodID]*CompressionMethod{
  16. compressionMethodNull: {ID: compressionMethodNull},
  17. }
  18. }
  19. // DecodeCompressionMethods the given compression methods
  20. func DecodeCompressionMethods(buf []byte) ([]*CompressionMethod, error) {
  21. if len(buf) < 1 {
  22. return nil, errBufferTooSmall
  23. }
  24. compressionMethodsCount := int(buf[0])
  25. c := []*CompressionMethod{}
  26. for i := 0; i < compressionMethodsCount; i++ {
  27. if len(buf) <= i+1 {
  28. return nil, errBufferTooSmall
  29. }
  30. id := CompressionMethodID(buf[i+1])
  31. if compressionMethod, ok := CompressionMethods()[id]; ok {
  32. c = append(c, compressionMethod)
  33. }
  34. }
  35. return c, nil
  36. }
  37. // EncodeCompressionMethods the given compression methods
  38. func EncodeCompressionMethods(c []*CompressionMethod) []byte {
  39. out := []byte{byte(len(c))}
  40. for i := len(c); i > 0; i-- {
  41. out = append(out, byte(c[i-1].ID))
  42. }
  43. return out
  44. }