Skip to content

Commit 414cf15

Browse files
committed
---
yaml --- r: 38901 b: refs/heads/incoming c: 1702024 h: refs/heads/master i: 38899: e7efd33 v: v3
1 parent 326be3e commit 414cf15

File tree

2 files changed

+64
-6
lines changed

2 files changed

+64
-6
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: 3d5418789064fdb463e872a4e651af1c628a3650
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: a810c03263670238bccd64cabb12a23a46e3a278
9-
refs/heads/incoming: 9f1523793735e2d75d6c620f0cc9741b59c47f5c
9+
refs/heads/incoming: 17020244e476b5a40b0d2eb576574a0cf5543d80
1010
refs/heads/dist-snap: 22efa39382d41b084fde1719df7ae8ce5697d8c9
1111
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1212
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/incoming/src/libstd/net_tcp.rs

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@ pub fn TcpSocket(socket_data: @TcpSocketData) -> TcpSocket {
4848
*/
4949
struct TcpSocketBuf {
5050
data: @TcpBufferedSocketData,
51+
mut end_of_stream: bool,
5152
}
5253

5354
pub fn TcpSocketBuf(data: @TcpBufferedSocketData) -> TcpSocketBuf {
5455
TcpSocketBuf {
55-
data: data
56+
data: data,
57+
end_of_stream: false
5658
}
5759
}
5860

@@ -782,6 +784,7 @@ impl TcpSocketBuf: io::Reader {
782784
let err_data = read_result.get_err();
783785

784786
if err_data.err_name == ~"EOF" {
787+
self.end_of_stream = true;
785788
break;
786789
} else {
787790
debug!("ERROR sock_buf as io::reader.read err %? %?",
@@ -808,13 +811,21 @@ impl TcpSocketBuf: io::Reader {
808811
}
809812
fn read_byte() -> int {
810813
let mut bytes = ~[0];
811-
if self.read(bytes, 1u) == 0 { fail } else { bytes[0] as int }
814+
if self.read(bytes, 1u) == 0 {
815+
if self.end_of_stream {
816+
-1
817+
} else {
818+
fail
819+
}
820+
} else {
821+
bytes[0] as int
822+
}
812823
}
813824
fn unread_byte(amt: int) {
814825
self.data.buf.unshift(amt as u8);
815826
}
816827
fn eof() -> bool {
817-
false // noop
828+
self.end_of_stream
818829
}
819830
fn seek(dist: int, seek: io::SeekStyle) {
820831
log(debug, fmt!("tcp_socket_buf seek stub %? %?", dist, seek));
@@ -871,7 +882,8 @@ fn tear_down_socket_data(socket_data: @TcpSocketData) unsafe {
871882
uv::ll::close(stream_handle_ptr, tcp_socket_dtor_close_cb);
872883
};
873884
core::comm::recv(closed_po);
874-
log(debug, fmt!("about to free socket_data at %?", socket_data));
885+
//the line below will most likely crash
886+
//log(debug, fmt!("about to free socket_data at %?", socket_data));
875887
rustrt::rust_uv_current_kernel_free(stream_handle_ptr
876888
as *libc::c_void);
877889
log(debug, ~"exiting dtor for tcp_socket");
@@ -1268,7 +1280,10 @@ mod test {
12681280
fn test_gl_tcp_ipv4_server_client_reader_writer() {
12691281
impl_gl_tcp_ipv4_server_client_reader_writer();
12701282
}
1271-
1283+
#[test]
1284+
fn test_tcp_socket_impl_reader_handles_eof() {
1285+
impl_tcp_socket_impl_reader_handles_eof();
1286+
}
12721287
}
12731288
#[cfg(target_arch="x86")]
12741289
mod impl32 {
@@ -1541,6 +1556,49 @@ mod test {
15411556
*/
15421557
}
15431558

1559+
fn impl_tcp_socket_impl_reader_handles_eof() {
1560+
use io::{Reader,ReaderUtil};
1561+
let hl_loop = uv::global_loop::get();
1562+
let server_ip = ~"127.0.0.1";
1563+
let server_port = 10041u;
1564+
let expected_req = ~"GET /";
1565+
let expected_resp = ~"A string\nwith multiple lines\n";
1566+
1567+
let server_result_po = core::comm::Port::<~str>();
1568+
let server_result_ch = core::comm::Chan(&server_result_po);
1569+
1570+
let cont_po = core::comm::Port::<()>();
1571+
let cont_ch = core::comm::Chan(&cont_po);
1572+
// server
1573+
do task::spawn_sched(task::ManualThreads(1u)) {
1574+
let actual_req = do comm::listen |server_ch| {
1575+
run_tcp_test_server(
1576+
server_ip,
1577+
server_port,
1578+
expected_resp,
1579+
server_ch,
1580+
cont_ch,
1581+
hl_loop)
1582+
};
1583+
server_result_ch.send(actual_req);
1584+
};
1585+
core::comm::recv(cont_po);
1586+
// client
1587+
log(debug, ~"server started, firing up client..");
1588+
let server_addr = ip::v4::parse_addr(server_ip);
1589+
let conn_result = connect(server_addr, server_port, hl_loop);
1590+
if result::is_err(&conn_result) {
1591+
assert false;
1592+
}
1593+
let sock_buf = @socket_buf(result::unwrap(move conn_result));
1594+
buf_write(sock_buf, expected_req);
1595+
1596+
let buf_reader = sock_buf as Reader;
1597+
let actual_response = str::from_bytes(buf_reader.read_whole_stream());
1598+
log(debug, fmt!("Actual response: %s", actual_response));
1599+
assert expected_resp == actual_response;
1600+
}
1601+
15441602
fn buf_write<W:io::Writer>(w: &W, val: &str) {
15451603
log(debug, fmt!("BUF_WRITE: val len %?", str::len(val)));
15461604
do str::byte_slice(val) |b_slice| {

0 commit comments

Comments
 (0)