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 }