Files
hsp.go/hsp/packet.go
2025-04-27 15:44:47 +02:00

84 lines
1.3 KiB
Go

package hsp
import (
"bytes"
"fmt"
"net"
)
const (
Magic uint32 = 0xDEADBEEF
)
const (
PacketVersion int = 2
)
type RawPacket struct {
Magic uint32
Version uint8
Flags uint8
HeaderSize uint16
PayloadSize uint32
Nonce []byte
Header []byte
Payload []byte
Mac []byte
}
type Packet struct {
Version int
Flags int
Headers map[string]string
Payload []byte
}
type PacketDuplex struct {
conn net.Conn
}
func BuildPacket(headers map[string]string, payload []byte) *Packet {
return &Packet{
Version: PacketVersion,
Flags: 0, // TODO:
Headers: headers,
Payload: payload,
}
}
func ParseHeaders(rawHeaders []byte, headers *map[string]string) error {
i := 0
for i < len(rawHeaders) {
if rawHeaders[i] == '\n' {
break
}
var key string
for rawHeaders[i] != ':' {
if rawHeaders[i] != ' ' {
key += string(rawHeaders[i])
}
i++
}
i++
var value string
for rawHeaders[i] != '\n' {
if rawHeaders[i] != ' ' {
value += string(rawHeaders[i])
}
i++
}
i++
(*headers)[key] = value
}
return nil
}
func SerializeHeaders(headers *map[string]string) []byte {
buf := new(bytes.Buffer)
for k, v := range *headers {
fmt.Fprintf(buf, "%s:%s\n", k, v)
}
fmt.Fprintf(buf, "\n")
return buf.Bytes()
}