github.com/nsqio/nsq@v1.3.0/internal/protocol/protocol.go (about) 1 package protocol 2 3 import ( 4 "encoding/binary" 5 "io" 6 "net" 7 ) 8 9 type Client interface { 10 Close() error 11 } 12 13 // Protocol describes the basic behavior of any protocol in the system 14 type Protocol interface { 15 NewClient(net.Conn) Client 16 IOLoop(Client) error 17 } 18 19 // SendResponse is a server side utility function to prefix data with a length header 20 // and write to the supplied Writer 21 func SendResponse(w io.Writer, data []byte) (int, error) { 22 err := binary.Write(w, binary.BigEndian, int32(len(data))) 23 if err != nil { 24 return 0, err 25 } 26 27 n, err := w.Write(data) 28 if err != nil { 29 return 0, err 30 } 31 32 return (n + 4), nil 33 } 34 35 // SendFramedResponse is a server side utility function to prefix data with a length header 36 // and frame header and write to the supplied Writer 37 func SendFramedResponse(w io.Writer, frameType int32, data []byte) (int, error) { 38 beBuf := make([]byte, 4) 39 size := uint32(len(data)) + 4 40 41 binary.BigEndian.PutUint32(beBuf, size) 42 n, err := w.Write(beBuf) 43 if err != nil { 44 return n, err 45 } 46 47 binary.BigEndian.PutUint32(beBuf, uint32(frameType)) 48 n, err = w.Write(beBuf) 49 if err != nil { 50 return n + 4, err 51 } 52 53 n, err = w.Write(data) 54 return n + 8, err 55 }