@@ -48,11 +48,13 @@ pub fn TcpSocket(socket_data: @TcpSocketData) -> TcpSocket {
48
48
*/
49
49
struct TcpSocketBuf {
50
50
data : @TcpBufferedSocketData ,
51
+ mut end_of_stream : bool ,
51
52
}
52
53
53
54
pub fn TcpSocketBuf ( data : @TcpBufferedSocketData ) -> TcpSocketBuf {
54
55
TcpSocketBuf {
55
- data : data
56
+ data : data,
57
+ end_of_stream : false
56
58
}
57
59
}
58
60
@@ -782,6 +784,7 @@ impl TcpSocketBuf: io::Reader {
782
784
let err_data = read_result. get_err ( ) ;
783
785
784
786
if err_data. err_name == ~"EOF " {
787
+ self . end_of_stream = true ;
785
788
break ;
786
789
} else {
787
790
debug ! ( "ERROR sock_buf as io::reader.read err %? %?" ,
@@ -808,13 +811,21 @@ impl TcpSocketBuf: io::Reader {
808
811
}
809
812
fn read_byte ( ) -> int {
810
813
let mut bytes = ~[ 0 ] ;
811
- if self . read ( bytes, 1 u) == 0 { fail } else { bytes[ 0 ] as int }
814
+ if self . read ( bytes, 1 u) == 0 {
815
+ if self . end_of_stream {
816
+ -1
817
+ } else {
818
+ fail
819
+ }
820
+ } else {
821
+ bytes[ 0 ] as int
822
+ }
812
823
}
813
824
fn unread_byte ( amt : int ) {
814
825
self . data . buf . unshift ( amt as u8 ) ;
815
826
}
816
827
fn eof ( ) -> bool {
817
- false // noop
828
+ self . end_of_stream
818
829
}
819
830
fn seek ( dist : int , seek : io:: SeekStyle ) {
820
831
log ( debug, fmt ! ( "tcp_socket_buf seek stub %? %?" , dist, seek) ) ;
@@ -871,7 +882,8 @@ fn tear_down_socket_data(socket_data: @TcpSocketData) unsafe {
871
882
uv:: ll:: close ( stream_handle_ptr, tcp_socket_dtor_close_cb) ;
872
883
} ;
873
884
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));
875
887
rustrt:: rust_uv_current_kernel_free ( stream_handle_ptr
876
888
as * libc:: c_void ) ;
877
889
log ( debug, ~"exiting dtor for tcp_socket") ;
@@ -1268,7 +1280,10 @@ mod test {
1268
1280
fn test_gl_tcp_ipv4_server_client_reader_writer ( ) {
1269
1281
impl_gl_tcp_ipv4_server_client_reader_writer ( ) ;
1270
1282
}
1271
-
1283
+ #[ test]
1284
+ fn test_tcp_socket_impl_reader_handles_eof ( ) {
1285
+ impl_tcp_socket_impl_reader_handles_eof ( ) ;
1286
+ }
1272
1287
}
1273
1288
#[ cfg( target_arch="x86" ) ]
1274
1289
mod impl32 {
@@ -1541,6 +1556,49 @@ mod test {
1541
1556
*/
1542
1557
}
1543
1558
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 = 10041 u;
1564
+ let expected_req = ~"GET /";
1565
+ let expected_resp = ~"A string\n with 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 ( 1 u) ) {
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
+
1544
1602
fn buf_write < W : io:: Writer > ( w : & W , val : & str ) {
1545
1603
log ( debug, fmt ! ( "BUF_WRITE: val len %?" , str :: len( val) ) ) ;
1546
1604
do str:: byte_slice ( val) |b_slice| {
0 commit comments