From 3145a06d233dfdd4a70cfc706eaaae3abfb937db Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Thu, 23 Jan 2020 06:24:21 +0300 Subject: fix client/server protocol --- pkg/netstring/netstring.go | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 pkg/netstring/netstring.go (limited to 'pkg/netstring') diff --git a/pkg/netstring/netstring.go b/pkg/netstring/netstring.go new file mode 100644 index 0000000..01b179a --- /dev/null +++ b/pkg/netstring/netstring.go @@ -0,0 +1,55 @@ +package netstring + +import ( + "errors" + "fmt" + "io" +) + +type Encoder struct { + w io.Writer +} + +type Decoder struct { + r io.Reader +} + +var errBadFormat = errors.New("netstring: bad format") + +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{w: w} +} + +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{r: r} +} + +func (e *Encoder) Encode(s string) error { + _, err := fmt.Fprintf(e.w, "%d:%s,", len(s), s) + return err +} + +func (d *Decoder) Decode() (out string, err error) { + var n int + + _, err = fmt.Fscanf(d.r, "%d:", &n) + if err != nil { + return + } + + buf := make([]byte, n + 1) + + _, err = io.ReadFull(d.r, buf) + if err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } + return + } + + if buf[n] != ',' { + return "", errBadFormat + } + + return string(buf[:n]), nil +} -- cgit v1.2.3-70-g09d2