ascii to str

This commit is contained in:
llaoj 2022-11-14 12:15:16 +08:00
parent 70a264ed00
commit 8a7fa9ecb9
2 changed files with 63 additions and 16 deletions

View File

@ -1,7 +1,35 @@
package utils
func FormatWritesLog(line *[]byte) (log string) {
ascii := map[byte]string{
import "fmt"
func FormatWritesLog(codes []byte, line *string) {
n := len(codes)
str := ""
exist := false
if n == 3 {
if str, exist = ASCIIGroupToStr(fmt.Sprintf("%X", codes)); exist {
*line += str
codes = nil
}
}
// sh line prefix
if n >= 6 {
if str, exist = ASCIIGroupToStr(fmt.Sprintf("%X", []byte{codes[0], codes[1], codes[n-1]})); exist {
*line += str
codes = nil
}
}
if codes != nil {
str = ASCIIToStr(codes)
*line += str
}
return
}
func ASCIIToStr(codes []byte) string {
control := map[byte]string{
0: "NUL",
1: "SOH",
2: "STX",
@ -36,13 +64,32 @@ func FormatWritesLog(line *[]byte) (log string) {
31: "US",
127: "DEL",
}
for _, word := range *line {
if value, ok := ascii[word]; ok {
log += value
continue
}
log += string(word)
str := ""
for _, code := range codes {
if value, ok := control[code]; ok {
str += value
} else {
str += string(code)
}
}
return
return str
}
func ASCIIGroupToStr(sum string) (string, bool) {
group := map[string]string{
"1B5B41": "UP",
"1B5B42": "DOWN",
"1B5B43": "RIGHT",
"1B5B44": "LEFT",
// sh line prefix: codes[0]codes[1]codes[5]
// eg. "ESC[ 1;5 R"
"1B5B52": "",
}
if value, ok := group[sum]; ok {
return value, true
}
return "", false
}

View File

@ -91,14 +91,14 @@ func (wt *WebTTY) Run(ctx context.Context) error {
go func() {
errs <- func() error {
buffer := make([]byte, wt.bufferSize)
lineBuffer := make([]byte, 1)
line := ""
for {
n, err := wt.masterConn.Read(buffer)
if err != nil {
return ErrMasterClosed
}
err = wt.handleMasterReadEvent(buffer[:n], &lineBuffer)
err = wt.handleMasterReadEvent(buffer[:n], &line)
if err != nil {
return err
}
@ -167,7 +167,7 @@ func (wt *WebTTY) masterWrite(data []byte) error {
return nil
}
func (wt *WebTTY) handleMasterReadEvent(data []byte, line *[]byte) error {
func (wt *WebTTY) handleMasterReadEvent(data []byte, line *string) error {
if len(data) == 0 {
return errors.New("unexpected zero length read from master")
}
@ -188,15 +188,15 @@ func (wt *WebTTY) handleMasterReadEvent(data []byte, line *[]byte) error {
return errors.Wrapf(err, "failed to decode received data")
}
*line = append(*line, decodedBuffer[:n]...)
// log.Printf("[wlog] %v %X\n", decodedBuffer[:n], decodedBuffer[:n])
utils.FormatWritesLog(decodedBuffer[:n], line)
if decodedBuffer[n-1] == 13 {
argumentsByte, err := json.Marshal(wt.arguments)
if err != nil {
return errors.Wrapf(err, "failed to marshal arguments map")
}
//log.Printf("[wlog] %v\n", line)
log.Printf("[wlog] %s %s\n", utils.FormatWritesLog(line), string(argumentsByte))
*line = nil
log.Printf("[wlog] %s %s\n", *line, string(argumentsByte))
*line = ""
}
_, err = wt.slave.Write(decodedBuffer[:n])