Synthesize GitHub avatar URL and follow redirects when fetching it

Nathan Sobo and Max Brunsfeld created

Co-Authored-By: Max Brunsfeld <maxbrunsfeld@gmail.com>

Change summary

server/src/rpc.rs | 2 +-
zed/src/http.rs   | 4 ++--
zed/src/user.rs   | 4 +++-
3 files changed, 6 insertions(+), 4 deletions(-)

Detailed changes

server/src/rpc.rs 🔗

@@ -558,8 +558,8 @@ impl Server {
             .into_iter()
             .map(|user| proto::User {
                 id: user.id.to_proto(),
+                avatar_url: format!("https://github.com/{}.png?size=128", user.github_login),
                 github_login: user.github_login,
-                avatar_url: String::new(),
             })
             .collect();
         self.peer

zed/src/http.rs 🔗

@@ -2,8 +2,8 @@ pub use anyhow::{anyhow, Result};
 use futures::future::BoxFuture;
 use std::sync::Arc;
 pub use surf::{
-    http::{Method, Request, Response as ServerResponse},
-    Response, Url,
+    http::{Method, Response as ServerResponse},
+    Request, Response, Url,
 };
 
 pub trait HttpClient: Send + Sync {

zed/src/user.rs 🔗

@@ -128,7 +128,9 @@ impl User {
 
 async fn fetch_avatar(http: &dyn HttpClient, url: &str) -> Result<Arc<ImageData>> {
     let url = Url::parse(url).with_context(|| format!("failed to parse avatar url {:?}", url))?;
-    let request = Request::new(Method::Get, url);
+    let mut request = Request::new(Method::Get, url);
+    request.middleware(surf::middleware::Redirect::default());
+
     let mut response = http
         .send(request)
         .await