Ejemplo n.º 1
0
        private async Task HandleConnection()
        {
            // Todo: Add connection limit here

            _trace.ConnectionStart(ConnectionFeature.ConnectionId);

            try
            {
                var context = new HttpConnectionContext
                {
                    ServiceContext = ServiceContext,
                    ReceivePipe    = ReceivePipe,
                    SendPipe       = SendPipe
                };
                context.Features.Connection = ConnectionFeature;

                _httpConnection = new HttpConnection(context);
                Task adapterTask = Task.FromResult(false);

                if (ServiceContext.ServerOptions.SslEnabled && ServiceContext.ServerOptions.IsHttps)
                {
                    // Wrap SSL and open new pipes
                    _sslAdapter = new SslAdapter(context);
                    await _sslAdapter.PrepareSsl(_httpConnection);

                    adapterTask = _sslAdapter.ReceiveNSend();
                }

                _initializing = false;
                var processTask = _httpConnection.Execute();

                CreateAssociatedClosing();

                await processTask;
                await adapterTask;
                await _socketClosedTcs.Task;
            }
            catch (Exception ex)
            {
                _trace.LogError($"{nameof(SocketConnection)}.{nameof(HandleConnection)}() {ConnectionFeature.ConnectionId}", ex);
            }
            finally
            {
                if (_sslAdapter != null)
                {
                    _sslAdapter.Dispose();
                }

                _trace.ConnectionStop(ConnectionFeature.ConnectionId);
            }
        }
        /// <summary>
        /// Configures and executes REST call: Supports JSON
        /// </summary>
        /// <typeparam name="T">Generic Type parameter for response object</typeparam>
        /// <param name="requestType"></param>
        /// <param name="httpMethod">HttpMethod type</param>
        /// <param name="resource">URI path of the resource</param>
        /// <param name="payload">JSON request payload</param>
        /// <param name="queryParameters"></param>
        /// <returns>Response object or null otherwise for void API calls</returns>
        /// <exception cref="HttpException">Thrown if there was an error sending the request.</exception>
        protected static ApiResponse <T> ConfigureAndExecute <T>(RequestType requestType, HttpMethod httpMethod,
                                                                 string resource = "",
                                                                 QueryParameters queryParameters = null, string payload = "")
        {
            try
            {
                // Create the URI where the HTTP request will be sent.
                Uri uniformResourceIdentifier;
                var endPoint = GetEndpoint(requestType, resource, queryParameters);
                var baseUri  = new Uri(endPoint);
                if (resource != null)
                {
                    var resourceUri = baseUri;
                    if (!Uri.TryCreate(resourceUri, resource, out uniformResourceIdentifier))
                    {
                        throw new LoginRadiusException("Cannot create URL; baseURI=" + baseUri + ", resourcePath=" +
                                                       resource);
                    }
                    uniformResourceIdentifier = resourceUri;
                }
                else
                {
                    uniformResourceIdentifier = baseUri;
                }

                var config = GetConfiguration();

                // Create the HttpRequest object that will be used to send the HTTP request.
                var connMngr    = ConnectionManager.Instance;
                var httpRequest = ConnectionManager.GetConnection(config, uniformResourceIdentifier.ToString());
                httpRequest.Method = httpMethod.ToString();

                httpRequest.ContentType = BaseConstants.ContentTypeHeaderJson;

                // Execute call
                var connectionHttp = new HttpConnection(config);

                // Setup the last request & response details.
                LastRequestDetails.Value  = connectionHttp.RequestDetails;
                LastResponseDetails.Value = connectionHttp.ResponseDetails;

                payload = payload == null ? "" : payload;

                var response = connectionHttp.Execute(payload, httpRequest, payload.Length);

                if (typeof(T).Name.Equals("Object"))
                {
                    return(default(ApiResponse <T>));
                }
                if (typeof(T).Name.Equals("String"))
                {
                    return((ApiResponse <T>)Convert.ChangeType(response, typeof(T)));
                }

                return(new ApiResponse <T> {
                    Response = JsonFormatter.ConvertFromJson <T>(response)
                });
            }
            catch (ConnectionException ex)
            {
                try
                {
                    return(new ApiResponse <T>
                    {
                        _ApiExceptionResponse =
                            JsonConvert.DeserializeObject <ApiExceptionResponse>(((ConnectionException)ex).Response)
                    });
                }
                catch
                {
                    throw ex;
                }
            }
            catch (LoginRadiusException e)
            {
                // If get a LoginRadius, just rethrow to preserve the stack trace.
                return(new ApiResponse <T> {
                    _ApiExceptionResponse = e.ErrorResponse
                });
            }
            catch (System.Exception ex)
            {
                throw new LoginRadiusException(ex.Message, ex);
            }
        }
        /// <summary>
        /// Configures and executes REST call: Supports JSON
        /// </summary>
        /// <typeparam name="T">Generic Type parameter for response object</typeparam>
        /// <param name="requestType"></param>
        /// <param name="httpMethod">HttpMethod type</param>
        /// <param name="resource">URI path of the resource</param>
        /// <param name="payload">JSON request payload</param>
        /// <param name="queryParameters"></param>
        /// <param name="headers"></param>
        /// <returns>Response object or null otherwise for void API calls</returns>
        /// <exception cref="HttpException">Thrown if there was an error sending the request.</exception>
        protected static ApiResponse <T> ConfigureAndExecute <T>(HttpMethod httpMethod, string resource = "",
                                                                 QueryParameters queryParameters        = null, string payload = "", Dictionary <string, string> headers = null)
        {
            try
            {
                // Create the URI where the HTTP request will be sent.
                Uri uniformResourceIdentifier;
                var apiPath  = resource;
                var endPoint = GetEndpoint(apiPath, out Dictionary <string, string> authHeaders, queryParameters);
                if (ConfigDictionary[LRConfigConstants.ApiRequestSigning] != null && ConfigDictionary[LRConfigConstants.ApiRequestSigning] == "true" && authHeaders.Count > 0)
                {
                    var time = DateTime.UtcNow.AddMinutes(15).ToString("yyyy-M-d h:m:s tt");
                    var hash = CreateHash(ConfigDictionary[LRConfigConstants.LoginRadiusApiSecret], endPoint, httpMethod.ToString(), time, payload);
                    authHeaders.Remove("apiSecret");
                    if (headers == null)
                    {
                        headers = new Dictionary <string, string>();
                    }

                    headers.Add("digest", "SHA-256=" + hash);
                    headers.Add("X-Request-Expires", time);
                }
                var baseUri = new Uri(endPoint);
                if (apiPath != null)
                {
                    var resourceUri = baseUri;
                    if (!Uri.TryCreate(resourceUri, apiPath, out uniformResourceIdentifier))
                    {
                        throw new LoginRadiusException("Cannot create URL; baseURI=" + baseUri + ", resourcePath=" +
                                                       apiPath);
                    }
                    uniformResourceIdentifier = resourceUri;
                }
                else
                {
                    uniformResourceIdentifier = baseUri;
                }

                var connMngr    = ConnectionManager.Instance;
                var httpRequest = connMngr.GetConnection(ConfigDictionary, uniformResourceIdentifier.ToString(), headers, authHeaders);
                httpRequest.Method = httpMethod.ToString();

                httpRequest.ContentType = BaseConstants.ContentTypeHeaderJson;

                // Execute call
                var connectionHttp = new HttpConnection(ConfigDictionary);

                // Setup the last request & response details.
                LastRequestDetails.Value  = connectionHttp.RequestDetails;
                LastResponseDetails.Value = connectionHttp.ResponseDetails;

                payload = payload ?? "";

                var response = connectionHttp.Execute(payload, httpRequest, payload.Length);
                if (response.Contains("errorCode"))
                {
                    var exception = new ApiResponse <T>
                    {
                        RestException = JsonConvert.DeserializeObject <ApiExceptionResponse>(response)
                    };
                    return(exception);
                }
                if (typeof(T).Name.Equals("Object"))
                {
                    return(default(ApiResponse <T>));
                }
                if (typeof(T).Name.Equals("String"))
                {
                    return((ApiResponse <T>)Convert.ChangeType(response, typeof(T)));
                }


                return(new ApiResponse <T> {
                    Response = JsonFormatter.ConvertFromJson <T>(response)
                });
            }
            catch (ConnectionException ex)
            {
                try
                {
                    if (ex.Response == string.Empty)
                    {
                        throw;
                    }
                    var exception = new ApiResponse <T>
                    {
                        RestException = JsonConvert.DeserializeObject <ApiExceptionResponse>(ex.Response)
                    };
                    return(exception);
                }
                catch
                {
                    throw ex;
                }
            }
            catch (LoginRadiusException e)
            {
                // If get a LoginRadius, just rethrow to preserve the stack trace.
                return(new ApiResponse <T> {
                    RestException = e.ErrorResponse
                });
            }
            catch (System.Exception ex)
            {
                throw new LoginRadiusException(ex.Message, ex);
            }
        }