Skip to content

Commit 7fed8bb

Browse files
committed
added TCP settings functions and verified questions about ws protocol
1 parent 6a28b31 commit 7fed8bb

File tree

6 files changed

+50
-20
lines changed

6 files changed

+50
-20
lines changed

ROADMAP.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
### Adding Features
3+
4+
- Make the usage of `net2` a feature
5+
- Make evented

src/client/builder.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,6 @@ impl<'u, 's> ClientBuilder<'u, 's> {
262262

263263
self.headers.set(Upgrade(vec![Protocol {
264264
name: ProtocolName::WebSocket,
265-
// TODO: actually correct or just works?
266265
version: None
267266
}]));
268267

src/client/mod.rs

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
//! Contains the WebSocket client.
22
extern crate url;
3+
extern crate net2;
34

45
use std::borrow::{
56
Cow,
67
};
78
use std::net::TcpStream;
9+
use std::net::SocketAddr;
810
use std::io::Result as IoResult;
911
use std::io::{
1012
Write,
@@ -35,6 +37,7 @@ use hyper::header::{
3537
ProtocolName,
3638
};
3739
use unicase::UniCase;
40+
use self::net2::TcpStreamExt;
3841

3942
use ws;
4043
use ws::sender::Sender as SenderTrait;
@@ -111,7 +114,7 @@ pub use self::builder::ClientBuilder;
111114
pub struct Client<S>
112115
where S: Stream,
113116
{
114-
stream: S,
117+
pub stream: S,
115118
sender: Sender,
116119
receiver: Receiver,
117120
}
@@ -130,7 +133,6 @@ impl Client<TcpStream> {
130133
}
131134
}
132135

133-
// TODO: add net2 set_nonblocking and stuff
134136
impl<S> Client<S>
135137
where S: AsTcpStream + Stream,
136138
{
@@ -139,6 +141,31 @@ impl<S> Client<S>
139141
pub fn shutdown(&self) -> IoResult<()> {
140142
self.stream.as_tcp().shutdown(Shutdown::Both)
141143
}
144+
145+
/// See `TcpStream.peer_addr()`.
146+
pub fn peer_addr(&self) -> IoResult<SocketAddr> {
147+
self.stream.as_tcp().peer_addr()
148+
}
149+
150+
/// See `TcpStream.local_addr()`.
151+
pub fn local_addr(&self) -> IoResult<SocketAddr> {
152+
self.stream.as_tcp().local_addr()
153+
}
154+
155+
/// See `TcpStream.set_nodelay()`.
156+
pub fn set_nodelay(&mut self, nodelay: bool) -> IoResult<()> {
157+
self.stream.as_tcp().set_nodelay(nodelay)
158+
}
159+
160+
/// See `TcpStream.set_keepalive()`.
161+
pub fn set_keepalive(&mut self, delay_in_ms: Option<u32>) -> IoResult<()> {
162+
TcpStreamExt::set_keepalive_ms(self.stream.as_tcp(), delay_in_ms)
163+
}
164+
165+
/// Changes whether the stream is in nonblocking mode.
166+
pub fn set_nonblocking(&self, nonblocking: bool) -> IoResult<()> {
167+
self.stream.as_tcp().set_nonblocking(nonblocking)
168+
}
142169
}
143170

144171
impl<'u, 'p, 'e, 's, S> Client<S>
@@ -160,9 +187,9 @@ impl<'u, 'p, 'e, 's, S> Client<S>
160187
pub fn unchecked(stream: S) -> Self {
161188
Client {
162189
stream: stream,
163-
// TODO: always true?
190+
// NOTE: these are always true & false, see
191+
// https://tools.ietf.org/html/rfc6455#section-5
164192
sender: Sender::new(true),
165-
// TODO: always false?
166193
receiver: Receiver::new(false),
167194
}
168195
}
@@ -293,10 +320,10 @@ impl<S> Client<S>
293320
pub fn split(self) -> IoResult<(Reader<<S as Splittable>::Reader>, Writer<<S as Splittable>::Writer>)> {
294321
let (read, write) = try!(self.stream.split());
295322
Ok((Reader {
296-
reader: read,
323+
stream: read,
297324
receiver: self.receiver,
298325
}, Writer {
299-
writer: write,
326+
stream: write,
300327
sender: self.sender,
301328
}))
302329
}

src/receiver.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub use stream::Shutdown;
2828
pub struct Reader<R>
2929
where R: Read
3030
{
31-
pub reader: R,
31+
pub stream: R,
3232
pub receiver: Receiver,
3333
}
3434

@@ -37,27 +37,27 @@ impl<R> Reader<R>
3737
{
3838
/// Reads a single data frame from the remote endpoint.
3939
pub fn recv_dataframe(&mut self) -> WebSocketResult<DataFrame> {
40-
self.receiver.recv_dataframe(&mut self.reader)
40+
self.receiver.recv_dataframe(&mut self.stream)
4141
}
4242

4343
/// Returns an iterator over incoming data frames.
4444
pub fn incoming_dataframes<'a>(&'a mut self) -> DataFrameIterator<'a, Receiver, R> {
45-
self.receiver.incoming_dataframes(&mut self.reader)
45+
self.receiver.incoming_dataframes(&mut self.stream)
4646
}
4747

