251
|
1 |
// Copyright 2019 The Gorilla WebSocket Authors. All rights reserved. |
|
2 |
// Use of this source code is governed by a BSD-style |
|
3 |
// license that can be found in the LICENSE file. |
|
4 |
|
|
5 |
package websocket |
|
6 |
|
|
7 |
import ( |
|
8 |
"io" |
|
9 |
"strings" |
|
10 |
) |
|
11 |
|
|
12 |
// JoinMessages concatenates received messages to create a single io.Reader. |
|
13 |
// The string term is appended to each message. The returned reader does not |
|
14 |
// support concurrent calls to the Read method. |
|
15 |
func JoinMessages(c *Conn, term string) io.Reader { |
|
16 |
return &joinReader{c: c, term: term} |
|
17 |
} |
|
18 |
|
|
19 |
type joinReader struct { |
|
20 |
c *Conn |
|
21 |
term string |
|
22 |
r io.Reader |
|
23 |
} |
|
24 |
|
|
25 |
func (r *joinReader) Read(p []byte) (int, error) { |
|
26 |
if r.r == nil { |
|
27 |
var err error |
|
28 |
_, r.r, err = r.c.NextReader() |
|
29 |
if err != nil { |
|
30 |
return 0, err |
|
31 |
} |
|
32 |
if r.term != "" { |
|
33 |
r.r = io.MultiReader(r.r, strings.NewReader(r.term)) |
|
34 |
} |
|
35 |
} |
|
36 |
n, err := r.r.Read(p) |
|
37 |
if err == io.EOF { |
|
38 |
err = nil |
|
39 |
r.r = nil |
|
40 |
} |
|
41 |
return n, err |
|
42 |
} |