expose Request and Response read/write functions

This commit is contained in:
aler9
2020-07-19 18:06:53 +02:00
parent e5d15bc157
commit 28192f091b
6 changed files with 20 additions and 16 deletions

View File

@@ -101,7 +101,7 @@ func (c *ConnClient) ReadFrameOrResponse(frame *InterleavedFrame) (interface{},
return frame, err return frame, err
} }
return readResponse(c.br) return ReadResponse(c.br)
} }
// Do writes a Request and reads a Response. // Do writes a Request and reads a Response.
@@ -132,7 +132,7 @@ func (c *ConnClient) Do(req *Request) (*Response, error) {
req.Header["CSeq"] = HeaderValue{strconv.FormatInt(int64(c.curCSeq), 10)} req.Header["CSeq"] = HeaderValue{strconv.FormatInt(int64(c.curCSeq), 10)}
c.conf.Conn.SetWriteDeadline(time.Now().Add(c.conf.WriteTimeout)) c.conf.Conn.SetWriteDeadline(time.Now().Add(c.conf.WriteTimeout))
err := req.write(c.bw) err := req.Write(c.bw)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -142,7 +142,7 @@ func (c *ConnClient) Do(req *Request) (*Response, error) {
} }
c.conf.Conn.SetReadDeadline(time.Now().Add(c.conf.ReadTimeout)) c.conf.Conn.SetReadDeadline(time.Now().Add(c.conf.ReadTimeout))
res, err := readResponse(c.br) res, err := ReadResponse(c.br)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -56,7 +56,7 @@ func (s *ConnServer) NetConn() net.Conn {
// ReadRequest reads a Request. // ReadRequest reads a Request.
func (s *ConnServer) ReadRequest() (*Request, error) { func (s *ConnServer) ReadRequest() (*Request, error) {
s.conf.Conn.SetReadDeadline(time.Time{}) // disable deadline s.conf.Conn.SetReadDeadline(time.Time{}) // disable deadline
return readRequest(s.br) return ReadRequest(s.br)
} }
// ReadFrameOrRequest reads an InterleavedFrame or a Request. // ReadFrameOrRequest reads an InterleavedFrame or a Request.
@@ -76,13 +76,13 @@ func (s *ConnServer) ReadFrameOrRequest(frame *InterleavedFrame) (interface{}, e
return frame, err return frame, err
} }
return readRequest(s.br) return ReadRequest(s.br)
} }
// WriteResponse writes a response. // WriteResponse writes a Response.
func (s *ConnServer) WriteResponse(res *Response) error { func (s *ConnServer) WriteResponse(res *Response) error {
s.conf.Conn.SetWriteDeadline(time.Now().Add(s.conf.WriteTimeout)) s.conf.Conn.SetWriteDeadline(time.Now().Add(s.conf.WriteTimeout))
return res.write(s.bw) return res.Write(s.bw)
} }
// WriteFrame writes an InterleavedFrame. // WriteFrame writes an InterleavedFrame.

View File

@@ -51,7 +51,8 @@ type Request struct {
SkipResponse bool SkipResponse bool
} }
func readRequest(rb *bufio.Reader) (*Request, error) { // ReadRequest reads a request from a buffered reader.
func ReadRequest(rb *bufio.Reader) (*Request, error) {
req := &Request{} req := &Request{}
byts, err := readBytesLimited(rb, ' ', requestMaxLethodLength) byts, err := readBytesLimited(rb, ' ', requestMaxLethodLength)
@@ -112,7 +113,8 @@ func readRequest(rb *bufio.Reader) (*Request, error) {
return req, nil return req, nil
} }
func (req *Request) write(bw *bufio.Writer) error { // Write writes a request into a buffered writer.
func (req *Request) Write(bw *bufio.Writer) error {
// remove credentials // remove credentials
u := &url.URL{ u := &url.URL{
Scheme: req.Url.Scheme, Scheme: req.Url.Scheme,

View File

@@ -117,7 +117,7 @@ var casesRequest = []struct {
func TestRequestRead(t *testing.T) { func TestRequestRead(t *testing.T) {
for _, c := range casesRequest { for _, c := range casesRequest {
t.Run(c.name, func(t *testing.T) { t.Run(c.name, func(t *testing.T) {
req, err := readRequest(bufio.NewReader(bytes.NewBuffer(c.byts))) req, err := ReadRequest(bufio.NewReader(bytes.NewBuffer(c.byts)))
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, c.req, req) require.Equal(t, c.req, req)
}) })
@@ -129,7 +129,7 @@ func TestRequestWrite(t *testing.T) {
t.Run(c.name, func(t *testing.T) { t.Run(c.name, func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
bw := bufio.NewWriter(&buf) bw := bufio.NewWriter(&buf)
err := c.req.write(bw) err := c.req.Write(bw)
require.NoError(t, err) require.NoError(t, err)
// do NOT call flush(), write() must have already done it // do NOT call flush(), write() must have already done it
require.Equal(t, c.byts, buf.Bytes()) require.Equal(t, c.byts, buf.Bytes())

View File

@@ -132,7 +132,8 @@ type Response struct {
Content []byte Content []byte
} }
func readResponse(rb *bufio.Reader) (*Response, error) { // ReadResponse reads a response from a buffered reader.
func ReadResponse(rb *bufio.Reader) (*Response, error) {
res := &Response{} res := &Response{}
byts, err := readBytesLimited(rb, ' ', 255) byts, err := readBytesLimited(rb, ' ', 255)
@@ -185,7 +186,8 @@ func readResponse(rb *bufio.Reader) (*Response, error) {
return res, nil return res, nil
} }
func (res *Response) write(bw *bufio.Writer) error { // Write writes a Response into a buffered writer.
func (res *Response) Write(bw *bufio.Writer) error {
if res.StatusMessage == "" { if res.StatusMessage == "" {
if status, ok := statusMessages[res.StatusCode]; ok { if status, ok := statusMessages[res.StatusCode]; ok {
res.StatusMessage = status res.StatusMessage = status

View File

@@ -111,7 +111,7 @@ var casesResponse = []struct {
func TestResponseRead(t *testing.T) { func TestResponseRead(t *testing.T) {
for _, c := range casesResponse { for _, c := range casesResponse {
t.Run(c.name, func(t *testing.T) { t.Run(c.name, func(t *testing.T) {
res, err := readResponse(bufio.NewReader(bytes.NewBuffer(c.byts))) res, err := ReadResponse(bufio.NewReader(bytes.NewBuffer(c.byts)))
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, c.res, res) require.Equal(t, c.res, res)
}) })
@@ -123,7 +123,7 @@ func TestResponseWrite(t *testing.T) {
t.Run(c.name, func(t *testing.T) { t.Run(c.name, func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
bw := bufio.NewWriter(&buf) bw := bufio.NewWriter(&buf)
err := c.res.write(bw) err := c.res.Write(bw)
require.NoError(t, err) require.NoError(t, err)
// do NOT call flush(), write() must have already done it // do NOT call flush(), write() must have already done it
require.Equal(t, c.byts, buf.Bytes()) require.Equal(t, c.byts, buf.Bytes())
@@ -155,7 +155,7 @@ func TestResponseWriteStatusAutofill(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
bw := bufio.NewWriter(&buf) bw := bufio.NewWriter(&buf)
err := res.write(bw) err := res.Write(bw)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, byts, buf.Bytes()) require.Equal(t, byts, buf.Bytes())
} }