4848
/// Reads a single message from this receiver.
4949
pub fn recv_message<'m, M, I>(&mut self) -> WebSocketResult<M>
5050
where M: ws::Message<'m, DataFrame, DataFrameIterator = I>,
5151
I: Iterator<Item = DataFrame>
5252
{
53-
self.receiver.recv_message(&mut self.reader)
53+
self.receiver.recv_message(&mut self.stream)
5454
}
5555

5656
pub fn incoming_messages<'a, M, D>(&'a mut self) -> MessageIterator<'a, Receiver, D, M, R>
5757
where M: ws::Message<'a, D>,
5858
D: DataFrameable
5959
{
60-
self.receiver.incoming_messages(&mut self.reader)
60+
self.receiver.incoming_messages(&mut self.stream)
6161
}
6262
}
6363

@@ -67,13 +67,13 @@ impl<S> Reader<S>
6767
/// Closes the receiver side of the connection, will cause all pending and future IO to
6868
/// return immediately with an appropriate value.
6969
pub fn shutdown(&self) -> IoResult<()> {
70-
self.reader.as_tcp().shutdown(Shutdown::Read)
70+
self.stream.as_tcp().shutdown(Shutdown::Read)
7171
}
7272

7373
/// Shuts down both Sender and Receiver, will cause all pending and future IO to
7474
/// return immediately with an appropriate value.
7575
pub fn shutdown_all(&self) -> IoResult<()> {
76-
self.reader.as_tcp().shutdown(Shutdown::Both)
76+
self.stream.as_tcp().shutdown(Shutdown::Both)
7777
}
7878
}
7979

src/sender.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use ws::sender::Sender as SenderTrait;
1010
pub use stream::Shutdown;
1111

1212
pub struct Writer<W> {
13-
pub writer: W,
13+
pub stream: W,
1414
pub sender: Sender,
1515
}
1616

@@ -22,15 +22,15 @@ impl<W> Writer<W>
2222
where D: DataFrame,
2323
W: Write,
2424
{
25-
self.sender.send_dataframe(&mut self.writer, dataframe)
25+
self.sender.send_dataframe(&mut self.stream, dataframe)
2626
}
2727

2828
/// Sends a single message to the remote endpoint.
2929
pub fn send_message<'m, M, D>(&mut self, message: &'m M) -> WebSocketResult<()>
3030
where M: ws::Message<'m, D>,
3131
D: DataFrame
3232
{
33-
self.sender.send_message(&mut self.writer, message)
33+
self.sender.send_message(&mut self.stream, message)
3434
}
3535
}
3636

@@ -40,13 +40,13 @@ impl<S> Writer<S>
4040
/// Closes the sender side of the connection, will cause all pending and future IO to
4141
/// return immediately with an appropriate value.
4242
pub fn shutdown(&self) -> IoResult<()> {
43-
self.writer.as_tcp().shutdown(Shutdown::Write)
43+
self.stream.as_tcp().shutdown(Shutdown::Write)
4444
}
4545

4646
/// Shuts down both Sender and Receiver, will cause all pending and future IO to
4747
/// return immediately with an appropriate value.
4848
pub fn shutdown_all(&self) -> IoResult<()> {
49-
self.writer.as_tcp().shutdown(Shutdown::Both)
49+
self.stream.as_tcp().shutdown(Shutdown::Both)
5050
}
5151
}
5252

src/server/upgrade/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ impl<S> WsUpgrade<S>
8181
ConnectionOption::ConnectionHeader(UniCase("Upgrade".to_string()))
8282
]));
8383
headers.set(Upgrade(vec![
84-
// TODO: really not set a version for this?
8584
Protocol::new(ProtocolName::WebSocket, None)
8685
]));
8786

0 commit comments

Comments
 (0)