Exemplo n.º 1
0
 /// <summary>
 /// Makes a 'PUT' request to the server
 /// </summary>
 private async Task <GitHubResponse <T> > Put <T>(GitHubRequest gitHubRequest) where T : new()
 {
     using (var request = CreatePutRequest(gitHubRequest))
     {
         using (var response = await ExecuteRequest(request).ConfigureAwait(false))
         {
             return(await ParseResponse <T>(response).ConfigureAwait(false));
         }
     }
 }
Exemplo n.º 2
0
 private async Task <GitHubResponse> Patch(GitHubRequest gitHubRequest)
 {
     using (var request = CreatePatchRequest(gitHubRequest))
     {
         using (var response = await ExecuteRequest(request).ConfigureAwait(false))
         {
             return(await ParseResponse(response).ConfigureAwait(false));
         }
     }
 }
Exemplo n.º 3
0
 /// <summary>
 /// Makes a 'DELETE' request to the server
 /// </summary>
 private async Task <GitHubResponse> Delete(GitHubRequest request)
 {
     using (var r = new HttpRequestMessage(HttpMethod.Delete, request.Url))
     {
         using (var response = await ExecuteRequest(r).ConfigureAwait(false))
         {
             return(await ParseResponse(response).ConfigureAwait(false));
         }
     }
 }
Exemplo n.º 4
0
 private static HttpRequestMessage CreatePatchRequest(GitHubRequest request)
 {
     using (var r = new HttpRequestMessage(new HttpMethod("PATCH"), request.Url))
     {
         if (request.Args != null)
         {
             var serialized = Serializer.Serialize(request.Args);
             r.Content = new StringContent(serialized, Encoding.UTF8, "application/json");
         }
         return(r);
     }
 }
Exemplo n.º 5
0
        /// <summary>
        /// Makes a 'POST' request to the server
        /// </summary>
        private async Task <GitHubResponse <T> > Post <T>(GitHubRequest request) where T : new()
        {
            using (var r = new HttpRequestMessage(HttpMethod.Post, request.Url))
            {
                if (request.Args != null)
                {
                    var serialized = Serializer.Serialize(request.Args);
                    r.Content = new StringContent(serialized, Encoding.UTF8, "application/json");
                }

                using (var response = await ExecuteRequest(r).ConfigureAwait(false))
                {
                    return(await ParseResponse <T>(response).ConfigureAwait(false));
                }
            }
        }
Exemplo n.º 6
0
        private static HttpRequestMessage CreatePutRequest(GitHubRequest request)
        {
            var r = new HttpRequestMessage(HttpMethod.Put, request.Url);

            if (request.Args != null)
            {
                var serialized = Serializer.Serialize(request.Args);
                r.Content = new StringContent(serialized, Encoding.UTF8, "application/json");
            }
            else
            {
                r.Content = new StringContent("");
                r.Content.Headers.ContentLength = 0;
            }
            return(r);
        }
