File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments