Skip to content

Commit ffcf8f9

Browse files
author
yggverse
committed
fix relative scheme resolve
1 parent 7c2051a commit ffcf8f9

File tree

3 files changed

+36
-13
lines changed

3 files changed

+36
-13
lines changed

src/line/link.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,25 @@ impl Link {
2929
// Detect address required to continue
3030
let mut unresolved_address = regex.get(1)?.to_string();
3131

32-
// Seems that [Uri resolver](https://docs.gtk.org/glib/type_func.Uri.resolve_relative.html)
33-
// does not support [protocol-relative URI](https://datatracker.ietf.org/doc/html/rfc3986#section-4.2)
34-
// resolve manually
35-
if unresolved_address.starts_with("//:") {
36-
let scheme = match base {
37-
Some(base) => base.scheme(),
32+
// Relative scheme patch
33+
// https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
34+
if let Some(p) = unresolved_address.strip_prefix("//") {
35+
let postfix = p.trim_start_matches(":");
36+
match base {
37+
Some(b) => {
38+
unresolved_address = format!(
39+
"{}://{}",
40+
b.scheme(),
41+
if postfix.is_empty() {
42+
b.host()?
43+
} else {
44+
postfix.into()
45+
}
46+
)
47+
}
3848
None => return None,
39-
};
40-
unresolved_address = unresolved_address.replace("//:", &format!("{scheme}://"));
49+
}
4150
}
42-
4351
// Convert address to the valid URI
4452
let uri = match base {
4553
// Base conversion requested
@@ -54,10 +62,7 @@ impl Link {
5462
// Try convert string to the valid URI
5563
match Uri::parse(&resolved_str, UriFlags::NONE) {
5664
Ok(resolved_uri) => {
57-
// Change external status
5865
is_external = Some(resolved_uri.scheme() != base_uri.scheme());
59-
60-
// Result
6166
resolved_uri
6267
}
6368
Err(_) => return None,

tests/integration.gmi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
=> gemini://geminiprotocol.net 1965-01-19 Gemini
99
=> /docs/gemtext.gmi 1965-01-19 Gemini
1010
=> //:geminiprotocol.net
11+
=> //geminiprotocol.net
12+
=> //
1113

1214
* Listing item 1
1315
* Listing item 2

tests/integration.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ fn gemtext() {
146146
} // #3
147147

148148
// Validate links
149-
assert_eq!(link.len(), 6);
149+
assert_eq!(link.len(), 8);
150150

151151
{
152152
let item = link.first().unwrap();
@@ -214,6 +214,22 @@ fn gemtext() {
214214
assert_eq!(item.uri.to_str(), "gemini://geminiprotocol.net");
215215
} // #6
216216

217+
{
218+
let item = link.get(6).unwrap();
219+
220+
assert_eq!(item.alt, None);
221+
assert_eq!(item.timestamp, None);
222+
assert_eq!(item.uri.to_str(), "gemini://geminiprotocol.net");
223+
} // #7
224+
225+
{
226+
let item = link.get(7).unwrap();
227+
228+
assert_eq!(item.alt, None);
229+
assert_eq!(item.timestamp, None);
230+
assert_eq!(item.uri.to_str(), "gemini://geminiprotocol.net");
231+
} // #8
232+
217233
// Validate lists
218234
assert_eq!(list.len(), 2);
219235
assert_eq!(list.first().unwrap().value, "Listing item 1");

0 commit comments

Comments
 (0)