+
+ # Get the requested URI, and check the HTTP response.
+ # Then convert to JSON and check for Github errors.
+ # Unlike `get_and_check`, error do not trigger an abort but
+ # are reported as `GithubError`.
+ fun get_and_parse(uri: String): nullable Serializable
+ do
+ var request = new CurlHTTPRequest(uri)
+ request.user_agent = user_agent
+ request.headers = header
+ var response = request.execute
+ if response isa CurlResponseSuccess then
+ var obj = response.body_str.parse_json
+ if obj isa JsonObject then
+ if obj.keys.has("message") and obj.keys.has("documentation_url") then
+ var title = "GithubAPIError"
+ var msg = obj["message"].as(not null).to_s
+ var err = new GithubError(msg, title)
+ err.json["requested_uri"] = uri
+ err.json["status_code"] = response.status_code
+ return err
+ end
+ end
+ return obj
+
+ else if response isa CurlResponseFailed then
+ var title = "CurlResponseFailed"
+ var msg = "Request to Github API failed"
+ var err = new GithubError(msg, title)
+ err.json["requested_uri"] = uri
+ err.json["error_code"] = response.error_code
+ err.json["response"] = response.error_msg
+ return err
+ else abort
+ end
+