예제 #1
0
 public async Task GetSingleResultViaRest(Func <string, Task> useFun)
 {
     await _endPoint.GetSingleResultViaRest(useFun).ConfigureAwait(false);
 }
예제 #2
0
        public Task <RiakRestResponse> RestRequest(IRiakEndPoint endPoint, RiakRestRequest request)
        {
            return(endPoint.GetSingleResultViaRest(async serverUrl =>
            {
                var baseUri = new StringBuilder(serverUrl).Append(request.Uri);
                if (request.QueryParams.Count > 0)
                {
                    baseUri.Append("?");
                    var first = request.QueryParams.First();
                    baseUri.Append(first.Key.UrlEncoded()).Append("=").Append(first.Value.UrlEncoded());
                    request.QueryParams.Skip(1)
                    .ForEach(
                        kv =>
                        baseUri.Append("&")
                        .Append(kv.Key.UrlEncoded())
                        .Append("=")
                        .Append(kv.Value.UrlEncoded()));
                }
                var targetUri = new Uri(baseUri.ToString());

                var req = (HttpWebRequest)WebRequest.Create(targetUri);
                req.KeepAlive = true;
                req.Method = request.Method;
                req.Credentials = CredentialCache.DefaultCredentials;

                if (!string.IsNullOrWhiteSpace(request.ContentType))
                {
                    req.ContentType = request.ContentType;
                }

                if (!request.Cache)
                {
                    req.Headers.Set(RiakConstants.Rest.HttpHeaders.DisableCacheKey,
                                    RiakConstants.Rest.HttpHeaders.DisableCacheValue);
                }

                request.Headers.ForEach(h => req.Headers.Set(h.Key, h.Value));

                if (request.Body != null && request.Body.Length > 0)
                {
                    req.ContentLength = request.Body.Length;

                    var writer = await req.GetRequestStreamAsync().ConfigureAwait(false);
                    writer.Write(request.Body, 0, request.Body.Length);
                }
                else
                {
                    req.ContentLength = 0;
                }

                try
                {
                    var response = (HttpWebResponse)await req.GetResponseAsync().ConfigureAwait(false);

                    var result = new RiakRestResponse
                    {
                        ContentLength = response.ContentLength,
                        ContentType = response.ContentType,
                        StatusCode = response.StatusCode,
                        Headers = response.Headers.AllKeys.ToDictionary(k => k, k => response.Headers[k]),
                        ContentEncoding = !string.IsNullOrWhiteSpace(response.ContentEncoding)
                            ? Encoding.GetEncoding(response.ContentEncoding)
                            : Encoding.Default
                    };

                    if (response.ContentLength > 0)
                    {
                        using (var responseStream = response.GetResponseStream())
                        {
                            if (responseStream != null)
                            {
                                using (var reader = new StreamReader(responseStream, result.ContentEncoding))
                                {
                                    result.Body = reader.ReadToEnd();
                                }
                            }
                        }
                    }

                    if (result.StatusCode != HttpStatusCode.NoContent)
                    {
                        throw new RiakException((uint)ResultCode.InvalidResponse, "Unexpected Status Code: {0} ({1})".Fmt(result.StatusCode, (int)result.StatusCode), false);
                    }

                    return result;
                }
                catch (RiakException ex)
                {
                    throw;
                }
                catch (WebException ex)
                {
                    if (ex.Status == WebExceptionStatus.ProtocolError)
                    {
                        throw new RiakException((uint)ResultCode.HttpError, ex.Message, false);
                    }

                    throw new RiakException((uint)ResultCode.HttpError, ex.Message, true);
                }
                catch (Exception ex)
                {
                    throw new RiakException((uint)ResultCode.CommunicationError, ex.Message, true);
                }
            }));
        }