use std::{
io::{BufReader, prelude::*},
net::{TcpListener, TcpStream},
};
use crate::pmimetype::get_content_type;
use crate::phoenix_request::{
PRequestParam,
PResponseParam,
PhoenixRequestStream,
PhoenixRequestServer,
};
pub struct PTcpRequestStream{
stream: TcpStream
}
impl PhoenixRequestStream for PTcpRequestStream{
fn recv_request(&mut self, request: &mut PRequestParam) -> bool {
let buf_reader = BufReader::new(&self.stream);
let request_line = match buf_reader.lines().next() {
Some(buffer_next) => match buffer_next {
Ok(value) => value,
Err(err) => panic!("PTcpRequestStream::recv_request error while getting request : {}", err)
},
None => return false, };
let list_param = request_line.split(' ');
if list_param.clone().count() >= 3 {
request.set_command(&String::from(list_param.clone().next().unwrap()));
request.set_url(&String::from(list_param.clone().skip(1).next().unwrap()));
request.set_protocol(&String::from(list_param.clone().skip(2).next().unwrap()));
return true;
}
return false;
}
fn send_response(&mut self, response: &PResponseParam){
let length = response.content.len();
let response = format!("{}\n{}\r\nContent-Length: {}\r\n\r\n{}", response.status, get_content_type(&response.mimetype), length, response.content);
self.stream.write_all(response.as_bytes()).unwrap();
}
}
pub struct PTcpRequestServer{
listener: TcpListener,
}
impl PhoenixRequestServer for PTcpRequestServer {
type Stream = PTcpRequestStream;
fn new(hostname: &String, port: u16) -> Self{
let server_address = format!("{}:{}", hostname, port);
PTcpRequestServer{
listener: TcpListener::bind(&server_address).unwrap()
}
}
fn accept(&self) -> Self::Stream{
PTcpRequestStream{
stream: match self.listener.accept() {
Ok(s) => s.0, Err(error) => panic!("PTcpRequestServer::accept error : {}", error)
}
}
}
}