1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package v4
- import (
- "net/url"
- "strings"
- )
- const doubleSpace = " "
- // StripExcessSpaces will rewrite the passed in slice's string values to not
- // contain multiple side-by-side spaces.
- func StripExcessSpaces(str string) string {
- var j, k, l, m, spaces int
- // Trim trailing spaces
- for j = len(str) - 1; j >= 0 && str[j] == ' '; j-- {
- }
- // Trim leading spaces
- for k = 0; k < j && str[k] == ' '; k++ {
- }
- str = str[k : j+1]
- // Strip multiple spaces.
- j = strings.Index(str, doubleSpace)
- if j < 0 {
- return str
- }
- buf := []byte(str)
- for k, m, l = j, j, len(buf); k < l; k++ {
- if buf[k] == ' ' {
- if spaces == 0 {
- // First space.
- buf[m] = buf[k]
- m++
- }
- spaces++
- } else {
- // End of multiple spaces.
- spaces = 0
- buf[m] = buf[k]
- m++
- }
- }
- return string(buf[:m])
- }
- // GetURIPath returns the escaped URI component from the provided URL.
- func GetURIPath(u *url.URL) string {
- var uriPath string
- if len(u.Opaque) > 0 {
- const schemeSep, pathSep, queryStart = "//", "/", "?"
- opaque := u.Opaque
- // Cut off the query string if present.
- if idx := strings.Index(opaque, queryStart); idx >= 0 {
- opaque = opaque[:idx]
- }
- // Cutout the scheme separator if present.
- if strings.Index(opaque, schemeSep) == 0 {
- opaque = opaque[len(schemeSep):]
- }
- // capture URI path starting with first path separator.
- if idx := strings.Index(opaque, pathSep); idx >= 0 {
- uriPath = opaque[idx:]
- }
- } else {
- uriPath = u.EscapedPath()
- }
- if len(uriPath) == 0 {
- uriPath = "/"
- }
- return uriPath
- }
|