/// <summary>
        /// Creates a specific exception derived from <see cref="AuthorizationRequiredException"/> from a response.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="response">The response.</param>
        /// <returns>The exception.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
        public static AuthorizationRequiredException CreateFromResponse(IWebApiRequest request, IWebApiResponse <ErrorObject> response)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (response == null)
            {
                throw new ArgumentNullException(nameof(response));
            }

            switch (response.Content.Message.ToLowerInvariant())
            {
            case "invalid key":
            case "invalid access token":
                return(new InvalidAccessTokenException(request, response));

            case var message when message.StartsWith("requires scope", StringComparison.InvariantCultureIgnoreCase) || message.StartsWith("requires at least one scope from", StringComparison.InvariantCultureIgnoreCase):
                return(new MissingScopesException(request, response));

            case "membership required":
                return(new MembershipRequiredException(request, response));

            case "access restricted to guild leaders":
                return(new RestrictedToGuildLeadersException(request, response));

            case "endpoint requires authentication":
            default:
                return(new AuthorizationRequiredException(request, response, AuthorizationError.RequiresAuthorization));
            }
        }
Example #2
0
        /// <inheritdoc />
        public Task <IHttpResponseStream> RequestStreamAsync(IWebApiRequest request, CancellationToken cancellationToken = default)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            return(ExecAsync());

            async Task <IHttpResponseStream> ExecAsync()
            {
                using var cancellationTimeout = new CancellationTokenSource(this.Timeout);
                using var linkedCancellation  = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, cancellationTimeout.Token);
                using var message             = new HttpRequestMessage(HttpMethod.Get, request.Options.Url);
                message.Headers.AddRange(request.Options.RequestHeaders);

                Task <HttpResponseMessage>?task = null;
                SysHttpClient?httpClient        = null;

                try
                {
                    httpClient = this.getSysHttpClient();
                    if (httpClient == null)
                    {
                        throw new InvalidOperationException("HttpClient is null");
                    }

                    task = httpClient.SendAsync(message, linkedCancellation.Token);
                    var responseMessage = await task.ConfigureAwait(false);

                    await responseMessage.Content.LoadIntoBufferAsync().ConfigureAwait(false);

                    var stream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);

                    var requestHeaders  = request.Options.RequestHeaders.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
                    var responseHeaders = responseMessage.Headers.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.First());
                    responseHeaders.AddRange(responseMessage.Content.Headers.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.First()));

                    return(new HttpResponseStream(stream, responseMessage.StatusCode, requestHeaders, responseHeaders));
                }
                catch (Exception ex)
                {
                    if (task == null)
                    {
                        throw new RequestException(request, "Failed to create task", ex);
                    }
                    else if (task.IsCanceled)
                    {
                        throw new RequestCanceledException(request);
                    }
                    throw new RequestException(request, $"Request error: {task?.Exception?.Message}", ex);
                }
                finally
                {
                    if (this.shouldDisposeHttpClient)
                    {
                        httpClient?.Dispose();
                    }
                }
            }
        }
Example #3
0
 public Function1(
     IAuthClient auth,
     IWebApiRequest apiReq
     )
 {
     _auth   = auth;
     _apiReq = apiReq;
 }
Example #4
0
        /// <inheritdoc />
        public async Task <IWebApiResponse> RequestAsync(IWebApiRequest request, CancellationToken cancellationToken = default)
        {
            using var responseStream = await this.RequestStreamAsync(request, cancellationToken).ConfigureAwait(false);

            using var streamReader = new StreamReader(responseStream.ContentStream);
            string responseText = await streamReader.ReadToEndAsync().ConfigureAwait(false);

            return(new WebApiResponse(responseText, responseStream.StatusCode, responseStream.CacheState, responseStream.ResponseHeaders));
        }
        public IEnumerator Send(IWebApiRequest apiRequest)
        {
            var request = CreateWebRequest(apiRequest);

            yield return(request.Send());

            apiRequest.OnSendComplete(
                request.GetResponseHeaders(),
                request.downloadHandler.data,
                GetError(request));
            request.Dispose();
        }
Example #6
0
        public override void OnBeforeRequestSend(IWebApiRequest request)
        {
            #if UNITY_EDITOR
            Game.Logger.LogWithBlue("[WebAPI] Request: " + request.Uri, request.Body);
            #endif

            request.Headers["Content-Type"] = "application/x-msgpack";

            if (IsAuthenticated)
            {
                request.Headers["X-Access-Token"] = accessToken;
            }
        }
