private static string PeelOutGistHtmlUrl(FluentHttpAsyncResult response) { response.Response.SaveStream.Seek(0, SeekOrigin.Begin); var gistJson = FluentHttpRequest.ToString(response.Response.SaveStream); dynamic gist = JObject.Parse(gistJson); return((string)gist.html_url); }
private object ProcessExchangeCodeForAccessTokenResponse(FluentHttpAsyncResult asyncResult, MemoryStream responseStream, out Exception exception) { // don't throw exception in this method but send it as an out parameter. // we can reuse this method for async methods too. // so the caller of this method decides whether to throw or not. exception = asyncResult.Exception; // FluentHttpRequest has ended. if (exception != null) { if (responseStream != null) responseStream.Dispose(); return null; } var response = asyncResult.Response; if (asyncResult.IsCancelled) { exception = new NotImplementedException(); return null; } else { // async request completed // convert the response stream to string. responseStream.Seek(0, SeekOrigin.Begin); var responseString = FluentHttpRequest.ToString(responseStream); // we got the response string already, so dispose the memory stream. responseStream.Dispose(); if (response.HttpWebResponse.StatusCode == HttpStatusCode.OK) { var returnValue = GithubApi.ParseUrlQueryString(responseString); if (returnValue.ContainsKey("error")) { // Github api responded with an error. exception = new GithubApiException(returnValue["error"].ToString()); return null; } return returnValue; } else { throw new NotImplementedException(); } } }
internal virtual object ProcessResponse(GithubApiVersion version, FluentHttpAsyncResult asyncResult, Stream responseStream, Type resultType, out Exception exception) { // FluentHttpRequest has ended. // don't throw exception in this method but send it as an out parameter. // we can reuse this method for async methods too. // so the caller of this method decides whether to throw or not. exception = asyncResult.Exception; if (exception != null) { if (responseStream != null) responseStream.Dispose(); return null; } if (asyncResult.IsCancelled) { exception = new NotImplementedException(); return null; } var response = asyncResult.Response; // async request completed if (response.HttpWebResponse.StatusCode == HttpStatusCode.BadGateway) { if (responseStream != null) responseStream.Dispose(); exception = asyncResult.InnerException; return null; } var httpWebRequestHeaders = response.HttpWebResponse.Headers; var headers = new SimpleJson.JsonObject(); foreach (var headerKey in httpWebRequestHeaders.AllKeys) headers.Add(headerKey, httpWebRequestHeaders[headerKey]); var result = new SimpleJson.JsonObject { {"code", (int) response.HttpWebResponse.StatusCode}, {"headers", headers} }; if (response.Request.GetMethod().Equals("HEAD", StringComparison.OrdinalIgnoreCase)) { return result; } // convert the response stream to string. responseStream.Seek(0, SeekOrigin.Begin); switch (response.HttpWebResponse.StatusCode) { case HttpStatusCode.Created: case HttpStatusCode.OK: try { if (headers.ContainsKey("X-GitHub-Blob-Sha")) { // responseStream is a binary data // responseStream is always memory stream var ms = (MemoryStream)responseStream; var data = ms.ToArray(); ms.Dispose(); result["body"] = data; } else { // responseStream is a string. var responseString = FluentHttpRequest.ToString(responseStream); // we got the response string already, so dispose the memory stream. responseStream.Dispose(); result["body"] = (resultType == null) ? JsonSerializer.Current.DeserializeObject(responseString) : JsonSerializer.Current.DeserializeObject(responseString, resultType); } return result; } catch (Exception ex) { exception = ex; return null; } case HttpStatusCode.NoContent: responseStream.Dispose(); return result; default: { var responseString = FluentHttpRequest.ToString(responseStream); responseStream.Dispose(); // Github api responded with an error. object json; exception = ExceptionFactory.GetException(responseString, version, response, out json); result["body"] = json; return result; } } }