You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

49 lines
947 B

package sip
// escapeUser escapes a URI user, which can't use quoting.
func escapeUser(s []byte) []byte {
return escape(s, userc)
}
// escapePass escapes a URI password, which can't use quoting.
func escapePass(s []byte) []byte {
return escape(s, passc)
}
// escapeParam escapes a URI parameter, which can't use quoting.
func escapeParam(s []byte) []byte {
return escape(s, paramc)
}
// escapeHeader escapes a URI header, which can't use quoting.
func escapeHeader(s []byte) []byte {
return escape(s, headerc)
}
// escape provides arbitrary URI escaping.
func escape(s []byte, p func(byte) bool) []byte {
hc := 0
for i := 0; i < len(s); i++ {
if !p(s[i]) {
hc++
}
}
if hc == 0 {
return s
}
res := make([]byte, len(s)+2*hc)
j := 0
for i := 0; i < len(s); i++ {
c := s[i]
if p(c) {
res[j] = c
j++
} else {
res[j] = '%'
res[j+1] = hexChars[c>>4]
res[j+2] = hexChars[c%16]
j += 3
}
}
return res
}