Example #7
0
 public override void OnRequestError(IWebApiRequest request, WebApiError <Error> error)
 {
     #if UNITY_EDITOR
     if (error.Error != null)
     {
         Game.Logger.LogError("[WebAPI] Error: " + request.Uri, error.Error.Code + ": " + error.Error.Name, error.Error);
     }
     else
     {
         Game.Logger.LogError("[WebAPI] Error: " + request.Uri, error.RawErrorMessage);
     }
     #endif
 }
Example #8
0
        public override void OnRequestSuccess(IWebApiRequest request, IWebApiResponse response)
        {
            #if UNITY_EDITOR
            Game.Logger.LogWithGreen("[WebAPI] Response: " + request.Uri, response.Body);
            #endif

            string accessToken;
            if (response.Headers.TryGetValue("X-Set-Access-Token", out accessToken))
            {
                this.accessToken = accessToken;

                #if UNITY_EDITOR
                Game.Logger.LogWithPurple("[WebAPI] AccessToken: " + accessToken);
                #endif
            }
        }
        UnityWebRequest CreateWebRequest(IWebApiRequest apiRequest)
        {
            UnityWebRequest request;

            switch (apiRequest.Method)
            {
            case HttpMethod.Get:
            case HttpMethod.Delete:
            {
                var uri    = apiRequest.Uri + apiRequest.Body.ToQueryString();
                var method = apiRequest.Method.ToString().ToUpper();
                request = new UnityWebRequest(uri, method);
                break;
            }

            case HttpMethod.Post:
            case HttpMethod.Put:
            {
                var uri    = apiRequest.Uri.ToString();
                var method = apiRequest.Method.ToString().ToUpper();
                request = new UnityWebRequest(uri, method);
                request.uploadHandler = new UploadHandlerRaw(apiRequest.BodyBytes);
                break;
            }

            default:
            {
                throw new NotImplementedException(apiRequest.Method + " method is not implemented yet");
            }
            }

            foreach (var kvp in apiRequest.Headers)
            {
                request.SetRequestHeader(kvp.Key, kvp.Value);
            }
            request.downloadHandler = new DownloadHandlerBuffer();
            return(request);
        }
Example #10
0
        /// <summary>
        /// Creates a specific exception derived from <see cref="BadRequestException"/> from a response.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="response">The response.</param>
        /// <returns>The exception.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
        public static BadRequestException CreateFromResponse(IWebApiRequest request, IWebApiResponse <ErrorObject> response)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (response == null)
            {
                throw new ArgumentNullException(nameof(response));
            }

            switch (response.Content.Message.ToLowerInvariant())
            {
            case var message when message.StartsWith("id list too long; this endpoint is limited to", StringComparison.InvariantCultureIgnoreCase):
                return(new ListTooLongException(request, response));

            case var message when message.StartsWith("page out of range. Use page values", StringComparison.InvariantCultureIgnoreCase):
                return(new PageOutOfRangeException(request, response));

            default:
                return(new BadRequestException(request, response, BadRequestError.GenericBadRequest));
            }
        }
Example #11
0
 /// <summary>
 /// Constructs a new <see cref="MiddlewareContext"/>.
 /// </summary>
 /// <param name="connection">The connection.</param>
 /// <param name="request">The web API request.</param>
 public MiddlewareContext(IConnection connection, IWebApiRequest request)
 {
     this.Connection = connection;
     this.Request    = request;
 }
Example #12
0
 /// <summary>
 /// Creates a new <see cref="ListTooLongException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
 public ListTooLongException(IWebApiRequest request, IWebApiResponse <ErrorObject> response) :
     base(request, response, BadRequestError.ListTooLong)
 {
 }
Example #13
0
 /// <summary>
 /// Creates a new <see cref="ServiceUnavailableException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <see langword="null"/>.</exception>
 public ServiceUnavailableException(IWebApiRequest request, IWebApiResponse <ErrorObject> response) :
     base(request, response, response?.Content.Message ?? string.Empty)
 {
 }
Example #14
0
 public CaptureScreen(int?lifetime, IWebApiRequest webApi)
 {
     webApiRequest = webApi;
     InitializeComponent();
     counter = lifetime == null ? defaultLife : lifetime.Value;
 }
 /// <summary>
 /// Creates a new <see cref="MembershipRequiredException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
 public MembershipRequiredException(IWebApiRequest request, IWebApiResponse <ErrorObject> response) :
     base(request, response, AuthorizationError.MembershipRequired)
 {
 }
