diff --git a/src/context/context.rs b/src/context/context.rs index be8ffe7cc209f026f2a9e105e626b9c55bb29843..b594b60d63e39285925545c0f5fdbca6db00c465 100644 --- a/src/context/context.rs +++ b/src/context/context.rs @@ -133,25 +133,27 @@ impl Context { .iter().rposition(|&b| b == b'/' || b == b':') .map_or(cwd.len(), |i| i + 1)] .to_vec() - } else if path.starts_with(b"/") { - let mut canon = cwd[..cwd.iter().position(|&b| b == b':').map_or(1, |i| i + 1)].to_vec(); - canon.extend_from_slice(&path); - canon } else { - let mut canon = cwd.clone(); - if ! canon.ends_with(b"/") { - canon.push(b'/'); - } + let mut canon = if !path.starts_with(b"/") { + let mut c = cwd.clone(); + if ! c.ends_with(b"/") { + c.push(b'/'); + } + c + } else { + cwd[..cwd.iter().position(|&b| b == b':').map_or(1, |i| i + 1)].to_vec() + }; + canon.extend_from_slice(&path); // NOTE: assumes the scheme does not include anything like "../" or "./" let mut result = { - let rparts = canon.split(|&c| c == b'/') + let parts = canon.split(|&c| c == b'/') .filter(|&part| part != b".") .rev() .scan(0, |nskip, part| { if part == b".." { *nskip += 1; - Some(None) + Some(None) } else { if *nskip > 0 { *nskip -= 1; @@ -163,7 +165,7 @@ impl Context { }) .filter_map(|x| x) .collect::<Vec<_>>(); - rparts + parts .iter() .rev() .fold(Vec::new(), |mut vec, &part| { @@ -173,11 +175,12 @@ impl Context { }) }; result.pop(); // remove extra '/' + + // replace with the root of the schema if it's empty if result.len() == 0 { - // replace with the root of the schema if it's empty let pos = canon.iter() - .position(|&b| b == b':') - .map_or(canon.len(), |p| p + 1); + .position(|&b| b == b':') + .map_or(canon.len(), |p| p + 1); canon.truncate(pos); canon } else {