split files
This commit is contained in:
parent
99e6bce992
commit
730ae1f08d
6 changed files with 66 additions and 51 deletions
|
|
@ -29,8 +29,8 @@ pub fn parse_opts(globals: &mut Globals, backends: &mut HashMap<String, Backend>
|
||||||
backends.insert(
|
backends.insert(
|
||||||
"localhost".to_string(),
|
"localhost".to_string(),
|
||||||
Backend {
|
Backend {
|
||||||
app_name: "Google except for maps".to_string(),
|
app_name: "Localhost to Google except for maps".to_string(),
|
||||||
hostname: "google.com".to_string(),
|
hostname: "localhost".to_string(),
|
||||||
reverse_proxy: ReverseProxy {
|
reverse_proxy: ReverseProxy {
|
||||||
default_destination_uri: "https://google.com/".parse::<Uri>().unwrap(),
|
default_destination_uri: "https://google.com/".parse::<Uri>().unwrap(),
|
||||||
destination_uris: Some(map_example),
|
destination_uris: Some(map_example),
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ mod error;
|
||||||
mod globals;
|
mod globals;
|
||||||
mod log;
|
mod log;
|
||||||
mod proxy;
|
mod proxy;
|
||||||
mod proxy_tls;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::Backend, config::parse_opts, constants::*, error::*, globals::*, log::*, proxy::Proxy,
|
backend::Backend, config::parse_opts, constants::*, error::*, globals::*, log::*, proxy::Proxy,
|
||||||
|
|
|
||||||
5
src/proxy/mod.rs
Normal file
5
src/proxy/mod.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
mod proxy_handler;
|
||||||
|
mod proxy_main;
|
||||||
|
mod proxy_tls;
|
||||||
|
|
||||||
|
pub use proxy_main::Proxy;
|
||||||
48
src/proxy/proxy_handler.rs
Normal file
48
src/proxy/proxy_handler.rs
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
use crate::{backend::Backend, error::*, globals::Globals, log::*};
|
||||||
|
use futures::{
|
||||||
|
select,
|
||||||
|
task::{Context, Poll},
|
||||||
|
Future, FutureExt,
|
||||||
|
};
|
||||||
|
use hyper::{
|
||||||
|
client::connect::Connect,
|
||||||
|
http,
|
||||||
|
server::conn::Http,
|
||||||
|
service::{service_fn, Service},
|
||||||
|
Body, Client, HeaderMap, Method, Request, Response, StatusCode,
|
||||||
|
};
|
||||||
|
use std::{collections::HashMap, net::SocketAddr, pin::Pin, sync::Arc};
|
||||||
|
use tokio::{
|
||||||
|
io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt},
|
||||||
|
net::TcpListener,
|
||||||
|
runtime::Handle,
|
||||||
|
time::Duration,
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: ここでbackendの名前単位でリクエストを分岐させる
|
||||||
|
pub async fn handle_request(
|
||||||
|
req: Request<Body>,
|
||||||
|
client_ip: SocketAddr,
|
||||||
|
globals: Arc<Globals>,
|
||||||
|
) -> Result<Response<Body>, http::Error> {
|
||||||
|
// http_error(StatusCode::NOT_FOUND)
|
||||||
|
debug!("{:?}", req);
|
||||||
|
// if req.version() == hyper::Version::HTTP_11 {
|
||||||
|
// Ok(Response::new(Body::from("Hello World")))
|
||||||
|
// } else {
|
||||||
|
// Note: it's usually better to return a Response
|
||||||
|
// with an appropriate StatusCode instead of an Err.
|
||||||
|
// Err("not HTTP/1.1, abort connection")
|
||||||
|
http_error(StatusCode::NOT_FOUND)
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::unnecessary_wraps)]
|
||||||
|
fn http_error(status_code: StatusCode) -> Result<Response<Body>, http::Error> {
|
||||||
|
let response = Response::builder()
|
||||||
|
.status(status_code)
|
||||||
|
.body(Body::empty())
|
||||||
|
.unwrap();
|
||||||
|
Ok(response)
|
||||||
|
}
|
||||||
|
|
@ -1,33 +1,16 @@
|
||||||
|
use super::proxy_handler::handle_request;
|
||||||
use crate::{backend::Backend, error::*, globals::Globals, log::*};
|
use crate::{backend::Backend, error::*, globals::Globals, log::*};
|
||||||
use futures::{
|
|
||||||
select,
|
|
||||||
task::{Context, Poll},
|
|
||||||
Future, FutureExt,
|
|
||||||
};
|
|
||||||
use hyper::{
|
use hyper::{
|
||||||
client::connect::Connect,
|
client::connect::Connect, server::conn::Http, service::service_fn, Body, Client, Request,
|
||||||
http,
|
|
||||||
server::conn::Http,
|
|
||||||
service::{service_fn, Service},
|
|
||||||
Body, Client, HeaderMap, Method, Request, Response, StatusCode,
|
|
||||||
};
|
};
|
||||||
use std::{collections::HashMap, net::SocketAddr, pin::Pin, sync::Arc};
|
use std::{collections::HashMap, net::SocketAddr, sync::Arc};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt},
|
io::{AsyncRead, AsyncWrite},
|
||||||
net::TcpListener,
|
net::TcpListener,
|
||||||
runtime::Handle,
|
runtime::Handle,
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[allow(clippy::unnecessary_wraps)]
|
|
||||||
fn http_error(status_code: StatusCode) -> Result<Response<Body>, http::Error> {
|
|
||||||
let response = Response::builder()
|
|
||||||
.status(status_code)
|
|
||||||
.body(Body::empty())
|
|
||||||
.unwrap();
|
|
||||||
Ok(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct LocalExecutor {
|
pub struct LocalExecutor {
|
||||||
runtime_handle: Handle,
|
runtime_handle: Handle,
|
||||||
|
|
@ -61,25 +44,6 @@ where
|
||||||
pub globals: Arc<Globals>,
|
pub globals: Arc<Globals>,
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: ここでbackendの名前単位でリクエストを分岐させる
|
|
||||||
async fn handle_request(
|
|
||||||
req: Request<Body>,
|
|
||||||
client_ip: SocketAddr,
|
|
||||||
globals: Arc<Globals>,
|
|
||||||
) -> Result<Response<Body>, http::Error> {
|
|
||||||
// http_error(StatusCode::NOT_FOUND)
|
|
||||||
debug!("{:?}", req);
|
|
||||||
// if req.version() == hyper::Version::HTTP_11 {
|
|
||||||
// Ok(Response::new(Body::from("Hello World")))
|
|
||||||
// } else {
|
|
||||||
// Note: it's usually better to return a Response
|
|
||||||
// with an appropriate StatusCode instead of an Err.
|
|
||||||
// Err("not HTTP/1.1, abort connection")
|
|
||||||
http_error(StatusCode::NOT_FOUND)
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> Proxy<T>
|
impl<T> Proxy<T>
|
||||||
where
|
where
|
||||||
T: Connect + Clone + Sync + Send + 'static,
|
T: Connect + Clone + Sync + Send + 'static,
|
||||||
|
|
@ -1,9 +1,5 @@
|
||||||
use crate::{
|
use super::proxy_main::{LocalExecutor, Proxy};
|
||||||
constants::CERTS_WATCH_DELAY_SECS,
|
use crate::{constants::CERTS_WATCH_DELAY_SECS, error::*, log::*};
|
||||||
error::*,
|
|
||||||
log::*,
|
|
||||||
proxy::{LocalExecutor, Proxy},
|
|
||||||
};
|
|
||||||
use futures::{future::FutureExt, join, select};
|
use futures::{future::FutureExt, join, select};
|
||||||
use hyper::{client::connect::Connect, server::conn::Http};
|
use hyper::{client::connect::Connect, server::conn::Http};
|
||||||
use std::{sync::Arc, time::Duration};
|
use std::{sync::Arc, time::Duration};
|
||||||
|
|
@ -43,8 +39,11 @@ where
|
||||||
|
|
||||||
// First check SNI
|
// First check SNI
|
||||||
let rustls_acceptor = rustls::server::Acceptor::new().unwrap();
|
let rustls_acceptor = rustls::server::Acceptor::new().unwrap();
|
||||||
let acceptor = tokio_rustls::LazyConfigAcceptor::new(rustls_acceptor, raw_stream);
|
let acceptor = tokio_rustls::LazyConfigAcceptor::new(rustls_acceptor, raw_stream).await;
|
||||||
let start = acceptor.await.unwrap();
|
if acceptor.is_err() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let start = acceptor.unwrap();
|
||||||
let client_hello = start.client_hello();
|
let client_hello = start.client_hello();
|
||||||
debug!("SNI in ClientHello: {:?}", client_hello.server_name());
|
debug!("SNI in ClientHello: {:?}", client_hello.server_name());
|
||||||
// Find server config for given SNI
|
// Find server config for given SNI
|
||||||
Loading…
Add table
Add a link
Reference in a new issue