Example #16
0
 public abstract void OnRequestSuccess(IWebApiRequest request, IWebApiResponse response);
Example #17
0
 /// <summary>
 /// Creates a new <see cref="MissingScopesException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
 public MissingScopesException(IWebApiRequest request, IWebApiResponse <ErrorObject> response) :
     base(request, response, AuthorizationError.MissingScopes)
 {
 }
Example #18
0
 /// <summary>
 /// Creates a new <see cref="RequestCanceledException" />.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> is <c>null</c>.</exception>
 public RequestCanceledException(IWebApiRequest request) :
     base(request, "Request was canceled")
 {
 }
 /// <summary>
 /// Creates a new <see cref="InvalidAccessTokenException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
 public InvalidAccessTokenException(IWebApiRequest request, IWebApiResponse <ErrorObject> response) :
     base(request, response, AuthorizationError.InvalidKey)
 {
 }
Example #20
0
 public virtual TResponse Delete <TResponse>(IWebApiRequest <TResponse> data = null, MediaTypeFormatterEnum?mediaTypeFormatter = null)
 {
     return(this.Delete <TResponse>(data.ResourceUrl, data, mediaTypeFormatter));
 }
 /// <summary>
 /// Creates a new <see cref="AuthorizationRequiredException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <param name="error">The error.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/>, <paramref name="response"/> or <paramref name="error"/> is <c>null</c>.</exception>
 public AuthorizationRequiredException(IWebApiRequest request, IWebApiResponse <ErrorObject> response, AuthorizationError error) :
     base(request, response, response?.Content.Message ?? string.Empty)
 {
     this.AuthorizationError = error;
 }
Example #22
0
 /// <summary>
 /// Creates a new <see cref="TooManyRequestsException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
 public TooManyRequestsException(IWebApiRequest request, IWebApiResponse <ErrorObject> response) :
     base(request, response, response?.Content.Message ?? string.Empty)
 {
 }
Example #23
0
 /// <summary>
 /// Creates a new <see cref="UnexpectedStatusException" />.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <param name="message">The message.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="message"/> is <c>null</c>.</exception>
 public UnexpectedStatusException(IWebApiRequest request, IWebApiResponse <string>?response, string message) :
     base(request, response, message)
 {
 }
Example #24
0
 /// <summary>
 /// Creates a new <see cref="UnexpectedStatusException" />.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
 public UnexpectedStatusException(IWebApiRequest request, IWebApiResponse <string> response) :
     this(request, response, $"Unexpected HTTP status code: {(int?)response?.StatusCode ?? 0}")
 {
 }
Example #25
0
 public virtual async Task <ApiResult <TResponse, TError> > DeleteAsync <TResponse, TError>(IWebApiRequest <TResponse, TError> data = null, MediaTypeFormatterEnum?mediaTypeFormatter = null) => await this.DeleteAsync <TResponse, TError>(data.ResourceUrl, data, mediaTypeFormatter);
Example #26
0
 public virtual async Task <ApiResult <TResponse> > UpdateAsync <TResponse>(IWebApiRequest <TResponse> data = null, MediaTypeFormatterEnum?mediaTypeFormatter = null) => await this.UpdateAsync <TResponse, NullResult>(data.ResourceUrl, data, mediaTypeFormatter);
Example #27
0
 public abstract void OnBeforeRequestSend(IWebApiRequest request);
Example #28
0
 public abstract void OnRequestError(IWebApiRequest request, WebApiError <ErrorT> error);
 /// <summary>
 /// Creates a new <see cref="PageOutOfRangeException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <c>null</c>.</exception>
 public PageOutOfRangeException(IWebApiRequest request, IWebApiResponse <ErrorObject> response) :
     base(request, response, BadRequestError.PageOutOfRange)
 {
 }
Example #30
0
 /// <summary>
 /// Creates a new <see cref="RestrictedToGuildLeadersException"/>.
 /// </summary>
 /// <param name="request">The original request.</param>
 /// <param name="response">The response.</param>
 /// <exception cref="ArgumentNullException"><paramref name="request"/> or <paramref name="response"/> is <see langword="null"/>.</exception>
 public RestrictedToGuildLeadersException(IWebApiRequest request, IWebApiResponse <ErrorObject> response) :
     base(request, response, AuthorizationError.AccessRestrictedToGuildLeaders)
 {
 }