diff --git a/pkg/base/content.go b/pkg/base/body.go similarity index 63% rename from pkg/base/content.go rename to pkg/base/body.go index a9a4c717..d1abcb1e 100644 --- a/pkg/base/content.go +++ b/pkg/base/body.go @@ -7,12 +7,12 @@ import ( "strconv" ) -type payload []byte +type body []byte -func (c *payload) read(rb *bufio.Reader, header Header) error { +func (b *body) read(header Header, rb *bufio.Reader) error { cls, ok := header["Content-Length"] if !ok || len(cls) != 1 { - *c = nil + *b = nil return nil } @@ -26,21 +26,21 @@ func (c *payload) read(rb *bufio.Reader, header Header) error { rtspMaxContentLength, cl) } - *c = make([]byte, cl) - n, err := io.ReadFull(rb, *c) - if err != nil && n != len(*c) { + *b = make([]byte, cl) + n, err := io.ReadFull(rb, *b) + if err != nil && n != len(*b) { return err } return nil } -func (c payload) write(bw *bufio.Writer) error { - if len(c) == 0 { +func (b body) write(bw *bufio.Writer) error { + if len(b) == 0 { return nil } - _, err := bw.Write(c) + _, err := bw.Write(b) if err != nil { return err } diff --git a/pkg/base/body_test.go b/pkg/base/body_test.go new file mode 100644 index 00000000..65111a13 --- /dev/null +++ b/pkg/base/body_test.go @@ -0,0 +1,92 @@ +package base + +import ( + "bufio" + "bytes" + "testing" + + "github.com/stretchr/testify/require" +) + +var casesBody = []struct { + name string + h Header + byts []byte +}{ + { + "standard", + Header{ + "Content-Length": HeaderValue{"4"}, + }, + []byte{0x01, 0x02, 0x03, 0x04}, + }, + { + "nil", + Header{}, + []byte(nil), + }, +} + +func TestBodyRead(t *testing.T) { + for _, ca := range casesBody { + t.Run(ca.name, func(t *testing.T) { + var p body + err := p.read(ca.h, bufio.NewReader(bytes.NewReader(ca.byts))) + require.NoError(t, err) + require.Equal(t, ca.byts, []byte(p)) + }) + } +} + +func TestBodyWrite(t *testing.T) { + for _, ca := range casesBody { + t.Run(ca.name, func(t *testing.T) { + var buf bytes.Buffer + bw := bufio.NewWriter(&buf) + err := body(ca.byts).write(bw) + require.NoError(t, err) + bw.Flush() + require.Equal(t, ca.byts, buf.Bytes()) + }) + } +} + +func TestBodyReadErrors(t *testing.T) { + for _, ca := range []struct { + name string + h Header + byts []byte + err string + }{ + { + "invalid body", + Header{ + "Content-Length": HeaderValue{"17"}, + }, + []byte("123"), + "unexpected EOF", + }, + { + "invalid content-length", + Header{ + "Content-Length": HeaderValue{"aaa"}, + }, + []byte("123"), + "invalid Content-Length", + }, + { + "too big content-length", + Header{ + "Content-Length": HeaderValue{"1000000"}, + }, + []byte("123"), + "Content-Length exceeds 131072 (it's 1000000)", + }, + } { + t.Run(ca.name, func(t *testing.T) { + var p body + err := p.read(ca.h, bufio.NewReader(bytes.NewReader(ca.byts))) + require.Equal(t, ca.err, err.Error()) + }) + } +} diff --git a/pkg/base/request.go b/pkg/base/request.go index 2cac79e8..b998ec59 100644 --- a/pkg/base/request.go +++ b/pkg/base/request.go @@ -91,7 +91,7 @@ func (req *Request) Read(rb *bufio.Reader) error { return err } - err = (*payload)(&req.Body).read(rb, req.Header) + err = (*body)(&req.Body).read(req.Header, rb) if err != nil { return err } @@ -137,7 +137,7 @@ func (req Request) Write(bw *bufio.Writer) error { return err } - err = payload(req.Body).write(bw) + err = body(req.Body).write(bw) if err != nil { return err } diff --git a/pkg/base/request_test.go b/pkg/base/request_test.go index cd803b50..ca2bfc5a 100644 --- a/pkg/base/request_test.go +++ b/pkg/base/request_test.go @@ -222,16 +222,6 @@ func TestRequestReadErrors(t *testing.T) { []byte("GET rtsp://testing123 RTSP/1.0\r\nContent-Length: 17\r\n\r\n123"), "unexpected EOF", }, - { - "invalid content-length", - []byte("GET rtsp://testing123 RTSP/1.0\r\nContent-Length: aaa\r\n\r\n123"), - "invalid Content-Length", - }, - { - "too big content-length", - []byte("GET rtsp://testing123 RTSP/1.0\r\nContent-Length: 1000000\r\n\r\n123"), - "Content-Length exceeds 131072 (it's 1000000)", - }, } { t.Run(ca.name, func(t *testing.T) { var req Request diff --git a/pkg/base/response.go b/pkg/base/response.go index 38b8886b..8a662ad0 100644 --- a/pkg/base/response.go +++ b/pkg/base/response.go @@ -177,7 +177,7 @@ func (res *Response) Read(rb *bufio.Reader) error { return err } - err = (*payload)(&res.Body).read(rb, res.Header) + err = (*body)(&res.Body).read(res.Header, rb) if err != nil { return err } @@ -228,7 +228,7 @@ func (res Response) Write(bw *bufio.Writer) error { return err } - err = payload(res.Body).write(bw) + err = body(res.Body).write(bw) if err != nil { return err } diff --git a/pkg/base/response_test.go b/pkg/base/response_test.go index 125f723c..f6bece06 100644 --- a/pkg/base/response_test.go +++ b/pkg/base/response_test.go @@ -179,16 +179,6 @@ func TestResponseReadErrors(t *testing.T) { []byte("RTSP/1.0 200 OK\r\nContent-Length: 17\r\n\r\n123"), "unexpected EOF", }, - { - "invalid content-length", - []byte("RTSP/1.0 200 OK\r\nContent-Length: aaa\r\n\r\n123"), - "invalid Content-Length", - }, - { - "too big content-length", - []byte("RTSP/1.0 200 OK\r\nContent-Length: 1000000\r\n\r\n123"), - "Content-Length exceeds 131072 (it's 1000000)", - }, } { t.Run(ca.name, func(t *testing.T) { var res Response