mirror of
https://github.com/tale/headplane.git
synced 2026-08-08 05:13:15 +00:00
feat: initial webssh tooling
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
package sshutil
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func encodeFrame(id string, data []byte) ([]byte, error) {
|
||||
sid := []byte(id)
|
||||
if len(sid) > 255 {
|
||||
return nil, fmt.Errorf("session ID too long")
|
||||
}
|
||||
|
||||
payloadLen := len(data)
|
||||
buf := make([]byte, 1+len(sid)+4+payloadLen)
|
||||
|
||||
buf[0] = byte(len(sid)) // SID length
|
||||
copy(buf[1:], sid) // SID
|
||||
binary.BigEndian.PutUint32(buf[1+len(sid):], uint32(payloadLen)) // Payload length
|
||||
copy(buf[1+len(sid)+4:], data) // Payload
|
||||
|
||||
return buf, nil
|
||||
}
|
||||
|
||||
func decodeFrame(buf []byte) (id string, payload []byte, ok bool) {
|
||||
if len(buf) < 5 {
|
||||
return "", nil, false
|
||||
}
|
||||
sidLen := int(buf[0])
|
||||
if len(buf) < 1+sidLen+4 {
|
||||
return "", nil, false
|
||||
}
|
||||
id = string(buf[1 : 1+sidLen])
|
||||
payloadLen := int(binary.BigEndian.Uint32(buf[1+sidLen:]))
|
||||
|
||||
if len(buf) < 1+sidLen+4+payloadLen {
|
||||
return "", nil, false
|
||||
}
|
||||
payload = buf[1+sidLen+4 : 1+sidLen+4+payloadLen]
|
||||
return id, payload, true
|
||||
}
|
||||
Reference in New Issue
Block a user