Skip to content

Commit bb77393

Browse files
committed
After article fixes
1 parent 405a574 commit bb77393

File tree

10 files changed

+61
-134
lines changed

10 files changed

+61
-134
lines changed

client/src/connection.rs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -31,48 +31,30 @@ impl Connection {
3131
);
3232
let mut connection = TcpStream::connect(address)?;
3333
connection.write_all(signal.to_string().as_bytes())?;
34-
let reader = io::BufReader::new(connection.try_clone()?);
34+
let reader = BufReader::new(connection.try_clone()?);
3535

3636
let mut instance = Connection {
3737
stream: connection,
3838
reader
3939
};
4040

41-
let data_from_socket = instance.read_signal(None)?;
41+
let data_from_socket = instance.read_signal()?;
4242
if data_from_socket.contains(&AuthStatus::DENIED.to_string()) {
4343
return Err(Error::new(ErrorKind::ConnectionAborted, "Access denied"));
4444
}
4545

4646
return Ok(instance)
4747
}
4848

49-
pub fn read_signal(&mut self, max_read_try: Option<u8>) -> io::Result<String> {
49+
pub fn read_signal(&mut self) -> io::Result<String> {
5050
let mut res_line = String::new();
5151
let mut headers_read = false;
52-
let mut fail_reads_count: u8 = 0;
5352
loop {
5453
let mut buf_line = String::new();
5554
match self.reader.read_line(&mut buf_line) {
56-
Err(e) => {
57-
match e.kind() {
58-
io::ErrorKind::WouldBlock => {
59-
if let Some(max_fails) = max_read_try {
60-
fail_reads_count += 1;
61-
if fail_reads_count == max_fails {
62-
return Err(Error::new(ErrorKind::ConnectionAborted, "Connection aborted"))
63-
}
64-
}
65-
continue;
66-
},
67-
_ => panic!("Got an error: {}", e),
68-
}
69-
},
70-
Ok(m) => {
71-
if m == 0 {
72-
return Err(Error::new(ErrorKind::BrokenPipe, "Connection closed"))
73-
}
74-
m
75-
},
55+
Err(e) => panic!("Got an error: {}", e),
56+
Ok(0) => return Err(Error::new(ErrorKind::BrokenPipe, "Connection closed")),
57+
Ok(_) => (),
7658
};
7759
res_line.push_str(&buf_line);
7860

client/src/service.rs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ impl Service {
5252
let mut connection = self.connection.clone();
5353
thread::spawn(move || -> io::Result<()> {
5454
loop {
55-
let data_from_socket = match connection.read_signal(None) {
55+
let data_from_socket = match connection.read_signal() {
5656
Ok(v) => v,
57-
Err(_) => {
58-
break;
59-
}
57+
Err(_) => break
6058
};
6159
let signal = SignalData::from_str(&data_from_socket);
6260
let mut messages = messages.lock();
@@ -74,13 +72,19 @@ impl Service {
7472
);
7573
}
7674
else {
77-
messages.push(format!("<{}> {}", s.username.unwrap(), s.message.unwrap()));
75+
messages.push(
76+
format!(
77+
"<{}> {}",
78+
s.username.unwrap(),
79+
s.message.unwrap()
80+
)
81+
);
7882
}
7983
}
8084
}
8185
match tx.send(()) {
8286
Ok(_) => {},
83-
Err(_) => continue
87+
Err(_) => break
8488
};
8589
}
8690

@@ -101,30 +105,24 @@ impl Service {
101105
Err(_) => break
102106
};
103107
print!("{}", termion::clear::All);
104-
for (index, m) in (&*messages.lock()).iter().enumerate() {
108+
for (index, m) in messages.lock().iter().enumerate() {
105109
if index == 0 {
106-
write!(
107-
std::io::stdout(),
108-
"\r\n{m}\r\n"
109-
)?;
110+
print!("\r\n{m}\r\n");
110111
}
111112
else {
112-
write!(
113-
std::io::stdout(),
114-
"{m}\r\n"
115-
)?;
113+
print!("{m}\r\n");
116114
}
117115
}
118116
let input = user_input.lock().clone();
119-
write!(
120-
std::io::stdout(),
117+
print!(
121118
"{}{}{} >{} {}",
122119
termion::color::Bg(termion::color::White),
123120
termion::color::Fg(termion::color::Black),
124121
username,
125122
termion::style::Reset,
126123
input
127-
)?;
124+
);
125+
128126
std::io::stdout().flush()?;
129127
}
130128
Ok(())
@@ -145,8 +143,8 @@ impl Service {
145143

146144
pub fn read_inputs(&mut self) {
147145
let stdout = io::stdout().into_raw_mode().unwrap(); // НЕЛЬЗЯ УБИРАТЬ
148-
let mut stdin = termion::async_stdin().keys();
149-
146+
let mut stdin = io::stdin().keys();
147+
150148
loop {
151149
let input = stdin.next();
152150

@@ -158,7 +156,7 @@ impl Service {
158156
if ms == "" {
159157
match self.state.chat_reload_sender.send(()) {
160158
Ok(_) => {},
161-
Err(_) => continue,
159+
Err(_) => break,
162160
};
163161
continue;
164162
}
@@ -178,15 +176,15 @@ impl Service {
178176
self.state.user_input.lock().pop();
179177
match self.state.chat_reload_sender.send(()) {
180178
Ok(_) => {},
181-
Err(_) => continue,
179+
Err(_) => break,
182180
};
183181
}
184182
termion::event::Key::Char(k) => {
185183
println!("{k}");
186184
self.state.user_input.lock().push_str(&k.to_string());
187185
match self.state.chat_reload_sender.send(()) {
188186
Ok(_) => {},
189-
Err(_) => continue,
187+
Err(_) => break,
190188
};
191189
},
192190
_ => {

client/src/state.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ use std::{
88
Arc
99
},
1010
io::{
11-
self,
12-
BufReader,
13-
BufRead,
11+
self,
1412
Write
1513
}
1614
};

server/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mod service;
1010
mod managers;
1111
mod messages_pool;
1212
mod reader;
13+
mod types;
1314

1415
fn main() -> Result<()> {
1516
let settings = Settings::new();

server/src/managers/data_manager.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ use uuid::Uuid;
99

1010
use crate::messages_pool::{PoolMessage, MessagesPool};
1111
use crate::state::UserData;
12-
13-
use super::manager::Manager;
14-
use super::stream_manager::StreamManager;
15-
use super::types::{
12+
use crate::types::{
1613
AuthStatus,
1714
SignalData,
1815
SignalHeader,
@@ -21,9 +18,12 @@ use super::types::{
2118
SignalType
2219
};
2320

21+
use super::manager::Manager;
22+
use super::stream_manager::StreamManager;
23+
2424
pub trait DataManager {
2525
fn deny_auth(&mut self) -> Result<()>;
26-
fn auth(&mut self, signal: String) -> Result<SignalType>;
26+
fn auth(&mut self, signal: String) -> Result<()>;
2727
fn remove_user(&mut self, username: String) -> Result<()>;
2828
fn process_messages_pool(&mut self, receiver: Receiver<()>) -> Result<()>;
2929
fn process_incoming_message(messages_pool: Arc<Mutex<MessagesPool>>, signal: String) -> Result<()>;
@@ -40,7 +40,7 @@ impl DataManager for Manager {
4040
Ok(())
4141
}
4242

43-
fn auth(&mut self, signal: String) -> Result<SignalType> {
43+
fn auth(&mut self, signal: String) -> Result<()> {
4444
let data = SignalData::from_str(&signal)?;
4545

4646
match data.signal_type.unwrap() {
@@ -73,7 +73,7 @@ impl DataManager for Manager {
7373
);
7474

7575
self.send_data(&response.to_string())?;
76-
Ok(data.signal_type.unwrap())
76+
Ok(())
7777
}
7878

7979
fn remove_user(&mut self, username: String) -> Result<()> {
@@ -114,7 +114,7 @@ impl DataManager for Manager {
114114
if message.from_server {
115115
syg_vec.push(SignalHeader::ServerMessage);
116116
}
117-
let response = SignalData::new(syg_vec,Some(&message.message));
117+
let response = SignalData::new(syg_vec, Some(&message.message));
118118
self.send_data(&response.to_string())?;
119119
}
120120
}

server/src/managers/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
mod manager;
22
mod stream_manager;
33
mod data_manager;
4-
pub mod types;
54

65
pub use manager::Manager;

server/src/managers/stream_manager.rs

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,15 @@ use std::{
22
io::{
33
Write, BufReader
44
},
5-
time::Duration,
65
thread,
7-
sync::{
8-
mpsc::{
9-
self,
10-
Sender
11-
}
6+
sync::mpsc::{
7+
self,
8+
Sender
129
}
1310
};
1411
use anyhow::Result;
1512

16-
use crate::{managers::{data_manager::DataManager, types::SignalType}, reader::StreamReader};
13+
use crate::{managers::data_manager::DataManager, reader::StreamReader};
1714

1815
use super::manager::Manager;
1916

@@ -26,35 +23,29 @@ pub trait StreamManager {
2623

2724
impl StreamManager for Manager {
2825
fn process_connection(&mut self) -> Result<()> {
29-
self.stream.set_read_timeout(Some(Duration::from_millis(1000)))?;
3026
println!("Connection established - {}", self.connected_peer_addr);
3127

3228
let auth_data = match BufReader::new(
3329
self.stream.try_clone()?
34-
).read_signal(Some(25)) {
30+
).read_signal() {
3531
Ok(v) => v,
3632
Err(_) => {
3733
self.process_disconnection()?;
3834
return Ok(())
3935
}
4036
};
4137

42-
let signal_type = match self.auth(auth_data.clone()) {
43-
Ok(v) => v,
44-
Err(_) => {
45-
self.deny_auth()?;
46-
self.process_disconnection()?;
47-
return Ok(())
48-
}
49-
};
50-
51-
if let SignalType::Connection = signal_type {
52-
let (channel_sender, channel_receiver) = mpsc::channel::<()>();
53-
self.process_signals(channel_sender)?;
54-
55-
self.process_messages_pool(channel_receiver)?;
38+
if self.auth(auth_data.clone()).is_err() {
39+
self.deny_auth()?;
40+
self.process_disconnection()?;
41+
return Ok(())
5642
}
5743

44+
let (channel_sender, channel_receiver) = mpsc::channel::<()>();
45+
self.process_signals(channel_sender)?;
46+
47+
self.process_messages_pool(channel_receiver)?;
48+
5849
self.process_disconnection()?;
5950
Ok(())
6051
}
@@ -79,7 +70,7 @@ impl StreamManager for Manager {
7970
thread::spawn(move || -> Result<()> {
8071
let mut reader = BufReader::new(cloned_stream.try_clone()?);
8172
loop {
82-
let data_from_socket = match reader.read_signal(None) {
73+
let data_from_socket = match reader.read_signal() {
8374
Ok(s) => s,
8475
Err(_) => {
8576
break;

server/src/messages_pool.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ impl MessagesPool {
3939

4040
pub fn push(&mut self, v: PoolMessage) {
4141
if self.length == 256 {
42-
let mut new_indexes: HashMap<String, u8> = HashMap::new();
4342
self.pool.pop_front();
4443
self.pool.push_back(v);
44+
45+
let mut new_indexes: HashMap<String, u8> = HashMap::new();
4546
for (index, message) in self.pool.iter().enumerate() {
4647
new_indexes.insert(message.id.clone(), index as u8);
4748
}

server/src/reader.rs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,21 @@
11
use std::{io::{BufReader, self, BufRead, Error, ErrorKind}, self, net::TcpStream};
22

3-
use crate::managers::types::SignalHeader;
3+
use crate::types::SignalHeader;
44

55
pub trait StreamReader {
6-
fn read_signal(&mut self, max_read_try: Option<u8>) -> io::Result<String>;
6+
fn read_signal(&mut self) -> io::Result<String>;
77
}
88

99
impl StreamReader for BufReader<TcpStream> {
10-
fn read_signal(&mut self, max_read_try: Option<u8>) -> io::Result<String> {
10+
fn read_signal(&mut self) -> io::Result<String> {
1111
let mut res_line = String::new();
1212
let mut headers_read = false;
13-
let mut fail_reads_count: u8 = 0;
1413
loop {
1514
let mut buf_line = String::new();
1615
match self.read_line(&mut buf_line) {
17-
Err(e) => {
18-
match e.kind() {
19-
io::ErrorKind::WouldBlock => {
20-
if let Some(max_fails) = max_read_try {
21-
fail_reads_count += 1;
22-
if fail_reads_count == max_fails {
23-
return Err(Error::new(ErrorKind::ConnectionAborted, "boom boom"))
24-
}
25-
}
26-
continue;
27-
},
28-
_ => return Err(Error::new(ErrorKind::ConnectionAborted, "boom boom"))
29-
}
30-
},
31-
Ok(m) => {
32-
if m == 0 {
33-
return Err(Error::new(ErrorKind::BrokenPipe, "boom boom"))
34-
}
35-
m
36-
},
16+
Err(_) => return Err(Error::new(ErrorKind::ConnectionAborted, "boom boom")),
17+
Ok(0) => return Err(Error::new(ErrorKind::BrokenPipe, "boom boom")),
18+
Ok(m) => m,
3719
};
3820
res_line.push_str(&buf_line);
3921

0 commit comments

Comments
 (0)