Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit d8a900f

Browse files
committed
Add copy functions for read or write only streams
Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
1 parent a9af616 commit d8a900f

2 files changed

Lines changed: 58 additions & 0 deletions

File tree

inmem.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,10 @@ func (w *pipeSender) copyValue(v interface{}) (interface{}, error) {
300300
}
301301
case io.ReadWriteCloser:
302302
return w.copyByteStream(val)
303+
case io.ReadCloser:
304+
return w.copyByteReadStream(val)
305+
case io.WriteCloser:
306+
return w.copyByteWriteStream(val)
303307
case Sender:
304308
return w.copySender(val)
305309
case Receiver:
@@ -355,6 +359,31 @@ func (w *pipeSender) copyByteStream(stream io.ReadWriteCloser) (io.ReadWriteClos
355359
return streamCopy, nil
356360
}
357361

362+
func (w *pipeSender) copyByteReadStream(stream io.ReadCloser) (io.ReadCloser, error) {
363+
streamCopy, err := w.session.newByteStream()
364+
if err != nil {
365+
return nil, err
366+
}
367+
go func() {
368+
io.Copy(streamCopy, stream)
369+
streamCopy.Close()
370+
stream.Close()
371+
}()
372+
return streamCopy, nil
373+
}
374+
375+
func (w *pipeSender) copyByteWriteStream(stream io.WriteCloser) (io.WriteCloser, error) {
376+
streamCopy, err := w.session.newByteStream()
377+
if err != nil {
378+
return nil, err
379+
}
380+
go func() {
381+
io.Copy(stream, streamCopy)
382+
stream.Close()
383+
}()
384+
return streamCopy, nil
385+
}
386+
358387
func (w *pipeSender) copyChannelMessage(m map[string]interface{}) (interface{}, error) {
359388
mCopy := make(map[string]interface{})
360389
for k, v := range m {

spdy/copy.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ func (c *channel) copyValue(v interface{}) (interface{}, error) {
3838
// Do nothing until socket support is added
3939
case io.ReadWriteCloser:
4040
return c.copyByteStream(val)
41+
case io.ReadCloser:
42+
return c.copyByteReadStream(val)
43+
case io.WriteCloser:
44+
return c.copyByteWriteStream(val)
4145
case libchan.Sender:
4246
return c.copySender(val)
4347
case libchan.Receiver:
@@ -93,6 +97,31 @@ func (c *channel) copyByteStream(stream io.ReadWriteCloser) (io.ReadWriteCloser,
9397
return streamCopy, nil
9498
}
9599

100+
func (c *channel) copyByteReadStream(stream io.ReadCloser) (io.ReadCloser, error) {
101+
streamCopy, err := c.session.createByteStream()
102+
if err != nil {
103+
return nil, err
104+
}
105+
go func() {
106+
io.Copy(streamCopy, stream)
107+
streamCopy.Close()
108+
stream.Close()
109+
}()
110+
return streamCopy, nil
111+
}
112+
113+
func (c *channel) copyByteWriteStream(stream io.WriteCloser) (io.WriteCloser, error) {
114+
streamCopy, err := c.session.createByteStream()
115+
if err != nil {
116+
return nil, err
117+
}
118+
go func() {
119+
io.Copy(stream, streamCopy)
120+
stream.Close()
121+
}()
122+
return streamCopy, nil
123+
}
124+
96125
func (c *channel) copyChannelMessage(m map[string]interface{}) (interface{}, error) {
97126
mCopy := make(map[string]interface{})
98127
for k, v := range m {

0 commit comments

Comments
 (0)