71 lines
1.2 KiB
Go
71 lines
1.2 KiB
Go
package sbproxy
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
func ReadVarInt(r io.Reader) (int32, int, error) {
|
|
var val int32
|
|
var size int
|
|
for {
|
|
var b [1]byte
|
|
if _, err := r.Read(b[:]); err != nil {
|
|
return 0, 0, err
|
|
}
|
|
d := b[0]
|
|
val |= int32(d&0x7F) << (7 * size)
|
|
size++
|
|
if size > 5 {
|
|
return 0, 0, io.ErrUnexpectedEOF
|
|
}
|
|
if d&0x80 == 0 {
|
|
break
|
|
}
|
|
}
|
|
return val, size, nil
|
|
}
|
|
|
|
func WriteVarInt(w io.Writer, val int32) int {
|
|
buf := make([]byte, 5)
|
|
size := 0
|
|
for {
|
|
b := byte(val & 0x7F)
|
|
val >>= 7
|
|
if val != 0 {
|
|
b |= 0x80
|
|
}
|
|
buf[size] = b
|
|
size++
|
|
if val == 0 {
|
|
break
|
|
}
|
|
}
|
|
w.Write(buf[:size])
|
|
return size
|
|
}
|
|
|
|
func ReadString(r io.Reader) (string, error) {
|
|
length, _, err := ReadVarInt(r)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if length < 0 {
|
|
return "", errors.New("negative string length")
|
|
}
|
|
// Guard against unreasonable allocations from malformed packets.
|
|
if length > 1<<20 {
|
|
return "", errors.New("string too large")
|
|
}
|
|
buf := make([]byte, length)
|
|
if _, err := io.ReadFull(r, buf); err != nil {
|
|
return "", err
|
|
}
|
|
return string(buf), nil
|
|
}
|
|
|
|
func WriteString(w io.Writer, s string) {
|
|
WriteVarInt(w, int32(len(s)))
|
|
w.Write([]byte(s))
|
|
}
|