From 68ff309417110e7b783ecee6162e775ed890db0d Mon Sep 17 00:00:00 2001 From: Matt Baer Date: Wed, 4 Feb 2015 00:13:06 -0500 Subject: [PATCH] Correctly handle UTF-8 chars Avoids unnecessary encoding/decoding and directly copies inputted bytes. --- write-telnet.go | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/write-telnet.go b/write-telnet.go index 0bdcab7..acfe348 100644 --- a/write-telnet.go +++ b/write-telnet.go @@ -9,9 +9,7 @@ import ( "io" "os" "os/exec" - "strings" "flag" - "unicode/utf8" ) var ( @@ -184,25 +182,21 @@ func readInput(c net.Conn) { func savePost(post []byte) (string, error) { filename := generateFileName() f, err := os.Create(outDir + "/" + filename) + if err != nil { + return "", err + } defer f.Close() - if err != nil { - fmt.Println(err) - } - - var decodedPost bytes.Buffer - - // Decode UTF-8 - for len(post) > 0 { - r, size := utf8.DecodeRune(post) - decodedPost.WriteRune(r) - - post = post[size:] + out := post[:0] + for _, b := range post { + if b < 32 && b != 10 && b != 13 { + continue + } + out = append(out, b) } + _, err = io.Copy(f, bytes.NewReader(out)) - _, err = io.WriteString(f, stripCtlAndExtFromUTF8(string(decodedPost.Bytes()))) - return filename, err } @@ -216,12 +210,3 @@ func generateFileName() string { } return string(bytes) } - -func stripCtlAndExtFromUTF8(str string) string { - return strings.Map(func(r rune) rune { - if r == 10 || r == 13 || (r >= 32 && r < 65533) { - return r - } - return -1 - }, str) -}