Exemplo n.º 7
0
        public Task <GitHubResponse> ExecuteAsync(GitHubRequest request)
        {
            switch (request.RequestMethod)
            {
            case RequestMethod.DELETE:
                return(Delete(request));

            case RequestMethod.PUT:
                return(Put(request));

            case RequestMethod.PATCH:
                return(Patch(request));

            default:
                return(null);
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// Request an access token
        /// </summary>
        public static async Task <AccessTokenModel> RequestAccessToken(string clientId, string clientSecret, string code, string redirectUri, string domainUri = AccessTokenUri)
        {
            if (string.IsNullOrEmpty(domainUri))
            {
                domainUri = AccessTokenUri;
            }

            if (!domainUri.EndsWith("/", StringComparison.Ordinal))
            {
                domainUri += "/";
            }
            domainUri += "login/oauth/access_token";

            var c        = new Client();
            var request  = GitHubRequest.Post <AccessTokenModel>(domainUri, new { client_id = clientId, client_secret = clientSecret, code, redirect_uri = redirectUri });
            var response = await c.ExecuteAsync(request).ConfigureAwait(false);

            return(response.Data);
        }
Exemplo n.º 9
0
        /// <summary>
        /// Makes a 'GET' request to the server using a URI
        /// </summary>
        /// <typeparam name="T">The type of object the response should be deserialized ot</typeparam>
        /// <returns>An object with response data</returns>
        private async Task <GitHubResponse <T> > Get <T>(GitHubRequest githubRequest) where T : new()
        {
            var url = new StringBuilder().Append(githubRequest.Url);

            if (githubRequest.Args != null)
            {
                url.Append(ToQueryString(ObjectToDictionaryConverter.Convert(githubRequest.Args).ToArray()));
            }
            var absoluteUrl = url.ToString();

            // If there is no cache, just directly execute and parse. Nothing more
            using (var request = new HttpRequestMessage(HttpMethod.Get, absoluteUrl))
            {
                using (var requestResponse = await ExecuteRequest(request).ConfigureAwait(false))
                {
                    return(await ParseResponse <T>(requestResponse).ConfigureAwait(false));
                }
            }
        }
Exemplo n.º 10
0
        public Task <GitHubResponse <T> > ExecuteAsync <T>(GitHubRequest <T> request) where T : new()
        {
            switch (request.RequestMethod)
            {
            case RequestMethod.GET:
                return(Get <T>(request));

            case RequestMethod.POST:
                return(Post <T>(request));

            case RequestMethod.PUT:
                return(Put <T>(request));

            case RequestMethod.PATCH:
                return(Patch <T>(request));

            default:
                return(null);
            }
        }
Exemplo n.º 11
0
        private static async Task <GitHubResponse <T> > ParseResponse <T>(HttpResponseMessage response) where T : new()
        {
            var ghr = new GitHubResponse <T> {
                StatusCode = (int)response.StatusCode
            };

            foreach (var h in response.Headers)
            {
                if (h.Key.Equals("X-RateLimit-Limit"))
                {
                    ghr.RateLimitLimit = Convert.ToInt32(h.Value.First());
                }
                else if (h.Key.Equals("X-RateLimit-Remaining"))
                {
                    ghr.RateLimitRemaining = Convert.ToInt32(h.Value.First());
                }
                else if (h.Key.Equals("ETag"))
                {
                    ghr.ETag = h.Value.First().Replace("\"", "").Trim();
                }
                else if (h.Key.Equals("Link"))
                {
                    var s = h.Value.First().Split(',');
                    foreach (var link in s)
                    {
                        var splitted = link.Split(';');
                        var url      = splitted[0].Trim();
                        var what     = splitted[1].Trim();
                        what = what.Substring(5);
                        what = what.Substring(0, what.Length - 1);
                        url  = url.Substring(1);
                        url  = url.Substring(0, url.Length - 1);

                        if (what.Equals("next"))
                        {
                            ghr.More = GitHubRequest.Get <T>(url);
                        }
                    }
                }
            }

            // Booleans have a special definition in the github responses.
            // They typically represent a status code Not Found = false
            // or 204 = true and 205 (reset content)
            if (typeof(T) == typeof(bool) && (ghr.StatusCode == 204 || ghr.StatusCode == 205 || ghr.StatusCode == 404))
            {
                var b = ghr.StatusCode == 204 || ghr.StatusCode == 205;
                ghr.Data = (T)(object)(b);
                return(ghr);
            }

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            if (response.StatusCode < (HttpStatusCode)200 || response.StatusCode >= (HttpStatusCode)300)
            {
                throw StatusCodeException.FactoryCreate(response, content);
            }

            ghr.Data = Serializer.Deserialize <T>(content);

            return(ghr);
        }
Exemplo n.º 12
0
        /// <summary>
        /// Makes a 'GET' request to the server using a URI
        /// </summary>
        /// <typeparam name="T">The type of object the response should be deserialized ot</typeparam>
        /// <returns>An object with response data</returns>
        private async Task <GitHubResponse <T> > Get <T>(GitHubRequest githubRequest) where T : new()
        {
            var url = new StringBuilder().Append(githubRequest.Url);

            if (githubRequest.Args != null)
            {
                url.Append(ToQueryString(ObjectToDictionaryConverter.Convert(githubRequest.Args).ToArray()));
            }
            var absoluteUrl = url.ToString();

            // If there is no cache, just directly execute and parse. Nothing more
            if (Cache == null)
            {
                using (var request = new HttpRequestMessage(HttpMethod.Get, absoluteUrl))
                {
                    using (var requestResponse = await ExecuteRequest(request).ConfigureAwait(false))
                    {
                        return(await ParseResponse <T>(requestResponse).ConfigureAwait(false));
                    }
                }
            }

            // Attempt to get the cached response
            GitHubResponse <T> cachedResponse = null;

            if (githubRequest.RequestFromCache || githubRequest.CheckIfModified)
            {
                try
                {
                    cachedResponse = Cache.Get <GitHubResponse <T> >(absoluteUrl);
                    if (githubRequest.RequestFromCache && cachedResponse != null)
                    {
                        cachedResponse.WasCached = true;
                        return(cachedResponse);
                    }
                }
                catch
                {
                }
            }

            using (var request = new HttpRequestMessage(HttpMethod.Get, absoluteUrl))
            {
                var etag = (githubRequest.CheckIfModified && cachedResponse != null) ? cachedResponse.ETag : null;
                if (etag != null)
                {
                    request.Headers.Add("If-None-Match", string.Format("\"{0}\"", etag));
                }

                using (var response = await ExecuteRequest(request).ConfigureAwait(false))
                {
                    var parsedResponse = await ParseResponse <T>(response).ConfigureAwait(false);

                    if (githubRequest.CacheResponse)
                    {
                        Cache.Set(absoluteUrl, parsedResponse);
                    }

                    return(parsedResponse);
                }
            }
        }
Exemplo n.º 13
0
 public GitHubRequest <AuthorizationModel> Create(List <string> scopes, string note, string noteUrl, string fingerprint)
 {
     return(GitHubRequest.Post <AuthorizationModel>(Uri, new { scopes, note, note_url = noteUrl, fingerprint }));
 }
Exemplo n.º 14
0
 public GitHubRequest <AuthorizationModel> GetOrCreate(string clientId, string clientSecret, List <string> scopes, string note, string noteUrl)
 {
     return(GitHubRequest.Put <AuthorizationModel>(Uri + "/clients/" + clientId, new { client_secret = clientSecret, scopes = scopes, note = note, note_url = noteUrl }));
 }