Преглед изворни кода

Fix crash when profile doesn't exist

Zed пре 7 година
родитељ
комит
06a54a5c32
3 измењених фајлова са 16 додато и 12 уклоњено
  1. 1 1
      public/style.css
  2. 6 0
      src/api.nim
  3. 9 11
      src/cache.nim

+ 1 - 1
public/style.css

@@ -539,7 +539,7 @@ nav {
     box-sizing: border-box;
     display: flex;
     margin: 0;
-    padding: 0;
+    padding: 0 2px;
     width: 100%;
 }
 

+ 6 - 0
src/api.nim

@@ -118,6 +118,9 @@ proc getProfileFallback(username: string; headers: HttpHeaders): Future[Profile]
     url = base / profileIntentUrl ? {"screen_name": username}
     html = await fetchHtml(url, headers)
 
+  if html.isNil:
+    return Profile()
+
   result = parseIntentProfile(html)
 
 proc getProfile*(username: string): Future[Profile] {.async.} =
@@ -139,6 +142,9 @@ proc getProfile*(username: string): Future[Profile] {.async.} =
     url = base / profilePopupUrl ? params
     html = await fetchHtml(url, headers, jsonKey="html")
 
+  if html.isNil:
+    return Profile()
+
   if not html.querySelector(".ProfileCard-sensitiveWarningContainer").isNil:
     return await getProfileFallback(username, headers)
 

+ 9 - 11
src/cache.nim

@@ -16,15 +16,13 @@ proc getCachedProfile*(username: string; force=false): Future[Profile] {.async.}
   withDb:
     try:
       result.getOne("username = ?", username)
-      doAssert(not result.outdated())
-    except:
-      if result.id == 0:
-        result = await getProfile(username)
+      doAssert not result.outdated()
+    except AssertionError:
+      var profile = await getProfile(username)
+      profile.id = result.id
+      result = profile
+      result.update()
+    except KeyError:
+      result = await getProfile(username)
+      if result.username.len > 0:
         result.insert()
-      elif result.outdated():
-        let
-          profile = await getProfile(username)
-          oldId = result.id
-        result = profile
-        result.id = oldId
-        result.update()