add log_line to RequestHandle

There are still some problems with this, the error handling in handle_request
will have to be changed to accomodated the new log_line.
This commit is contained in:
Johann150 2021-01-24 20:31:47 +01:00 committed by Matt Brubeck
parent aa17b5bc17
commit 3353989e7e

View file

@ -9,6 +9,7 @@ use {
borrow::Cow, borrow::Cow,
error::Error, error::Error,
ffi::OsStr, ffi::OsStr,
fmt::Write,
fs::File, fs::File,
io::BufReader, io::BufReader,
net::SocketAddr, net::SocketAddr,
@ -119,19 +120,37 @@ fn check_path(s: String) -> Result<String, String> {
struct RequestHandle { struct RequestHandle {
pub stream: TlsStream<TcpStream>, pub stream: TlsStream<TcpStream>,
pub log_line: String,
} }
/// Handle a single client session (request + response). /// Handle a single client session (request + response).
async fn handle_request(stream: TcpStream) -> Result { async fn handle_request(stream: TcpStream) -> Result {
let log_line = format!(
"{} {}",
stream.local_addr().unwrap(),
if ARGS.log_ips {
stream
.peer_addr()
.expect("could not get peer address")
.to_string()
} else {
// Do not log IP address, but something else so columns still line up.
"-".into()
}
);
let stream = TLS.accept(stream).await?; let stream = TLS.accept(stream).await?;
let mut handle = RequestHandle { stream }; let mut handle = RequestHandle { stream, log_line };
match parse_request(&mut handle).await { match parse_request(&mut handle).await {
Ok(url) => send_response(url, &mut handle).await?, Ok(url) => send_response(url, &mut handle).await?,
Err((status, msg)) => send_header(&mut handle, status, msg).await?, Err((status, msg)) => send_header(&mut handle, status, msg).await?,
} }
handle.stream.shutdown().await?; handle.stream.shutdown().await?;
log::info!("{}", handle.log_line);
Ok(()) Ok(())
} }
@ -171,20 +190,9 @@ async fn parse_request(handle: &mut RequestHandle) -> std::result::Result<Url, (
buf = &mut request[len..]; buf = &mut request[len..];
} }
let request = std::str::from_utf8(&request[..len - 2]).or(Err((59, "Non-UTF-8 request")))?; let request = std::str::from_utf8(&request[..len - 2]).or(Err((59, "Non-UTF-8 request")))?;
if ARGS.log_ips {
log::info!( // log literal request (might be different from or not an actual URL)
"Got request for {:?} from {}", write!(handle.log_line, " \"{}\"", request).unwrap();
request,
handle
.stream
.get_ref()
.0
.peer_addr()
.expect("could not get peer address")
);
} else {
log::info!("Got request for {:?}", request);
}
let url = Url::parse(request).or(Err((59, "Invalid URL")))?; let url = Url::parse(request).or(Err((59, "Invalid URL")))?;
@ -293,12 +301,13 @@ async fn list_directory(handle: &mut RequestHandle, path: &Path) -> Result {
} }
async fn send_header(handle: &mut RequestHandle, status: u8, meta: &str) -> Result { async fn send_header(handle: &mut RequestHandle, status: u8, meta: &str) -> Result {
use std::fmt::Write; // add response status and response meta
let mut response = String::with_capacity(64); write!(handle.log_line, " {} \"{}\"", status, meta)?;
write!(response, "{} {}", status, meta)?;
log::info!("Responding with status {:?}", response); handle
response.push_str("\r\n"); .stream
handle.stream.write_all(response.as_bytes()).await?; .write_all(format!("{} {}\r\n", status, meta).as_bytes())
.await?;
Ok(()) Ok(())
} }