Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

try if trust-dns-resolver works or not #190

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions examples/http_headers/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ crate-type = ["cdylib"]
[dependencies]
log = "0.4"
proxy-wasm = { path = "../../" }
trust-dns-resolver = "0.22.0"
tokio = "1.26.0"
hostname = "^0.3"

[profile.release]
lto = true
Expand Down
46 changes: 46 additions & 0 deletions examples/http_headers/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,37 @@
// See the License for the specific language governing permissions and
// limitations under the License.

use std::net::*;
use trust_dns_resolver::Resolver;
use trust_dns_resolver::config::*;

use std::{
net::*,
str::FromStr,
sync::{Arc, Mutex as StdMutex},
};

use tokio::runtime::Runtime;

use trust_dns_proto::{
op::{NoopMessageFinalizer, Query},
rr::{DNSClass, Name, RData, Record, RecordType},
xfer::{DnsExchange, DnsMultiplexer, DnsResponse},
TokioTime,
};
use trust_dns_resolver::{
caching_client::CachingClient,
config::LookupIpStrategy,
error::ResolveError,
lookup::{Lookup, LookupFuture},
lookup_ip::LookupIpFuture,
Hosts,
};
use trust_dns_server::{
authority::{Authority, Catalog},
store::in_memory::InMemoryAuthority,
};

use log::info;
use proxy_wasm::traits::*;
use proxy_wasm::types::*;
Expand Down Expand Up @@ -43,10 +74,25 @@ impl Context for HttpHeaders {}

impl HttpContext for HttpHeaders {
fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action {

let lookup = LookupFuture::lookup(
vec![Name::from_str("www.example.com.").unwrap()],
RecordType::A,
Default::default(),
CachingClient::new(0, client, false),
);

let io_loop = Runtime::new().unwrap();
let lookup = io_loop.block_on(lookup).unwrap();
Comment on lines +85 to +86
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems like a bad idea, since each worker thread (in case of Envoy) is going to be blocked on this, and DNS resolution can potentially take hundreds of milliseconds... not to mention the overhead of starting Tokio runtime per each request.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we have a meeting about this? Can we mitigate the overhead per request by cache layer?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could store the runtime in a global variable and share it across the callbacks, but I suspect that Tokio runtime couldn't make any progress without deep integration with Proxy-Wasm's callbacks.

Also, if you try to compile your example, you can see that Tokio async doesn't work in Wasm (yet):

compile_error!("Only features sync,macros,io-util,rt,time are supported on wasm.");

What are you trying to achieve? What's your end goal?

Copy link
Author

@Cindia-blue Cindia-blue Mar 10, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup... I can not compile through for that reason. I am trying to get cname chain in WASM. Could you recommend some feasible way? I saw there are some other lib besides Tokio, like RustDNS maybe others but not sure if they have similar issue. It will be nice if you can suggest

Copy link
Member

@PiotrSikora PiotrSikora Mar 14, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you interested only in the final answer or the whole CNAME chain? If the former, and you're using Envoy, then there are envoy_resolve_dns / envoy_on_resolve_dns extensions that you could call and use Envoy's built-in DNS resolver... Note that they are not exposed in the Rust SDK yet.


self.set_http_request_header("wasm-request-header-xh", lookup);

for (name, value) in &self.get_http_request_headers() {
info!("#{} -> {}: {}", self.context_id, name, value);
}



match self.get_http_request_header(":path") {
Some(path) if path == "/hello" => {
self.send_http_response(
Expand Down