From 89df20d582f8e0a0e9f1f809b2edc944d85a32ad Mon Sep 17 00:00:00 2001 From: Xander Bil Date: Sat, 9 Mar 2024 22:54:39 +0100 Subject: [PATCH] add record into database using api --- Cargo.lock | 346 +++++++++++++---------------------------------- Cargo.toml | 8 +- src/api.rs | 112 ++++++++++++++- src/db/models.rs | 51 ++++++- src/resolver.rs | 48 +------ src/structs.rs | 11 +- 6 files changed, 268 insertions(+), 308 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 87d63a4..a72f489 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,12 +17,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - [[package]] name = "backtrace" version = "0.3.69" @@ -38,12 +32,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bytes" version = "1.5.0" @@ -112,12 +100,6 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - [[package]] name = "fnv" version = "1.0.7" @@ -139,12 +121,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - [[package]] name = "futures-task" version = "0.3.30" @@ -169,36 +145,11 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" -[[package]] -name = "h2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "http" @@ -255,7 +206,6 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2", "http", "http-body", "httparse", @@ -264,7 +214,6 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", - "want", ] [[package]] @@ -274,7 +223,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" dependencies = [ "bytes", - "futures-channel", "futures-util", "http", "http-body", @@ -282,19 +230,6 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "indexmap" -version = "2.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" -dependencies = [ - "equivalent", - "hashbrown", ] [[package]] @@ -319,22 +254,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - [[package]] name = "memchr" version = "2.7.1" @@ -352,13 +271,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -386,55 +305,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "pin-project-lite" version = "0.2.13" @@ -477,15 +347,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -493,10 +354,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] -name = "scopeguard" -version = "1.2.0" +name = "ryu" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "serde" @@ -519,21 +380,14 @@ dependencies = [ ] [[package]] -name = "signal-hook-registry" -version = "1.4.1" +name = "serde_json" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ - "libc", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", + "itoa", + "ryu", + "serde", ] [[package]] @@ -544,12 +398,12 @@ checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -601,16 +455,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", - "bytes", "libc", "mio", "num_cpus", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -624,74 +475,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "unicode-ident" version = "1.0.12" @@ -704,15 +487,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -725,7 +499,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", ] [[package]] @@ -734,13 +517,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -749,42 +547,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + [[package]] name = "zeusns" version = "0.1.0" @@ -794,5 +634,7 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", + "serde", + "serde_json", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index 34c52a7..65d1f23 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,9 @@ edition = "2021" [dependencies] diesel = { version = "2.1.4", features = ["sqlite"] } dotenvy = "0.15" -tokio = {version = "1.36.0", features = ["full"]} -hyper = {version = "1.2.0", features = ["full"]} -hyper-util = { version = "0.1", features = ["full"] } +tokio = {version = "1.36.0", features = ["macros","rt-multi-thread"], default-features = false} +hyper = {version = "1.2.0", features = ["server", "http1"], default-features = false} +hyper-util = { version = "0.1", features = ["server","http1", "tokio"], default-features = false} http-body-util = "0.1" +serde_json = {version="^1.0", default-features = false, features=["std"]} +serde = {version="^1.0", features = ["derive"]} diff --git a/src/api.rs b/src/api.rs index b78ffca..f974638 100644 --- a/src/api.rs +++ b/src/api.rs @@ -1,3 +1,113 @@ use std::net::SocketAddr; -pub async fn api_listener_loop(addr: SocketAddr) {} +use http_body_util::{BodyExt, Full}; +use hyper::body::{Buf, Bytes}; +use hyper::server::conn::http1; +use hyper::service::service_fn; +use hyper::{header, Method, Request, Response, StatusCode}; +use hyper_util::rt::TokioIo; +use serde::Deserialize; +use tokio::net::TcpListener; + +use crate::db::models::insert_into_database; +use crate::structs::{Class, Type, RR}; + +type GenericError = Box; +type Result = std::result::Result; +type BoxBody = http_body_util::combinators::BoxBody; + +static INTERNAL_SERVER_ERROR: &[u8] = b"Internal Server Error"; +static NOTFOUND: &[u8] = b"Not Found"; + +#[derive(Deserialize)] +struct Record { + name: Vec, + #[serde(rename = "type")] + _type: Type, + ttl: i32, + data: String, +} + +async fn api_post_response(req: Request) -> Result> { + let whole_body = req.collect().await?.aggregate(); + + match serde_json::from_reader::<_, Record>(whole_body.reader()) { + Ok(record) => { + match insert_into_database(RR { + name: record.name, + _type: record._type, + class: Class::IN, + ttl: record.ttl, + rdlength: record.data.as_bytes().len() as u16, + rdata: record.data.as_bytes().to_vec(), + }) + .await + { + Ok(_) => Ok(Response::builder() + .status(StatusCode::OK) + .body(full("Successfully Created"))?), + Err(e) => { + eprintln!("{}", e.to_string()); + Ok(Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(full(INTERNAL_SERVER_ERROR))?) + } + } + } + Err(e) => Ok(Response::builder() + .status(StatusCode::FORBIDDEN) + .body(full(e.to_string()))?), + } +} + +async fn api_get_response() -> Result> { + let data = vec!["foo", "bar"]; + let res = match serde_json::to_string(&data) { + Ok(json) => Response::builder() + .header(header::CONTENT_TYPE, "application/json") + .body(full(json)) + .unwrap(), + Err(_) => Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(full(INTERNAL_SERVER_ERROR)) + .unwrap(), + }; + Ok(res) +} + +async fn routes(req: Request) -> Result> { + match (req.method(), req.uri().path()) { + (&Method::POST, "/add") => api_post_response(req).await, + (&Method::GET, "/json_api") => api_get_response().await, + _ => Ok(Response::builder() + .status(StatusCode::NOT_FOUND) + .body(full(NOTFOUND)) + .unwrap()), + } +} + +fn full>(chunk: T) -> BoxBody { + Full::new(chunk.into()) + .map_err(|never| match never {}) + .boxed() +} + +pub async fn api_listener_loop( + addr: SocketAddr, +) -> Result> { + let listener = TcpListener::bind(addr).await?; + loop { + let (stream, _) = listener.accept().await?; + + let io = TokioIo::new(stream); + + tokio::task::spawn(async move { + if let Err(err) = http1::Builder::new() + .serve_connection(io, service_fn(routes)) + .await + { + println!("Error serving connection: {:?}", err); + } + }); + } +} diff --git a/src/db/models.rs b/src/db/models.rs index 80832a2..1ebb22c 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -1,6 +1,13 @@ -use self::schema::records; +use crate::{ + errors::DatabaseError, + structs::{Class, Question, Type, RR}, +}; use diesel::prelude::*; +use self::schema::records; + +use super::lib::establish_connection; + mod schema { diesel::table! { records (name, _type, class) { @@ -17,7 +24,7 @@ mod schema { #[derive(Insertable, Queryable, Selectable)] #[diesel(table_name = records)] -pub struct Record { +struct Record { pub name: String, pub _type: i32, pub class: i32, @@ -45,3 +52,43 @@ impl Record { .execute(db) } } + +pub async fn insert_into_database(rr: RR) -> Result<(), DatabaseError> { + let db_connection = &mut establish_connection(); + let record = Record { + name: rr.name.join("."), + _type: rr._type as i32, + class: rr.class as i32, + ttl: rr.ttl, + rdlength: rr.rdlength as i32, + rdata: rr.rdata, + }; + + Record::create(db_connection, record).map_err(|e| DatabaseError { + message: e.to_string(), + })?; + + Ok(()) +} + +pub async fn get_from_database(question: Question) -> Result { + let db_connection = &mut establish_connection(); + let record = Record::get( + db_connection, + question.qname.join("."), + question.qtype as i32, + question.qclass as i32, + ) + .map_err(|e| DatabaseError { + message: e.to_string(), + })?; + + Ok(RR { + name: record.name.split(".").map(str::to_string).collect(), + _type: Type::try_from(record._type as u16).map_err(|e| DatabaseError { message: e })?, + class: Class::try_from(record.class as u16).map_err(|e| DatabaseError { message: e })?, + ttl: record.ttl, + rdlength: record.rdlength as u16, + rdata: record.rdata, + }) +} diff --git a/src/resolver.rs b/src/resolver.rs index 2a8e94c..3638a0f 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -4,64 +4,22 @@ use std::sync::Arc; use tokio::net::UdpSocket; -use crate::db::{lib::establish_connection, models::Record}; -use crate::errors::DatabaseError; +use crate::db::models::get_from_database; use crate::parser::FromBytes; -use crate::structs::{Message, Question}; +use crate::structs::Message; -use crate::structs::{Class, Type, RR}; const MAX_DATAGRAM_SIZE: usize = 40_96; -async fn get_from_database(question: Question) -> Result { - let db_connection = &mut establish_connection(); - let record = Record::get( - db_connection, - question.qname.join("."), - question.qtype as i32, - question.qclass as i32, - ) - .map_err(|e| DatabaseError { - message: e.to_string(), - })?; - - Ok(RR { - name: record.name.split(".").map(str::to_string).collect(), - _type: Type::try_from(record._type as u16).map_err(|e| DatabaseError { message: e })?, - class: Class::try_from(record.class as u16).map_err(|e| DatabaseError { message: e })?, - ttl: record.ttl, - rdlength: record.rdlength as u16, - rdata: record.rdata, - }) -} - -async fn insert_into_database(rr: RR) -> Result<(), DatabaseError> { - let db_connection = &mut establish_connection(); - let record = Record { - name: rr.name.join("."), - _type: rr._type as i32, - class: rr.class as i32, - ttl: rr.ttl, - rdlength: rr.rdlength as i32, - rdata: rr.rdata, - }; - - Record::create(db_connection, record).map_err(|e| DatabaseError { - message: e.to_string(), - })?; - - Ok(()) -} - async fn create_query(message: Message) -> Message { let mut response = message.clone(); let answer = get_from_database(message.question).await; + response.header.arcount = 0; match answer { Ok(rr) => { response.header.flags |= 0b1000010110000000; response.header.ancount = 1; - response.header.arcount = 0; response.answer = Some(rr) } Err(e) => { diff --git a/src/structs.rs b/src/structs.rs index 8751164..de1852d 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -1,8 +1,9 @@ +use serde::Deserialize; + #[repr(u16)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize)] pub enum Type { A = 1, - AAAA = 28 } #[repr(u16)] @@ -14,8 +15,8 @@ pub enum Class { #[derive(Debug, Clone)] pub struct Question { pub qname: Vec, - pub qtype: Type, // NOTE: should be QTYPE, right now not really needed - pub qclass: Class, //NOTE: should be QCLASS, right now not really needed + pub qtype: Type, // NOTE: should be QTYPE, right now not really needed + pub qclass: Class, //NOTE: should be QCLASS, right now not really needed } #[derive(Debug, Clone)] @@ -47,7 +48,7 @@ pub struct RR { pub rdata: Vec, } -pub type LabelString = (Vec,usize); +pub type LabelString = (Vec, usize); #[derive(Debug)] pub struct Response {