added protocol header checking
This commit is contained in:
parent
3b35da7cb2
commit
1ff2c2120b
72
.vscode/launch.json
vendored
Normal file
72
.vscode/launch.json
vendored
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Launch",
|
||||||
|
"program": "${workspaceFolder}/<program>",
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in library 'Uno'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--lib",
|
||||||
|
"--package=Uno"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "Uno",
|
||||||
|
"kind": "lib"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug executable 'Uno'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"--bin=Uno",
|
||||||
|
"--package=Uno"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "Uno",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "lldb",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Debug unit tests in executable 'Uno'",
|
||||||
|
"cargo": {
|
||||||
|
"args": [
|
||||||
|
"test",
|
||||||
|
"--no-run",
|
||||||
|
"--bin=Uno",
|
||||||
|
"--package=Uno"
|
||||||
|
],
|
||||||
|
"filter": {
|
||||||
|
"name": "Uno",
|
||||||
|
"kind": "bin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
pub mod tcp_server;
|
pub mod tcp_server;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
tcp_server::main();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,49 +1,55 @@
|
||||||
use std::{
|
use std::{
|
||||||
net::{TcpListener, TcpStream},
|
|
||||||
io::{ prelude::*, BufReader, BufWriter },
|
io::{ prelude::*, BufReader, BufWriter },
|
||||||
|
net::{ TcpListener, TcpStream },
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main(){
|
const PROTOCOL_ERROR_STRING: &str = "Client/Server protocol mismatch";
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
let listener = TcpListener::bind("0.0.0.0:8000").unwrap();
|
let listener = TcpListener::bind("0.0.0.0:8000").unwrap();
|
||||||
|
|
||||||
for stream in listener{
|
for stream in listener.incoming() {
|
||||||
let (reader, writer) = create_buffers(stream.unwrap());
|
let (reader, writer) = create_buffers(stream.unwrap().try_clone().unwrap());
|
||||||
let result = check_protocol(reader, writer).unwrap();
|
let result = check_protocol(reader, writer).unwrap();
|
||||||
if result.equals("Uno-Enthusiast99") {
|
if result == "Uno-Enthusiast99" {
|
||||||
println!("It works!");
|
println!("It works!");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_buffers(stream: TcpStream) -> (BufReader<TcpStream>, BufWriter<TcpStream>) {
|
||||||
|
(
|
||||||
|
BufReader::new(stream.try_clone().expect("Could not clone TcpStreams")),
|
||||||
|
BufWriter::new(stream),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
fn check_protocol(
|
||||||
fn create_buffers(&mut stream : TcpStream) -> (BufReader, BufWriter) {
|
reader: BufReader<TcpStream>,
|
||||||
(BufReader::new(stream), BufWriter::new(stream))
|
mut writer: BufWriter<TcpStream>
|
||||||
|
) -> Result<String, String> {
|
||||||
}
|
let protocol_error_string = PROTOCOL_ERROR_STRING.to_string();
|
||||||
fn check_protocol(&reader : BufReader, &writer : BufWriter) -> Result {
|
|
||||||
let init_message: Vec<_> = reader
|
let init_message: Vec<_> = reader
|
||||||
.lines()
|
.lines()
|
||||||
.map(|result| result.unwrap())
|
.map(|result| result.unwrap())
|
||||||
.take_while(|line| !line.is_empty())
|
.take_while(|line| !line.is_empty())
|
||||||
.collect()
|
.collect();
|
||||||
.iter();
|
let mut init_message = init_message.iter();
|
||||||
let mut is_valid = true;
|
let is_valid1 = init_message.next().unwrap_or_else(|| &protocol_error_string) == "app:uno";
|
||||||
is_valid = init_message.next().unwrap_or_else(|| "invalid") == "app:uno";
|
let is_valid2= init_message.next().unwrap_or_else(|| &protocol_error_string) == "version:0.1";
|
||||||
is_valid = init_message.next().unwrap(|| "invalid") == "version:0.1";
|
let player_name: &str = init_message.next().unwrap_or_else(|| &protocol_error_string);
|
||||||
is_valid = init_message.next().unwrap(|| "invalid").contains("player_name:");
|
let is_valid3 = if player_name != "invalid" && player_name.contains("player_name:") {
|
||||||
if init_message.next() != None {
|
true
|
||||||
is_valid = false;
|
} else {
|
||||||
}
|
false
|
||||||
|
};
|
||||||
if !is_valid {
|
if init_message.next() != None || !(is_valid1 && is_valid2 && is_valid3){
|
||||||
writer.write("Error").unwrap();
|
writer.write(protocol_error_string.as_bytes()).unwrap();
|
||||||
writer.flush().unwrap();
|
writer.flush().unwrap();
|
||||||
return Err;
|
return Err(protocol_error_string);
|
||||||
}
|
}
|
||||||
writer.write("Ok").unwrap();
|
writer.write("Ok".as_bytes()).unwrap();
|
||||||
writer.flush().unwrap();
|
writer.flush().unwrap();
|
||||||
Ok( item.split(':').unwrap() )
|
return Ok(player_name.split(':').collect::<Vec<_>>()[1].to_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
// fn register_player(player_name : &str, reader : BufReader, writer : BufWriter){
|
// fn register_player(player_name : &str, reader : BufReader, writer : BufWriter){
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user