refactor(utils): add unified b2s/s2b conversion functions

Extract duplicate b2s/s2b functions from proxy/utils.go into
internal/utils/bytes.go. These are zero-allocation unsafe conversions
for byte slice <-> string conversion.

- Create utils.B2s() and utils.S2b() as unified implementations
- Update proxy/utils.go to call utils functions
- Add safety documentation about shared memory warning

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-05-08 18:06:25 +08:00
parent 3b2360162c
commit a28c7ebcf1
2 changed files with 27 additions and 9 deletions

View File

@ -2,27 +2,22 @@ package proxy
import ( import (
"bytes" "bytes"
"unsafe"
"rua.plus/lolly/internal/utils"
) )
// b2s converts byte slice to string without allocation. // b2s converts byte slice to string without allocation.
// WARNING: The returned string shares memory with the original slice. // WARNING: The returned string shares memory with the original slice.
// Do not modify the slice after calling this function. // Do not modify the slice after calling this function.
func b2s(b []byte) string { func b2s(b []byte) string {
if len(b) == 0 { return utils.B2s(b)
return ""
}
return unsafe.String(&b[0], len(b))
} }
// s2b converts string to byte slice without allocation. // s2b converts string to byte slice without allocation.
// WARNING: The returned slice shares memory with the original string. // WARNING: The returned slice shares memory with the original string.
// Do not modify the slice contents. // Do not modify the slice contents.
func s2b(s string) []byte { func s2b(s string) []byte {
if s == "" { return utils.S2b(s)
return nil
}
return unsafe.Slice(unsafe.StringData(s), len(s))
} }
// isInWhitelist checks if a header key is in the whitelist. // isInWhitelist checks if a header key is in the whitelist.

23
internal/utils/bytes.go Normal file
View File

@ -0,0 +1,23 @@
package utils
import "unsafe"
// B2s converts byte slice to string without allocation.
// WARNING: The returned string shares memory with the original slice.
// Do not modify the slice after calling this function.
func B2s(b []byte) string {
if len(b) == 0 {
return ""
}
return unsafe.String(&b[0], len(b))
}
// S2b converts string to byte slice without allocation.
// WARNING: The returned slice shares memory with the original string.
// Do not modify the slice contents.
func S2b(s string) []byte {
if s == "" {
return nil
}
return unsafe.Slice(unsafe.StringData(s), len(s))
}