diff options
| author | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2025-06-26 17:31:07 -0700 |
|---|---|---|
| committer | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2025-06-26 17:31:07 -0700 |
| commit | 83430dba76359f3b84a50051dd3fffcbbef90c18 (patch) | |
| tree | 95c96a38804cf646b7a782570b5484d95af0c5de /hotline/file_transfer.go | |
| parent | 55b8e77c409761639e95168c77dc22c13e858b6b (diff) | |
Refactor FormattedPath to use scanner interface and add comprehensive tests
- Replace manual byte slicing with bufio.Scanner for safer parsing
- Add pathSegmentScanner implementing bufio.SplitFunc pattern
- Add comprehensive table tests covering edge cases and special characters
- Improve code safety with proper bounds checking
- Follow established codebase patterns for binary data parsing
Diffstat (limited to 'hotline/file_transfer.go')
| -rw-r--r-- | hotline/file_transfer.go | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/hotline/file_transfer.go b/hotline/file_transfer.go index 0ddac0b..701259a 100644 --- a/hotline/file_transfer.go +++ b/hotline/file_transfer.go @@ -2,6 +2,7 @@ package hotline import ( "bufio" + "bytes" "crypto/rand" "encoding/binary" "errors" @@ -188,17 +189,41 @@ type folderUpload struct { // return n + 6, nil //} +// pathSegmentScanner implements bufio.SplitFunc for parsing path segments +func pathSegmentScanner(data []byte, _ bool) (advance int, token []byte, err error) { + if len(data) < 3 { + return 0, nil, nil + } + + segLen := int(data[2]) + totalLen := 3 + segLen + + if len(data) < totalLen { + return 0, nil, nil + } + + return totalLen, data[0:totalLen], nil +} + func (fu *folderUpload) FormattedPath() string { pathItemLen := binary.BigEndian.Uint16(fu.PathItemCount[:]) + if pathItemLen == 0 { + return "" + } + var pathSegments []string - pathData := fu.FileNamePath + scanner := bufio.NewScanner(bytes.NewReader(fu.FileNamePath)) + scanner.Split(pathSegmentScanner) - // TODO: implement scanner interface instead? - for i := uint16(0); i < pathItemLen; i++ { - segLen := pathData[2] - pathSegments = append(pathSegments, string(pathData[3:3+segLen])) - pathData = pathData[3+segLen:] + for scanner.Scan() && len(pathSegments) < int(pathItemLen) { + segmentData := scanner.Bytes() + if len(segmentData) >= 3 { + segLen := int(segmentData[2]) + if len(segmentData) >= 3+segLen { + pathSegments = append(pathSegments, string(segmentData[3:3+segLen])) + } + } } return path.Join(pathSegments...) |