Skip to content

Commit

Permalink
fix deplinks.
Browse files Browse the repository at this point in the history
  • Loading branch information
Dirbaio committed Dec 8, 2023
1 parent 03b6966 commit 80918c2
Showing 1 changed file with 46 additions and 7 deletions.
53 changes: 46 additions & 7 deletions src/bin/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,12 +149,7 @@ impl Thing {
Ok(resp)
}

async fn guess_redirect(
&self,
req: &Request<Body>,
mut krate: Option<&str>,
mut version: Option<&str>,
) -> anyhow::Result<Response<Body>> {
fn cookies(&self, req: &Request<Body>) -> HashMap<String, String> {
// Parse cookies
let mut cookies = HashMap::new();
if let Some(h) = req.headers().get("Cookie") {
Expand All @@ -164,6 +159,16 @@ impl Thing {
}
}
}
cookies
}

async fn guess_redirect(
&self,
req: &Request<Body>,
mut krate: Option<&str>,
mut version: Option<&str>,
) -> anyhow::Result<Response<Body>> {
let cookies = self.cookies(req);

// Crate
let krates = self.list_crates()?;
Expand Down Expand Up @@ -246,7 +251,33 @@ impl Thing {
let mut zup_path = vec!["flavors"];
zup_path.extend_from_slice(&path[2..]);
let mut data = match zup.read(&zup_path) {
Err(e) if e.kind() == ErrorKind::NotFound => return self.resp_404(),
Err(e) if e.kind() == ErrorKind::NotFound => {
// check if it's due to incorrect flavor.
if zup.open(&["flavors", path[3]]).is_ok() {
// if flavor exists, path is wrong, so do 404.
return self.resp_404();
} else {
// flavor doesn't exist, redirect to the default flavor.
let cookies = self.cookies(&req);

let flavors = self.list_flavors(krate, version)?;
let flavor = cookies
.get(&format!("crate-{}-flavor", krate))
.map(|s| s.as_str());
let mut flavor = flavor.unwrap_or(&flavors[0]);
if flavors.iter().find(|s| *s == flavor).is_none() {
flavor = &flavors[0];
}

return self.resp_redirect(&format!(
"/{}/{}/{}/{}",
krate,
version,
flavor,
path[3..].join("/")
));
}
}
x => x?,
}
.into_owned();
Expand Down Expand Up @@ -285,6 +316,14 @@ impl Thing {
.into();
}

if link.starts_with(b"/__DOCSERVER_DEPLINK/") {
let link_path = std::str::from_utf8(&link[21..]).unwrap();
let (krate, link_path) = link_path.split_once('/').unwrap();
let (_, link_path) = link_path.split_once('/').unwrap();

link = format!("/{krate}/git/{flavor}/{link_path}").into();
}

let mut res = Vec::new();
res.extend_from_slice(attr);
res.extend_from_slice(b"=");
Expand Down

0 comments on commit 80918c2

Please sign in to comment.