mirror of
https://github.com/DNSCrypt/doh-server.git
synced 2025-04-04 21:47:39 +03:00
Merge pull request #26 from Dieff/master
Added some cli argument validation and ability to use hostname to specify upstream server
This commit is contained in:
commit
98d1a8c8d7
3 changed files with 41 additions and 3 deletions
|
@ -16,7 +16,7 @@ tls = ["native-tls", "tokio-tls"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
base64 = "0.10"
|
base64 = "0.10"
|
||||||
clap = "2"
|
clap = "2.33.0"
|
||||||
futures = "0.1.27"
|
futures = "0.1.27"
|
||||||
hyper = "0.12.30"
|
hyper = "0.12.30"
|
||||||
jemallocator = "0"
|
jemallocator = "0"
|
||||||
|
|
16
src/main.rs
16
src/main.rs
|
@ -14,6 +14,7 @@ use hyper::server::conn::Http;
|
||||||
use hyper::service::Service;
|
use hyper::service::Service;
|
||||||
use hyper::{Body, Method, Request, Response, StatusCode};
|
use hyper::{Body, Method, Request, Response, StatusCode};
|
||||||
use std::io;
|
use std::io;
|
||||||
|
use std::net::{SocketAddr, ToSocketAddrs};
|
||||||
|
|
||||||
#[cfg(feature = "tls")]
|
#[cfg(feature = "tls")]
|
||||||
use native_tls::{self, Identity};
|
use native_tls::{self, Identity};
|
||||||
|
@ -23,7 +24,6 @@ use std::fs::File;
|
||||||
|
|
||||||
#[cfg(feature = "tls")]
|
#[cfg(feature = "tls")]
|
||||||
use std::io::{self, Read};
|
use std::io::{self, Read};
|
||||||
use std::net::SocketAddr;
|
|
||||||
|
|
||||||
#[cfg(feature = "tls")]
|
#[cfg(feature = "tls")]
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
@ -483,6 +483,8 @@ fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_opts(inner_doh: &mut InnerDoH) {
|
fn parse_opts(inner_doh: &mut InnerDoH) {
|
||||||
|
use crate::utils::{verify_remote_server, verify_sock_addr};
|
||||||
|
|
||||||
let max_clients = MAX_CLIENTS.to_string();
|
let max_clients = MAX_CLIENTS.to_string();
|
||||||
let timeout_sec = TIMEOUT_SEC.to_string();
|
let timeout_sec = TIMEOUT_SEC.to_string();
|
||||||
let min_ttl = MIN_TTL.to_string();
|
let min_ttl = MIN_TTL.to_string();
|
||||||
|
@ -497,6 +499,7 @@ fn parse_opts(inner_doh: &mut InnerDoH) {
|
||||||
.long("listen-address")
|
.long("listen-address")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.default_value(LISTEN_ADDRESS)
|
.default_value(LISTEN_ADDRESS)
|
||||||
|
.validator(verify_sock_addr)
|
||||||
.help("Address to listen to"),
|
.help("Address to listen to"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -505,6 +508,7 @@ fn parse_opts(inner_doh: &mut InnerDoH) {
|
||||||
.long("server-address")
|
.long("server-address")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.default_value(SERVER_ADDRESS)
|
.default_value(SERVER_ADDRESS)
|
||||||
|
.validator(verify_remote_server)
|
||||||
.help("Address to connect to"),
|
.help("Address to connect to"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -513,6 +517,7 @@ fn parse_opts(inner_doh: &mut InnerDoH) {
|
||||||
.long("local-bind-address")
|
.long("local-bind-address")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.default_value(LOCAL_BIND_ADDRESS)
|
.default_value(LOCAL_BIND_ADDRESS)
|
||||||
|
.validator(verify_sock_addr)
|
||||||
.help("Address to connect from"),
|
.help("Address to connect from"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -595,7 +600,14 @@ fn parse_opts(inner_doh: &mut InnerDoH) {
|
||||||
|
|
||||||
let matches = options.get_matches();
|
let matches = options.get_matches();
|
||||||
inner_doh.listen_address = matches.value_of("listen_address").unwrap().parse().unwrap();
|
inner_doh.listen_address = matches.value_of("listen_address").unwrap().parse().unwrap();
|
||||||
inner_doh.server_address = matches.value_of("server_address").unwrap().parse().unwrap();
|
|
||||||
|
inner_doh.server_address = matches
|
||||||
|
.value_of("server_address")
|
||||||
|
.unwrap()
|
||||||
|
.to_socket_addrs()
|
||||||
|
.unwrap()
|
||||||
|
.next()
|
||||||
|
.unwrap();
|
||||||
inner_doh.local_bind_address = matches
|
inner_doh.local_bind_address = matches
|
||||||
.value_of("local_bind_address")
|
.value_of("local_bind_address")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|
26
src/utils.rs
26
src/utils.rs
|
@ -1,5 +1,31 @@
|
||||||
|
use std::net::{SocketAddr, ToSocketAddrs};
|
||||||
|
|
||||||
pub(crate) fn padding_string(input_size: usize, block_size: usize) -> String {
|
pub(crate) fn padding_string(input_size: usize, block_size: usize) -> String {
|
||||||
let block_size_ = block_size - 1;
|
let block_size_ = block_size - 1;
|
||||||
let padding_len = block_size_ - ((input_size + block_size_) & block_size_);
|
let padding_len = block_size_ - ((input_size + block_size_) & block_size_);
|
||||||
String::from_utf8(vec![b'X'; padding_len]).unwrap()
|
String::from_utf8(vec![b'X'; padding_len]).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// functions to verify the startup arguments as correct
|
||||||
|
pub(crate) fn verify_sock_addr(arg_val: String) -> Result<(), String> {
|
||||||
|
match arg_val.parse::<SocketAddr>() {
|
||||||
|
Ok(_addr) => Ok(()),
|
||||||
|
Err(_) => Err(format!(
|
||||||
|
"Could not parse \"{}\" as a valid socket address (with port).",
|
||||||
|
arg_val
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn verify_remote_server(arg_val: String) -> Result<(), String> {
|
||||||
|
match arg_val.to_socket_addrs() {
|
||||||
|
Ok(mut addr_iter) => match addr_iter.next() {
|
||||||
|
Some(_) => Ok(()),
|
||||||
|
None => Err(format!(
|
||||||
|
"Could not parse \"{}\" as a valid remote uri",
|
||||||
|
arg_val
|
||||||
|
)),
|
||||||
|
},
|
||||||
|
Err(err) => Err(format!("{}", err)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue