123456789101112131415161718192021222324252627282930313233343536373839404142 |
- // based on https://github.com/golang/go/blob/master/src/net/url/url.go
- // Copyright 2009 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package core
- func shouldEscape(c byte) bool {
- if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '_' || c == '-' || c == '~' || c == '.' {
- return false
- }
- return true
- }
- func escape(s string) string {
- hexCount := 0
- for i := 0; i < len(s); i++ {
- c := s[i]
- if shouldEscape(c) {
- hexCount++
- }
- }
- if hexCount == 0 {
- return s
- }
- t := make([]byte, len(s)+2*hexCount)
- j := 0
- for i := 0; i < len(s); i++ {
- switch c := s[i]; {
- case shouldEscape(c):
- t[j] = '%'
- t[j+1] = "0123456789ABCDEF"[c>>4]
- t[j+2] = "0123456789ABCDEF"[c&15]
- j += 3
- default:
- t[j] = s[i]
- j++
- }
- }
- return string(t)
- }
|