4
0

percent.go 731 B

12345678910111213141516171819202122232425262728293031323334
  1. package codec
  2. // decodePercent decodes percent encoded strings
  3. func decodePercent(encodedValue string) string {
  4. encLen := len(encodedValue)
  5. decodedValue := make([]byte, encLen)
  6. decIndex := 0
  7. encIndex := 0
  8. for encIndex < encLen {
  9. if encodedValue[encIndex] == '%' && encIndex+2 < encLen {
  10. n1 := hexMap[encodedValue[encIndex+1]]
  11. n2 := hexMap[encodedValue[encIndex+2]]
  12. // Make sure they're hex characters
  13. if n1|n2 != '\xff' {
  14. b := n1<<4 | n2
  15. if !printableASCII[b] {
  16. return ""
  17. }
  18. decodedValue[decIndex] = b
  19. encIndex += 3
  20. decIndex += 1
  21. continue
  22. }
  23. }
  24. decodedValue[decIndex] = encodedValue[encIndex]
  25. encIndex += 1
  26. decIndex += 1
  27. }
  28. return string(decodedValue[:decIndex])
  29. }