Skip to content

Commit df581cf

Browse files
committed
changed stream trait to impl Read and Write, not contain
1 parent 66a132a commit df581cf

File tree

5 files changed

+82
-124
lines changed

5 files changed

+82
-124
lines changed

src/client/builder.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::borrow::Cow;
2-
use std::io::Write;
32
use std::net::TcpStream;
43
pub use url::{Url, ParseError};
54
use url::Position;
@@ -12,12 +11,11 @@ use unicase::UniCase;
1211
#[cfg(feature="ssl")]
1312
use openssl::ssl::{SslMethod, SslStream, SslConnector, SslConnectorBuilder};
1413
#[cfg(feature="ssl")]
15-
use stream::BoxedNetworkStream;
1614
use header::extensions::Extension;
1715
use header::{WebSocketAccept, WebSocketKey, WebSocketVersion, WebSocketProtocol,
1816
WebSocketExtensions, Origin};
1917
use result::{WSUrlErrorKind, WebSocketResult, WebSocketError};
20-
use stream::Stream;
18+
use stream::{Stream, NetworkStream};
2119
use super::Client;
2220

2321
/// Build clients with a builder-style API
@@ -182,13 +180,14 @@ impl<'u> ClientBuilder<'u> {
182180
pub fn connect(
183181
&mut self,
184182
ssl_config: Option<SslConnector>,
185-
) -> WebSocketResult<Client<BoxedNetworkStream>> {
183+
) -> WebSocketResult<Client<Box<NetworkStream>>> {
186184
let tcp_stream = try!(self.establish_tcp(None));
187185

188-
let boxed_stream = if self.url.scheme() == "wss" {
189-
BoxedNetworkStream(Box::new(try!(self.wrap_ssl(tcp_stream, ssl_config))))
186+
let boxed_stream: Box<NetworkStream> = if
187+
self.url.scheme() == "wss" {
188+
Box::new(try!(self.wrap_ssl(tcp_stream, ssl_config)))
190189
} else {
191-
BoxedNetworkStream(Box::new(tcp_stream))
190+
Box::new(tcp_stream)
192191
};
193192

194193
self.connect_on(boxed_stream)
@@ -248,12 +247,12 @@ impl<'u> ClientBuilder<'u> {
248247
}
249248

250249
// send request
251-
try!(write!(stream.writer(), "GET {} {}\r\n", resource, self.version));
252-
try!(write!(stream.writer(), "{}\r\n", self.headers));
250+
try!(write!(stream, "GET {} {}\r\n", resource, self.version));
251+
try!(write!(stream, "{}\r\n", self.headers));
253252

254253
// wait for a response
255254
// TODO: some extra data might get lost with this reader, try to avoid #72
256-
let response = try!(parse_response(&mut BufReader::new(stream.reader())));
255+
let response = try!(parse_response(&mut BufReader::new(&mut stream)));
257256
let status = StatusCode::from_u16(response.subject.0);
258257

259258
// validate

src/client/mod.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,33 +128,33 @@ impl<S> Client<S>
128128
pub fn send_dataframe<D>(&mut self, dataframe: &D) -> WebSocketResult<()>
129129
where D: DataFrameable
130130
{
131-
self.sender.send_dataframe(self.stream.writer(), dataframe)
131+
self.sender.send_dataframe(&mut self.stream, dataframe)
132132
}
133133

134134
/// Sends a single message to the remote endpoint.
135135
pub fn send_message<'m, M, D>(&mut self, message: &'m M) -> WebSocketResult<()>
136136
where M: ws::Message<'m, D>,
137137
D: DataFrameable
138138
{
139-
self.sender.send_message(self.stream.writer(), message)
139+
self.sender.send_message(&mut self.stream, message)
140140
}
141141

142142
/// Reads a single data frame from the remote endpoint.
143143
pub fn recv_dataframe(&mut self) -> WebSocketResult<DataFrame> {
144-
self.receiver.recv_dataframe(self.stream.reader())
144+
self.receiver.recv_dataframe(&mut self.stream)
145145
}
146146

147147
/// Returns an iterator over incoming data frames.
148-
pub fn incoming_dataframes<'a>(&'a mut self) -> DataFrameIterator<'a, Receiver, S::Reader> {
149-
self.receiver.incoming_dataframes(self.stream.reader())
148+
pub fn incoming_dataframes<'a>(&'a mut self) -> DataFrameIterator<'a, Receiver, S> {
149+
self.receiver.incoming_dataframes(&mut self.stream)
150150
}
151151

