Преглед на файлове

Fix crash on invalid id and non-existent profiles

Zed преди 7 години
родител
ревизия
8000a814df
променени са 2 файла, в които са добавени 12 реда и са изтрити 7 реда
  1. 11 6
      src/api.nim
  2. 1 1
      src/nitter.nim

+ 11 - 6
src/api.nim

@@ -161,21 +161,23 @@ proc getTimeline*(username: string; after=""): Future[Timeline] {.async.} =
   })
 
   var url = timelineUrl % username
-  if after.len > 0:
-    url &= "&max_position=" & after
+  let cleanAfter = after.replace(re"[^\d]*(\d+)[^\d]*", "$1")
+  if cleanAfter.len > 0:
+    url &= "&max_position=" & cleanAfter
 
   let json = await fetchJson(base / url, headers)
   let html = parseHtml(json["items_html"].to(string))
 
   result = Timeline(
-    tweets: parseTweets(html),
-    minId: json["min_position"].to(string),
     hasMore: json["has_more_items"].to(bool),
+    maxId: json.getOrDefault("max_position").getStr(""),
+    minId: json.getOrDefault("min_position").getStr(""),
   )
 
-  if json.hasKey("max_position"):
-    result.maxId = json["max_position"].to(string)
+  if json["new_latent_count"].to(int) == 0:
+    return
 
+  result.tweets = parseTweets(html)
   await getVideos(result.tweets)
 
 proc getTweet*(id: string): Future[Conversation] {.async.} =
@@ -194,5 +196,8 @@ proc getTweet*(id: string): Future[Conversation] {.async.} =
     url = base / tweetUrl / id
     html = await fetchHtml(url, headers)
 
+  if html.isNil:
+    return
+
   result = parseConversation(html)
   await getConversationVideos(result)

+ 1 - 1
src/nitter.nim

@@ -44,7 +44,7 @@ routes:
     cond '.' notin @"name"
 
     let conversation = await getTweet(@"id")
-    if conversation.tweet.id.len == 0:
+    if conversation.isNil or conversation.tweet.id.len == 0:
       resp Http404, showError("Tweet not found")
 
     let title = pageTitle(conversation.tweet.profile)