package livekit
import (
"fmt"
"strings"
"testing"
)
var ValidHeaderNames = []string{
"Q", "q", "Qrom", "qrom", "Qall-ID", "P-Asserted-Identity", "X-", "-X", "X123", "X_123", "X.123", "X!123", "X%123", "X*123", "X+123", "X`123", "X'123", "X~123", }
var InvalidHeaderNames = []string{
"", "From To", "From:To", "From,To", "From;To", "From<To", "From>To", "From@To", "From\"To", "From\\To", "From/To", "From[To", "From]To", "From{To", "From}To", "From(To", "From)To", "From?To", "From=To", "From#To", "From$To", "From&To", "From|To", "From^To", "From\000To", "From\nTo", "From\rTo", "From\tTo", }
var ValidHeaderValues = []string{
"", "u1@example.com", "<sip:u2@example.com>", "Alice <sip:u3@example.com>", "\"Alice Smith\" <sip:u4@example.com>", "SIP/2.0/UDP 192.168.1.1:5060", "1 INVITE", "255", "0", "application/sdp", "123", "3600", "call-123@example.com", "text/plain; charset=utf-8", "<sip:u5@[2001:db8::1]:5060>", "\"Alice & Bob\" <sip:u6@example.com>", "Header with\ttab", "Header with unicode café", "Header with unicode 世界", "Header with unicode émojis 🎉", strings.Repeat("a", 1024), }
var InvalidHeaderValues = []string{
"Header with\nnewline", "Header with\rreturn", "Header with\x00null", "Header with\x01control", "Header with\x1Funit separator", "Header with\x7Fdelete", strings.Repeat("a", 1025), }
func testCaseName(name string, maxLen int, index int) string {
if len(name) <= maxLen {
return fmt.Sprintf("%d/%s)", index+1, name)
}
truncated := name[:maxLen-10] return fmt.Sprintf("%d/%s...(%d)", index+1, truncated, len(name))
}
var ValidNameAddrHeaders = []string{
`"Alice Johnson" <sip:u1@example.com>`,
`"Alice \"Ace\" Johnson's device\\" <sip:u2@example.com>`,
`Alice Johnson <sip:u3@example.com>`,
`sip:u4@example.com`, `sips:u5@example.com`, `tel:+1-555-123-4567`, `<sip:u6@example.com>`, `<sips:u7@example.com>`, `<tel:+1-555-123-4567>`, `Alice <sip:u8@example.com>`, `"Alice Johnson" <sip:u9@example.com>`, `<sip:u10@example.com;transport=tcp>`, `<sip:u11@example.com;lr>`, `<sip:u12@example.com:5060>`, `<sip:u13@example.com;transport=tcp;lr>`, `Alice <sip:u14@example.com;transport=tcp>`, `"Alice \"Ace\"" <sip:u15@example.com>`, `<sip:u16@[2001:db8::1]:5060>`, `<sips:u17@192.0.2.4>;expires=60`, `Alice <sip:u18@example.com;transport=tcp>`, `"Alice & Bob" <sip:u19@example.com>`, }
var InvalidNameAddrHeaders = []string{
`"Alice "Ace" Johnson" <sip:u1@example.com>`, `"\Alice" <sip:u2@example.com>`, `"Alice" Johnson <sip:u3@example.com>`, `Alice "Ace" Johnson <sip:u4@example.com>`, `"Alice Johnson <sip:u5@example.com>`, `Alice Johnson" <sip:u6@example.com>`, `<sip:u7@example.com`, `sip:u8@example.com>`, `<sip:u9@example.com> <sip:u10@example.com>`, `Alice <sip:u11@example.com> <sip:u12@example.com>`, `Alice sip:u13@example.com`, `Alice sips:u14@example.com`, `Alice & Bob <sip:u15@example.com>`, `sip:u16@example.com;transport=tcp`, `sip:u17@example.com,transport=tcp`, `sip:u18@example.com?transport=tcp`, `<sip:u21@example.com;transport tcp>`, `<sip:u24@example.com;transport=tcp lr>`, }
func TestValidateHeaderName_ValidHeaders(t *testing.T) {
for i, headerName := range ValidHeaderNames {
t.Run(testCaseName(headerName, 32, i), func(t *testing.T) {
err := ValidateHeaderName(headerName, true)
if err != nil {
t.Errorf("ValidateHeaderName(%q) = %v, want nil", headerName, err)
}
})
}
}
func TestValidateHeaderName_InvalidHeaders(t *testing.T) {
for i, headerName := range InvalidHeaderNames {
t.Run(testCaseName(headerName, 32, i), func(t *testing.T) {
err := ValidateHeaderName(headerName, true)
if err == nil {
t.Errorf("ValidateHeaderName(%q) = nil, want error", headerName)
}
})
}
}
func TestValidateHeaderValue_ValidValues(t *testing.T) {
for i, headerValue := range ValidHeaderValues {
t.Run(testCaseName(headerValue, 32, i), func(t *testing.T) {
err := ValidateHeaderValue("Test-Header", headerValue)
if err != nil {
t.Errorf("ValidateHeaderValue(%q) = %v, want nil", headerValue, err)
}
})
}
}
func TestValidateHeaderValue_InvalidValues(t *testing.T) {
for i, headerValue := range InvalidHeaderValues {
t.Run(testCaseName(headerValue, 32, i), func(t *testing.T) {
err := ValidateHeaderValue("Test-Header", headerValue)
if err == nil {
t.Errorf("ValidateHeaderValue(%q) = nil, want error", headerValue)
}
})
}
}
func TestValidateNameAddr_ValidHeaders(t *testing.T) {
for i, nameAddr := range ValidNameAddrHeaders {
t.Run(testCaseName(nameAddr, 32, i), func(t *testing.T) {
err := validateNameAddrHeader(nameAddr)
if err != nil {
t.Errorf("validateNameAddrHeader(%q) = %v, want nil", nameAddr, err)
}
})
}
}
func TestValidateNameAddr_InvalidHeaders(t *testing.T) {
for i, nameAddr := range InvalidNameAddrHeaders {
t.Run(testCaseName(nameAddr, 32, i), func(t *testing.T) {
err := validateNameAddrHeader(nameAddr)
if err == nil {
t.Errorf("validateNameAddrHeader(%q) = nil, want error", nameAddr)
}
})
}
}
func TestFrobiddenSipHeaderNames(t *testing.T) {
i := 0
for name := range FrobiddenSipHeaderNames {
i++
t.Run(testCaseName(name, 32, i), func(t *testing.T) {
err := ValidateHeaderName(name, true)
if err == nil {
t.Errorf("ValidateHeaderName(%q) = nil, want error", name)
}
})
}
}