152152
/// Reads a single message from this receiver.
153153
pub fn recv_message<'m, M, I>(&mut self) -> WebSocketResult<M>
154154
where M: ws::Message<'m, DataFrame, DataFrameIterator = I>,
155155
I: Iterator<Item = DataFrame>
156156
{
157-
self.receiver.recv_message(self.stream.reader())
157+
self.receiver.recv_message(&mut self.stream)
158158
}
159159

160160
pub fn headers(&self) -> &Headers {
@@ -229,12 +229,11 @@ impl<S> Client<S>
229229
///}
230230
///# }
231231
///```
232-
pub fn incoming_messages<'a, M, D>(&'a mut self,)
233-
-> MessageIterator<'a, Receiver, D, M, S::Reader>
232+
pub fn incoming_messages<'a, M, D>(&'a mut self) -> MessageIterator<'a, Receiver, D, M, S>
234233
where M: ws::Message<'a, D>,
235234
D: DataFrameable
236235
{
237-
self.receiver.incoming_messages(self.stream.reader())
236+
self.receiver.incoming_messages(&mut self.stream)
238237
}
239238
}
240239

src/server/upgrade/hyper.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ impl<'a, 'b> IntoWs for HyperRequest<'a, 'b> {
2727

2828
let (_, method, headers, uri, version, reader) =
2929
self.0.deconstruct();
30+
31+
// TODO: some extra data might get lost with this reader, try to avoid #72
3032
let stream = reader.into_inner().get_mut();
3133

3234
Ok(WsUpgrade {

src/server/upgrade/mod.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use std::net::TcpStream;
77
use std::io;
88
use std::io::Result as IoResult;
99
use std::io::Error as IoError;
10-
use std::io::Write;
1110
use std::fmt::{self, Formatter, Display};
1211
use stream::{Stream, AsTcpStream};
1312
use header::extensions::Extension;
@@ -147,11 +146,8 @@ impl<S> WsUpgrade<S>
147146
}
148147

149148
fn send(&mut self, status: StatusCode) -> IoResult<()> {
150-
try!(write!(self.stream.writer(),
151-
"{} {}\r\n",
152-
self.request.version,
153-
status));
154-
try!(write!(self.stream.writer(), "{}\r\n", self.headers));
149+
try!(write!(&mut self.stream, "{} {}\r\n", self.request.version, status));
150+
try!(write!(&mut self.stream, "{}\r\n", self.headers));
155151
Ok(())
156152
}
157153
}
@@ -194,7 +190,8 @@ impl<S> IntoWs for S
194190

195191
fn into_ws(mut self) -> Result<WsUpgrade<Self::Stream>, Self::Error> {
196192
let request = {
197-
let mut reader = BufReader::new(self.reader());
193+
// TODO: some extra data might get lost with this reader, try to avoid #72
194+
let mut reader = BufReader::new(&mut self);
198195
parse_request(&mut reader)
199196
};
200197

src/stream.rs

Lines changed: 59 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,31 @@
11
//! Provides the default stream type for WebSocket connections.
22
33
use std::ops::Deref;
4+
use std::fmt::Arguments;
45
use std::io::{self, Read, Write};
56
pub use std::net::TcpStream;
67
pub use std::net::Shutdown;
78
#[cfg(feature="ssl")]
89
pub use openssl::ssl::{SslStream, SslContext};
910

10-
pub trait Splittable {
11-
type Reader: Read;
12-
type Writer: Write;
13-
14-
fn split(self) -> io::Result<(Self::Reader, Self::Writer)>;
15-
}
16-
1711
/// Represents a stream that can be read from, and written to.
1812
/// This is an abstraction around readable and writable things to be able
1913
/// to speak websockets over ssl, tcp, unix sockets, etc.
20-
pub trait Stream {
14+
pub trait Stream: Read + Write {}
15+
16+
impl<S> Stream for S where S: Read + Write {}
17+
18+
pub trait NetworkStream: Read + Write + AsTcpStream {}
19+
20+
impl<S> NetworkStream for S where S: Read + Write + AsTcpStream {}
21+
22+
pub trait Splittable {
2123
type Reader: Read;
2224
type Writer: Write;
2325

24-
/// Get a mutable borrow to the reading component of this stream
25-
fn reader(&mut self) -> &mut Self::Reader;
26-
27-
/// Get a mutable borrow to the writing component of this stream
28-
fn writer(&mut self) -> &mut Self::Writer;
26+
fn split(self) -> io::Result<(Self::Reader, Self::Writer)>;
2927
}
3028

31-
pub struct ReadWritePair<R, W>(pub R, pub W)
32-
where R: Read,
33-
W: Write;
34-
3529
impl<R, W> Splittable for ReadWritePair<R, W>
3630
where R: Read,
3731
W: Write
@@ -44,70 +38,6 @@ impl<R, W> Splittable for ReadWritePair<R, W>
4438
}
4539
}
4640

47-
impl<R, W> Stream for ReadWritePair<R, W>
48-
where R: Read,
49-
W: Write
50-
{
51-
type Reader = R;
52-
type Writer = W;
53-
54-
#[inline]
55-
fn reader(&mut self) -> &mut R {
56-
&mut self.0
57-
}
58-
59-
#[inline]
60-
fn writer(&mut self) -> &mut W {
61-
&mut self.1
62-
}
63-
}
64-
65-
pub trait ReadWrite: Read + Write {}
66-
impl<S> ReadWrite for S where S: Read + Write {}
67-
68-
pub struct BoxedStream(pub Box<ReadWrite>);
69-
70-
impl Stream for BoxedStream {
71-
type Reader = Box<ReadWrite>;
72-
type Writer = Box<ReadWrite>;
73-
74-
#[inline]
75-
fn reader(&mut self) -> &mut Self::Reader {
76-
&mut self.0
77-
}
78-
79-
#[inline]
80-
fn writer(&mut self) -> &mut Self::Writer {
81-
&mut self.0
82-
}
83-
}
84-
85-
pub trait NetworkStream: Read + Write + AsTcpStream {}
86-
impl<S> NetworkStream for S where S: Read + Write + AsTcpStream {}
87-
88-
pub struct BoxedNetworkStream(pub Box<NetworkStream>);
89-
90-
impl AsTcpStream for BoxedNetworkStream {
91-
fn as_tcp(&self) -> &TcpStream {
92-
self.0.deref().as_tcp()
93-
}
94-
}
95-
96-
impl Stream for BoxedNetworkStream {
97-
type Reader = Box<NetworkStream>;
98-
type Writer = Box<NetworkStream>;
99-
100-
#[inline]
101-
fn reader(&mut self) -> &mut Self::Reader {
102-
&mut self.0
103-
}
104-
105-
#[inline]
106-
fn writer(&mut self) -> &mut Self::Writer {
107-
&mut self.0
108-
}
109-
}
110-
11141
impl Splittable for TcpStream {
11242
type Reader = TcpStream;
11343
type Writer = TcpStream;
@@ -117,23 +47,6 @@ impl Splittable for TcpStream {
11747
}
11848
}
11949

120-
impl<S> Stream for S
121-
where S: Read + Write
122-
{
123-
type Reader = Self;
124-
type Writer = Self;
125-
126-
#[inline]
127-
fn reader(&mut self) -> &mut S {
128-
self
129-
}
130-
131-
#[inline]
132-
fn writer(&mut self) -> &mut S {
133-
self
134-
}
135-
}
136-
13750
pub trait AsTcpStream {
13851
fn as_tcp(&self) -> &TcpStream;
13952
}
@@ -158,3 +71,51 @@ impl<T> AsTcpStream for Box<T>
15871
self.deref().as_tcp()
15972
}
16073
}
74+
75+
pub struct ReadWritePair<R, W>(pub R, pub W)
76+
where R: Read,
77+
W: Write;
78+
79+
impl<R, W> Read for ReadWritePair<R, W>
80+
where R: Read,
81+
W: Write
82+
{
83+
#[inline(always)]
84+
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
85+
self.0.read(buf)
86+
}
87+
#[inline(always)]
88+
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
89+
self.0.read_to_end(buf)
90+
}
91+
#[inline(always)]
92+
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
93+
self.0.read_to_string(buf)
94+
}
95+
#[inline(always)]
96+
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
97+
self.0.read_exact(buf)
98+
}
99+
}
100+
101+
impl<R, W> Write for ReadWritePair<R, W>
102+
where R: Read,
103+
W: Write
104+
{
105+
#[inline(always)]
106+
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
107+
self.1.write(buf)
108+
}
109+
#[inline(always)]
110+
fn flush(&mut self) -> io::Result<()> {
111+
self.1.flush()
112+
}
113+
#[inline(always)]
114+
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
115+
self.1.write_all(buf)
116+
}
117+
#[inline(always)]
118+
fn write_fmt(&mut self, fmt: Arguments) -> io::Result<()> {
119+
self.1.write_fmt(fmt)
120+
}
121+
}

0 commit comments

Comments
 (0)