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 }