From b26eef4307cecd402fc3aed26c03cbd677aae0f7 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Sat, 19 Apr 2025 12:38:40 +0200 Subject: [PATCH] fmt: whole hsp package --- hsp/address.go | 7 +++---- hsp/constants.go | 33 ++++++++++++++++++++++----------- hsp/packet.go | 23 +++++++++++------------ hsp/request.go | 17 +++++++++++++++-- hsp/response.go | 6 +++--- hsp/server/server.go | 21 +++++++++------------ 6 files changed, 63 insertions(+), 44 deletions(-) diff --git a/hsp/address.go b/hsp/address.go index 76344b2..7215196 100644 --- a/hsp/address.go +++ b/hsp/address.go @@ -6,13 +6,13 @@ import ( ) type Adddress struct { - Host string + Host string Route string } func ParseAddress(address string) (*Adddress, error) { parts := strings.SplitN(address, "/", 2) - + var route string if len(parts) == 1 { route = "/" @@ -25,7 +25,7 @@ func ParseAddress(address string) (*Adddress, error) { addr := parts[0] return &Adddress{ - Host: addr, + Host: addr, Route: route, }, nil } @@ -33,4 +33,3 @@ func ParseAddress(address string) (*Adddress, error) { func (a *Adddress) String() string { return fmt.Sprintf("%s:%s", a.Host, HSP_PORT) } - diff --git a/hsp/constants.go b/hsp/constants.go index 6b3b42e..4f0ae3d 100644 --- a/hsp/constants.go +++ b/hsp/constants.go @@ -10,15 +10,15 @@ import ( const HSP_PORT = "998" const ( - H_STATUS = "status" + H_STATUS = "status" H_DATA_FORMAT = "data-format" - H_ROUTE = "route" + H_ROUTE = "route" ) const ( DF_BYTES = "bytes" - DF_TEXT = "text" - DF_JSON = "json" + DF_TEXT = "text" + DF_JSON = "json" ) const ( @@ -26,15 +26,15 @@ const ( ) const ( - STATUS_SUCCESS = 0 - STATUS_NOTFOUND = 69 + STATUS_SUCCESS = 0 + STATUS_NOTFOUND = 69 STATUS_INTERNALERR = 129 ) var DATA_FORMATS map[string]string = map[string]string{ "bytes": DF_BYTES, - "text": DF_TEXT, - "json": DF_JSON, + "text": DF_TEXT, + "json": DF_JSON, } var ENCODINGS map[string]string = map[string]string{ @@ -42,10 +42,22 @@ var ENCODINGS map[string]string = map[string]string{ } type DataFormat struct { - Format string + Format string Encoding string } +func TextDataFormat() *DataFormat { + return &DataFormat{Format: DF_TEXT, Encoding: E_UTF8} +} + +func JsonDataFormat() *DataFormat { + return &DataFormat{Format: DF_JSON, Encoding: E_UTF8} +} + +func BytesDataFormat() *DataFormat { + return &DataFormat{Format: DF_BYTES} +} + func ParseDataFormat(format string) (*DataFormat, error) { parts := strings.Split(format, ":") if len(parts) != 2 { @@ -68,7 +80,7 @@ func ParseDataFormat(format string) (*DataFormat, error) { } return &DataFormat{ - Format: f, + Format: f, Encoding: encoding, }, nil } @@ -79,4 +91,3 @@ func (df *DataFormat) String() string { } return fmt.Sprintf("%s:%s", df.Format, df.Encoding) } - diff --git a/hsp/packet.go b/hsp/packet.go index 0e902e0..a180876 100644 --- a/hsp/packet.go +++ b/hsp/packet.go @@ -18,18 +18,18 @@ const ( ) type RawPacket struct { - Magic uint32 - Version uint8 - Flags uint8 - HeaderSize uint16 + Magic uint32 + Version uint8 + Flags uint8 + HeaderSize uint16 PayloadSize uint32 - Header []byte - Payload []byte + Header []byte + Payload []byte } type Packet struct { Version int - Flags int + Flags int Headers map[string]string Payload []byte } @@ -41,7 +41,7 @@ type PacketDuplex struct { func BuildPacket(headers map[string]string, payload []byte) *Packet { return &Packet{ Version: PacketVersion, - Flags: 0, // TODO: + Flags: 0, // TODO: Headers: headers, Payload: payload, } @@ -76,7 +76,7 @@ func ParseHeaders(rawHeaders []byte, headers *map[string]string) error { func SerializeHeaders(headers *map[string]string) []byte { buf := new(bytes.Buffer) - for k, v := range(*headers) { + for k, v := range *headers { fmt.Fprintf(buf, "%s:%s\n", k, v) } fmt.Fprintf(buf, "\n") @@ -133,7 +133,7 @@ func (r *PacketDuplex) ReadPacket() (*Packet, error) { pkt := &Packet{ Version: int(rpkt.Version), - Flags: int(rpkt.Flags), + Flags: int(rpkt.Flags), Headers: make(map[string]string), Payload: rpkt.Payload, } @@ -169,7 +169,7 @@ func (r *PacketDuplex) WritePacket(packet *Packet) (int, error) { if err := binary.Write(buf, binary.BigEndian, uint32(payloadSize)); err != nil { return 0, errors.New(fmt.Sprintf("Failed to write payload size into packet: %s", err.Error())) } - + if _, err := buf.Write(rawHeaders[:headerSize]); err != nil { return 0, errors.New(fmt.Sprintf("Failed to write raw headers: %s", err.Error())) } @@ -185,4 +185,3 @@ func (r *PacketDuplex) WritePacket(packet *Packet) (int, error) { return n, nil } - diff --git a/hsp/request.go b/hsp/request.go index 65be3ba..0ed451b 100644 --- a/hsp/request.go +++ b/hsp/request.go @@ -1,6 +1,7 @@ package hsp import ( + "encoding/json" "errors" "fmt" "net" @@ -8,7 +9,7 @@ import ( ) type Request struct { - conn net.Conn + conn net.Conn packet *Packet } @@ -54,6 +55,19 @@ func (req *Request) ExtractText() (string, error) { return string(req.packet.Payload), nil } +func (req *Request) ExtractJson(out any) error { + df, err := req.GetDataFormat() + if err != nil { + return err + } + + if !slices.Contains([]string{DF_JSON}, df.Format) { + return errors.New(fmt.Sprintf("Data format '%s' cannot be extracted as json", df.Format)) + } + + return json.Unmarshal(req.packet.Payload, out) +} + func (req *Request) ExtractBytes() ([]byte, error) { df, err := req.GetDataFormat() if err != nil { @@ -66,4 +80,3 @@ func (req *Request) ExtractBytes() ([]byte, error) { return req.packet.Payload, nil } - diff --git a/hsp/response.go b/hsp/response.go index c155cde..fe6702b 100644 --- a/hsp/response.go +++ b/hsp/response.go @@ -40,9 +40,9 @@ func NewPacketResponse(packet *Packet) *Response { return &Response{ StatusCode: s, - Format: *df, - Headers: packet.Headers, - Payload: packet.Payload, + Format: *df, + Headers: packet.Headers, + Payload: packet.Payload, } } diff --git a/hsp/server/server.go b/hsp/server/server.go index c029b86..ab97e72 100644 --- a/hsp/server/server.go +++ b/hsp/server/server.go @@ -9,19 +9,19 @@ import ( ) type Server struct { - Addr hsp.Adddress + Addr hsp.Adddress routePrefix string // TODO: Support route prefix, e.g listening on localhost/api - Running bool - ConnChan chan net.Conn - listener net.Listener - mu sync.Mutex + Running bool + ConnChan chan net.Conn + listener net.Listener + mu sync.Mutex } func NewServer(addr hsp.Adddress) *Server { return &Server{ - Addr: addr, + Addr: addr, routePrefix: addr.Route, - Running: false, + Running: false, } } @@ -45,7 +45,7 @@ func (s *Server) Start() error { conn, err := ln.Accept() if err != nil { if !s.IsRunning() { - break; + break } return err } @@ -65,7 +65,6 @@ func (s *Server) Start() error { return nil } - func (s *Server) Stop() error { s.mu.Lock() defer s.mu.Unlock() @@ -77,7 +76,7 @@ func (s *Server) Stop() error { if s.ConnChan != nil { close(s.ConnChan) } - + return nil } @@ -86,5 +85,3 @@ func (s *Server) IsRunning() bool { defer s.mu.Unlock() return s.Running } - -