diff --git a/src/app/browser/window/tab/item/client/driver/gemini.rs b/src/app/browser/window/tab/item/client/driver/gemini.rs index 2e6b563b..f421485b 100644 --- a/src/app/browser/window/tab/item/client/driver/gemini.rs +++ b/src/app/browser/window/tab/item/client/driver/gemini.rs @@ -162,7 +162,7 @@ fn handle( this.client .socket - .set_proxy_resolver(this.page.profile.proxy.matches(&url).as_ref()); + .set_proxy_resolver(this.page.navigation.request.proxy_resolver().as_ref()); this.client.request_async( request, diff --git a/src/app/browser/window/tab/item/client/driver/nex.rs b/src/app/browser/window/tab/item/client/driver/nex.rs index b709e24f..6517fafa 100644 --- a/src/app/browser/window/tab/item/client/driver/nex.rs +++ b/src/app/browser/window/tab/item/client/driver/nex.rs @@ -69,7 +69,7 @@ impl Nex { } let socket = SocketClient::new(); - socket.set_proxy_resolver(self.page.profile.proxy.matches(&url).as_ref()); + socket.set_proxy_resolver(self.page.navigation.request.proxy_resolver().as_ref()); socket.set_protocol(SocketProtocol::Tcp); socket.set_timeout(30); // @TODO optional diff --git a/src/app/browser/window/tab/item/page/navigation/request.rs b/src/app/browser/window/tab/item/page/navigation/request.rs index 2e5b1fb5..feb31715 100644 --- a/src/app/browser/window/tab/item/page/navigation/request.rs +++ b/src/app/browser/window/tab/item/page/navigation/request.rs @@ -10,7 +10,7 @@ use adw::{AlertDialog, prelude::AdwDialogExt}; use anyhow::Result; use gtk::{ Entry, EntryIconPosition, StateFlags, - gio::Cancellable, + gio::{Cancellable, ProxyResolver}, glib::{GString, Uri, UriFlags, gformat}, prelude::{EditableExt, EntryExt, ProxyResolverExt, WidgetExt}, }; @@ -29,8 +29,9 @@ const PREFIX_SOURCE: &str = "source:"; pub struct Request { pub entry: Entry, pub info: Rc>, - suggestion: Rc, profile: Rc, + proxy_resolver: Rc>>, + suggestion: Rc, } impl Request { @@ -40,6 +41,7 @@ impl Request { pub fn build(item_action: &Rc, profile: &Rc) -> Self { // Init components let info = Rc::new(RefCell::new(Info::new())); + let proxy_resolver = Rc::new(RefCell::new(None)); // Init main widget let entry = Entry::builder() @@ -124,6 +126,7 @@ impl Request { let a = item_action.clone(); let i = info.clone(); let p = profile.clone(); + let r = proxy_resolver.clone(); let s = suggestion.clone(); move |e| { // Allocate once @@ -140,11 +143,13 @@ impl Request { } // Indicate proxy connections @TODO cancel previous operation on update match p.proxy.matches(&t) { - Some(r) => r.lookup_async(&t, Cancellable::NONE, { + Some(m) => m.clone().lookup_async(&t, Cancellable::NONE, { let e = e.clone(); - move |r| { + let r = r.clone(); + move |l| { + r.replace(Some(m)); e.set_tooltip_text(Some(&{ - match r { + match l { Ok(h) => { e.set_css_classes(&["accent"]); format!("Proxy over {}", h.join(",")) @@ -208,8 +213,9 @@ impl Request { Self { entry, info, - suggestion, profile: profile.clone(), + proxy_resolver, + suggestion, } } @@ -305,6 +311,14 @@ impl Request { self.entry.text().starts_with("file://") } + /// Get [ProxyResolver](https://docs.gtk.org/gio/iface.ProxyResolver.html) + /// which is constructed for every `Request` entry change + /// * useful on build new [SocketClient](https://docs.gtk.org/gio/class.SocketClient.html) + /// to prevent double search / construct operations + pub fn proxy_resolver(&self) -> Option { + self.proxy_resolver.borrow().clone() + } + // Tools /// Get request value with formatted `download` prefix