Single Fetcher.Fetch on the Guard that holds DenyPrefixes. skipTlsVerification is ignored. No 502. keys add writes the secret only to --out. Release binary has no -test-allow-prefix.
80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package collapse
|
|
|
|
import (
|
|
"unsafe"
|
|
)
|
|
|
|
func byteSliceToString(b []byte) string {
|
|
/* #nosec G103 */
|
|
return *(*string)(unsafe.Pointer(&b))
|
|
}
|
|
|
|
func replaceAnyWhitespaceWithSpace(source string) string {
|
|
if source == "" {
|
|
return source
|
|
}
|
|
|
|
// Some performance optimizations:
|
|
// - If no replacement was done, we return the original slice and dont allocate.
|
|
// - We batch appends
|
|
var ret []byte
|
|
makeIfNeeded := func() {
|
|
if ret == nil {
|
|
ret = make([]byte, 0, len(source))
|
|
}
|
|
}
|
|
|
|
startNormal := 0
|
|
startMatch := -1
|
|
for i := 0; i < len(source); i++ {
|
|
isWhitespace := source[i] == ' ' || source[i] == '\r' || source[i] == '\n' || source[i] == '\t'
|
|
|
|
if startMatch == -1 && isWhitespace {
|
|
// Start of newlines
|
|
startMatch = i
|
|
continue
|
|
} else if startMatch != -1 && isWhitespace {
|
|
// Middle of newlines
|
|
continue
|
|
} else if startMatch != -1 {
|
|
// Character after the last newline character
|
|
|
|
count := i - startMatch
|
|
if count == 1 && source[startMatch] == ' ' {
|
|
// There was only one `isWhitespace` match & that is a space.
|
|
// So the replacement would be exactly the same...
|
|
} else {
|
|
makeIfNeeded()
|
|
ret = append(ret, source[startNormal:startMatch]...)
|
|
ret = append(ret, byte(' '))
|
|
startNormal = i
|
|
}
|
|
|
|
startMatch = -1
|
|
}
|
|
}
|
|
|
|
if startMatch == -1 && startNormal == 0 {
|
|
// a) no changes need to be done
|
|
} else if startMatch == -1 {
|
|
// b) Only the normal characters until the end still need to be added
|
|
makeIfNeeded()
|
|
ret = append(ret, source[startNormal:]...)
|
|
} else if ret == nil && len(source)-startMatch == 1 && source[startMatch] == ' ' {
|
|
// c) There is a match, but it is exactly the same as the replacement
|
|
// If there is no new slice, we can skip the replacement.
|
|
} else {
|
|
// d) The match still needs to be replaced (and possible the previous normal characters be added)
|
|
makeIfNeeded()
|
|
ret = append(ret, source[startNormal:startMatch]...)
|
|
ret = append(ret, byte(' '))
|
|
}
|
|
|
|
if ret == nil {
|
|
// Huray, we did not do any allocations with make()
|
|
// and instead just return the original slice.
|
|
return source
|
|
}
|
|
return byteSliceToString(ret)
|
|
}
|