use query and fragment as the request part for the nex protocol; this [unspecified] change allows access to files that contain ? or # characters in their names

This commit is contained in:
yggverse 2025-09-10 01:23:22 +03:00
parent 5c42a532dd
commit 97d941cf82

View file

@ -2,15 +2,18 @@
use super::{Feature, Page}; use super::{Feature, Page};
use crate::tool::{Format, uri_to_title}; use crate::tool::{Format, uri_to_title};
use gtk::gio::{MemoryInputStream, SocketConnection};
use gtk::prelude::{
Cast, EditableExt, IOStreamExt, InputStreamExtManual, OutputStreamExtManual, SocketClientExt,
};
use gtk::{ use gtk::{
gdk::Texture, gdk::Texture,
gdk_pixbuf::Pixbuf, gdk_pixbuf::Pixbuf,
gio::{Cancellable, IOStream, SocketClient, SocketClientEvent, SocketProtocol}, gio::{
Cancellable, IOStream, MemoryInputStream, SocketClient, SocketClientEvent,
SocketConnection, SocketProtocol,
},
glib::{Priority, Uri}, glib::{Priority, Uri},
prelude::{
Cast, EditableExt, IOStreamExt, InputStreamExtManual, OutputStreamExtManual,
SocketClientExt,
},
}; };
use sourceview::prelude::FileExt; use sourceview::prelude::FileExt;
use std::{ use std::{
@ -43,11 +46,19 @@ impl Nex {
.set_request(Some(uri.to_string())); .set_request(Some(uri.to_string()));
} }
// copy once let request = format!(
let path = uri.path(); "{}{}{}",
uri.path(),
// @TODO
// unspecified request part implementation:
// gemini://bbs.geminispace.org/s/nex/32478
uri.query().map(|q| format!("?{q}")).unwrap_or_default(),
uri.fragment().map(|f| format!("#{f}")).unwrap_or_default()
);
let url = uri.to_string(); let url = uri.to_string();
if path.is_empty() { if request.is_empty() {
// auto-append trailing slash to the root locations // auto-append trailing slash to the root locations
let mut r = uri.to_string(); let mut r = uri.to_string();
r.push('/'); r.push('/');
@ -135,7 +146,7 @@ impl Nex {
// panic as unexpected. // panic as unexpected.
} }
c.output_stream().write_all_async( c.output_stream().write_all_async(
format!("{path}\r\n"), format!("{request}\r\n"),
Priority::DEFAULT, Priority::DEFAULT,
Some(&cancellable.clone()), Some(&cancellable.clone()),
move |r| match r { move |r| match r {
@ -147,9 +158,9 @@ impl Nex {
} }
// Navigate to the download gateway on content type is not supported // Navigate to the download gateway on content type is not supported
if !is_renderable(&path) { if !is_renderable(&request) {
p.content p.content
.to_status_mime(&path, Some((&p.item_action, &uri))); .to_status_mime(&request, Some((&p.item_action, &uri)));
p.set_progress(0.0); p.set_progress(0.0);
c.close_async(Priority::DEFAULT, Some(&cancellable), { c.close_async(Priority::DEFAULT, Some(&cancellable), {
let p = p.clone(); let p = p.clone();