Skip to content

Commit 632e5ec

Browse files
committed
stream: change Read and Write logic on stream
1 parent 552a7cc commit 632e5ec

File tree

1 file changed

+18
-19
lines changed

1 file changed

+18
-19
lines changed

stream.go

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ const (
5555
// Stream abstracts the transport mechanics from the JSON RPC protocol.
5656
type Stream interface {
5757
// Read gets the next message from the stream.
58-
Read(ctx context.Context, p []byte) (n int, err error)
58+
Read(ctx context.Context) (data []byte, err error)
5959

6060
// Write sends a message to the stream.
61-
Write(ctx context.Context, p []byte) (n int, err error)
61+
Write(ctx context.Context, data []byte) (err error)
6262
}
6363

6464
type stream struct {
@@ -74,18 +74,18 @@ func NewStream(in io.Reader, out io.Writer) Stream {
7474
}
7575
}
7676

77-
func (s *stream) Read(ctx context.Context, p []byte) (n int, err error) {
77+
func (s *stream) Read(ctx context.Context) ([]byte, error) {
7878
select {
7979
case <-ctx.Done():
80-
return 0, ctx.Err()
80+
return nil, ctx.Err()
8181
default:
8282
}
8383

8484
var length int64
8585
for {
8686
line, err := s.in.ReadString('\n')
8787
if err != nil {
88-
return 0, xerrors.Errorf("failed reading header line: %w", err)
88+
return nil, xerrors.Errorf("failed reading header line: %w", err)
8989
}
9090

9191
line = strings.TrimSpace(line)
@@ -95,7 +95,7 @@ func (s *stream) Read(ctx context.Context, p []byte) (n int, err error) {
9595

9696
colon := strings.IndexRune(line, ':')
9797
if colon < 0 {
98-
return 0, xerrors.Errorf("invalid header line: %q", line)
98+
return nil, xerrors.Errorf("invalid header line: %q", line)
9999
}
100100

101101
name, value := line[:colon], strings.TrimSpace(line[colon+1:])
@@ -104,40 +104,39 @@ func (s *stream) Read(ctx context.Context, p []byte) (n int, err error) {
104104
}
105105

106106
if length, err = strconv.ParseInt(value, 10, 32); err != nil {
107-
return 0, xerrors.Errorf("failed parsing Content-Length: %v", value)
107+
return nil, xerrors.Errorf("failed parsing Content-Length: %v", value)
108108
}
109109

110110
if length <= 0 {
111-
return 0, xerrors.Errorf("invalid Content-Length: %v", length)
111+
return nil, xerrors.Errorf("invalid Content-Length: %v", length)
112112
}
113113
}
114114

115115
if length == 0 {
116-
return 0, xerrors.New("missing Content-Length header")
116+
return nil, xerrors.New("missing Content-Length header")
117117
}
118118

119-
p = make([]byte, length)
120-
n, err = io.ReadFull(s.in, p)
121-
if err != nil {
122-
return 0, xerrors.Errorf("failed reading data: %w", err)
119+
data := make([]byte, length)
120+
if _, err := io.ReadFull(s.in, data); err != nil {
121+
return nil, xerrors.Errorf("failed reading data: %w", err)
123122
}
124123

125-
return n, nil
124+
return data, nil
126125
}
127126

128-
func (s *stream) Write(ctx context.Context, p []byte) (n int, err error) {
127+
func (s *stream) Write(ctx context.Context, data []byte) (err error) {
129128
select {
130129
case <-ctx.Done():
131-
return 0, ctx.Err()
130+
return ctx.Err()
132131
default:
133132
}
134133

135134
s.Lock()
136-
n, err = fmt.Fprintf(s.out, HeaderContentLengthFmt+HeaderContentTypeFmt+HeaderContentSeparator, len(p), ContentTypeJSONRPC)
135+
_, err = fmt.Fprintf(s.out, HeaderContentLengthFmt+HeaderContentTypeFmt+HeaderContentSeparator, len(data), ContentTypeJSONRPC)
137136
if err == nil {
138-
n, err = s.out.Write(p)
137+
_, err = s.out.Write(data)
139138
}
140139
s.Unlock()
141140

142-
return n, err
141+
return err
143142
}

0 commit comments

Comments
 (0)