From 5d355b46ccff38ea8c40072a08ab6788cf6c039e Mon Sep 17 00:00:00 2001 From: LandaMm Date: Sat, 19 Apr 2025 13:31:24 +0200 Subject: [PATCH] feat: get request kind and stream info --- hsp/request.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/hsp/request.go b/hsp/request.go index 0ed451b..ef77b94 100644 --- a/hsp/request.go +++ b/hsp/request.go @@ -6,6 +6,8 @@ import ( "fmt" "net" "slices" + "strconv" + "strings" ) type Request struct { @@ -42,6 +44,45 @@ func (req *Request) GetDataFormat() (*DataFormat, error) { return ParseDataFormat(format) } +func (req *Request) GetRequestKind() string { + _, ok := req.GetHeader(H_XSTREAM) + if ok { + return "stream" + } + + return "single-hit" +} + +func (req *Request) GetStreamInfo() (*StreamInfo, error) { + stream, ok := req.GetHeader(H_XSTREAM) + if !ok { + return nil, errors.New("No X-STREAM header presented in request") + } + + parts := strings.Split(stream, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("Invalid value of X-STREAM header: '%s'", stream) + } + + totalS, bufsizeS := parts[0], parts[1] + + total, err := strconv.ParseUint(totalS, 10, 64) + if err != nil { + return nil, err + } + + bufsize, err := strconv.ParseUint(bufsizeS, 10, 16) + if err != nil { + return nil, err + } + buf := uint16(bufsize) + + return &StreamInfo{ + TotalBytes: total, + BufferSize: buf, + }, nil +} + func (req *Request) ExtractText() (string, error) { df, err := req.GetDataFormat() if err != nil {