Skip to content

Commit 1309adb

Browse files
committed
proto: abstract formatting away and reuse formatting buffer
1 parent 9a7096c commit 1309adb

2 files changed

Lines changed: 54 additions & 2 deletions

File tree

handler/handler.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ func (a *BasicHMACAuthHandler) Run(input io.Reader, output io.Writer) error {
3030

3131
mac := hmac.NewHasher(a.Secret)
3232

33+
emitter := proto.NewResponseEmitter(output)
34+
3335
for scanner.Scan() {
3436
parts := bytes.SplitN(scanner.Bytes(), []byte{' '}, 4)
3537
if len(parts) < 3 {
@@ -41,9 +43,13 @@ func (a *BasicHMACAuthHandler) Run(input io.Reader, output io.Writer) error {
4143
password := proto.RFC1738Unescape(parts[2])
4244

4345
if hmac.VerifyHMACLoginAndPassword(mac, username, password) {
44-
fmt.Fprintf(output, "%s OK\n", channelID)
46+
if err := emitter.EmitOK(channelID); err != nil {
47+
return fmt.Errorf("response write failed: %w", err)
48+
}
4549
} else {
46-
fmt.Fprintf(output, "%s ERR\n", channelID)
50+
if err := emitter.EmitERR(channelID); err != nil {
51+
return fmt.Errorf("response write failed: %w", err)
52+
}
4753
}
4854
}
4955

proto/emit.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package proto
2+
3+
import (
4+
"bytes"
5+
"io"
6+
)
7+
8+
const (
9+
OK = "OK"
10+
ERR = "ERR"
11+
)
12+
13+
type ResponseEmitter struct {
14+
writer io.Writer
15+
buffer bytes.Buffer
16+
}
17+
18+
func NewResponseEmitter(writer io.Writer) *ResponseEmitter {
19+
return &ResponseEmitter{
20+
writer: writer,
21+
}
22+
}
23+
24+
func (e *ResponseEmitter) EmitOK(channelID []byte) error {
25+
e.beginResponse(channelID)
26+
e.buffer.WriteString(OK)
27+
return e.finishResponse()
28+
}
29+
30+
func (e *ResponseEmitter) EmitERR(channelID []byte) error {
31+
e.beginResponse(channelID)
32+
e.buffer.WriteString(ERR)
33+
return e.finishResponse()
34+
}
35+
36+
func (e *ResponseEmitter) beginResponse(channelID []byte) {
37+
e.buffer.Reset()
38+
e.buffer.Write(channelID)
39+
e.buffer.WriteByte(' ')
40+
}
41+
42+
func (e *ResponseEmitter) finishResponse() error {
43+
e.buffer.WriteByte('\n')
44+
_, err := e.buffer.WriteTo(e.writer)
45+
return err
46+
}

0 commit comments

Comments
 (0)