1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
pub mod http;
use std::io::prelude::*;
use std::net::{SocketAddr, TcpStream};
use std::str;
use response::tcp::http::ResponderInterface;
use Config;
pub struct Dispatcher {}
impl Dispatcher {
pub fn http(
mut stream: TcpStream,
socket: SocketAddr,
config: Config,
responders: Vec<Box<ResponderInterface + Send>>,
) {
let mut temp_buffer = [0; 512];
let mut buffer: Vec<u8> = Vec::new();
println!("Received stream from {:?}", socket);
if let Ok(read_size) = stream.read(&mut temp_buffer) {
for value in temp_buffer.iter() {
if value != &0 {
buffer.push(*value);
}
if buffer.len() > config.tcp_limit {
break;
}
}
if read_size == 512 && config.tcp_limit > 512 {
loop {
match stream.read(&mut temp_buffer) {
Ok(read_size) => {
for value in temp_buffer.iter() {
if value != &0 {
buffer.push(*value);
}
}
if read_size < 512 {
break;
}
if buffer.len() > config.tcp_limit {
println!(
"Accumulated buffer {} exceeds size {}, breaking parse",
buffer.len(),
config.tcp_limit
);
break;
}
}
Err(error) => {
println!("Failed to read from TCP stream, error: {}", error);
break;
}
}
}
}
if buffer.len() > 0 {
let mut response = Vec::new();
let mut http_dispatcher = http::Dispatcher::new();
if http_dispatcher.matches(&buffer, &config, &socket) {
match http_dispatcher.respond(&buffer, &config, &socket, responders) {
Ok(http_response) => {
response = http_response;
}
Err(error) => {
println!("Got empty HTTP response! Error: {}", error);
}
}
}
if !response.is_empty() {
println!("Found non-empty HTTP response for TCP stream");
match stream.write(&response) {
Ok(_) => {
if let Err(error) = stream.flush() {
println!("Failed to flush TCP stream, error: {}", error);
}
}
Err(error) => {
println!("Failed to write TCP stream, error: {}", error);
}
}
} else {
println!(
"Found no response for TCP request {:?}",
str::from_utf8(&buffer)
);
}
} else {
println!("Found empty TCP stream!");
}
} else {
println!("Failed to read initial bytes from TCP stream");
}
}
}