summaryrefslogtreecommitdiff
path: root/pkg/netstring/netstring.go
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-01-23 06:24:21 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-01-23 06:26:25 +0300
commit3145a06d233dfdd4a70cfc706eaaae3abfb937db (patch)
treed5550568b223ff46b880a1708926a49d910bab94 /pkg/netstring/netstring.go
parentc03851d36298d24e2949a3de688cf2ed2f55b064 (diff)
fix client/server protocol
Diffstat (limited to 'pkg/netstring/netstring.go')
-rw-r--r--pkg/netstring/netstring.go55
1 files changed, 55 insertions, 0 deletions
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
+}