示例#1
0
        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);
        }
示例#2
0
        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();
                }
            }
        }
示例#3
0
        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;
                    }
            }
        }