Improve API error handling

This commit is contained in:
Zed 2021-12-28 05:41:41 +01:00
parent 6bcbe0ea9f
commit 99d3c46af5
2 changed files with 15 additions and 9 deletions

View File

@ -46,7 +46,9 @@ proc fetch*(url: Uri; oldApi=false): Future[JsonNode] {.async.} =
var resp: AsyncResponse var resp: AsyncResponse
let body = pool.use(headers): let body = pool.use(headers):
resp = await c.get($url) resp = await c.get($url)
uncompress(await resp.body) let raw = await resp.body
if raw.len == 0: ""
else: uncompress(raw)
if body.startsWith('{') or body.startsWith('['): if body.startsWith('{') or body.startsWith('['):
result = parseJson(body) result = parseJson(body)
@ -64,11 +66,13 @@ proc fetch*(url: Uri; oldApi=false): Future[JsonNode] {.async.} =
echo "fetch error: ", result.getError echo "fetch error: ", result.getError
release(token, true) release(token, true)
raise rateLimitError() raise rateLimitError()
except ZippyError as e:
echo "decompression error: ", e.msg, ", url: ", url if resp.status == $Http400:
raise newException(InternalError, "decompression failed: " & $url) raise newException(InternalError, $url)
except InternalError as e:
raise e
except Exception as e: except Exception as e:
echo "error: ", e.msg, ", token: ", token[], ", url: ", url echo "error: ", e.name, ", msg: ", e.msg, ", token: ", token[], ", url: ", url
if "length" notin e.msg and "descriptor" notin e.msg: if "length" notin e.msg and "descriptor" notin e.msg:
release(token, true) release(token, true)
raise rateLimitError() raise rateLimitError()

View File

@ -77,14 +77,16 @@ routes:
resp Http404, showError("Page not found", cfg) resp Http404, showError("Page not found", cfg)
error InternalError: error InternalError:
echo error.exc.msg echo error.exc.name, ": ", error.exc.msg
const link = a("open a GitHub issue", href = issuesUrl) const link = a("open a GitHub issue", href = issuesUrl)
resp Http500, showError(&"An error occurred, please {link} with the URL you tried to visit.", cfg) resp Http500, showError(
&"An error occurred, please {link} with the URL you tried to visit.", cfg)
error RateLimitError: error RateLimitError:
echo error.exc.msg echo error.exc.name, ": ", error.exc.msg
const link = a("another instance", href = instancesUrl) const link = a("another instance", href = instancesUrl)
resp Http429, showError(&"Instance has been rate limited.<br>Use {link} or try again later.", cfg) resp Http429, showError(
&"Instance has been rate limited.<br>Use {link} or try again later.", cfg)
extend unsupported, "" extend unsupported, ""
extend preferences, "" extend preferences, ""