Пример #1
0
 private static void ValidateRequest(RelyingPartyRequest relyingPartyRequest)
 {
     if (relyingPartyRequest == null)
     {
         throw new FrejaEidClientInternalException(message: "Request cannot be null value.");
     }
 }
        public T Send <T>(Uri methodUrl, string requestTemplate, RelyingPartyRequest relyingPartyRequest, string relyingPartyId) where T : FrejaHttpResponse
        {
            HttpWebResponse response = null;
            HttpWebRequest  request  = null;

            Enums.HttpStatusCode httpStatusCode;
            string responseString = String.Empty;
            int    numberOfTries  = 0;

            while (numberOfTries < DEFAULT_NUMBER_OF_RETRIES)
            {
                try
                {
                    request = (HttpWebRequest)HttpWebRequest.Create(methodUrl);
                    ServicePoint currentServicePoint = request.ServicePoint;
                    currentServicePoint.ConnectionLimit = MAXIMUM_NUMBER_OF_HTTP_CONNECTIONS;

                    string jsonRequest    = jsonService.SerializeToJson(relyingPartyRequest);
                    string jsonRequestB64 = Base64Encode(jsonRequest);
                    string requestBody    = String.Format(requestTemplate, jsonRequestB64);

                    if (relyingPartyId != null)
                    {
                        string relyingPartyIdRequest = String.Format(RequestTemplate.RELYING_PARTY_ID_TEMPLATE, relyingPartyId);
                        requestBody += POST_PARAMS_DELIMITER + relyingPartyIdRequest;
                    }

                    request.ClientCertificates = new X509Certificate2Collection {
                        clientCertificate
                    };
                    ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) =>
                    {
                        return(errors == SslPolicyErrors.None && serverCertificate.GetCertHashString().Equals(certificate.GetCertHashString()));
                    };
                    request.Method = HttpMethod.Post.ToString();

                    byte[] requestBytes = Encoding.UTF8.GetBytes(requestBody);

                    request.ContentLength = requestBytes.Length;
                    request.ContentType   = CONTENT_TYPE;
                    request.UserAgent     = userAgentHeader;

                    request.Timeout          = connectionTimeout;
                    request.ReadWriteTimeout = readTimeout;

                    Stream requestStream = request.GetRequestStream();
                    requestStream.Write(requestBytes, 0, requestBytes.Length);
                    requestStream.Close();

                    response = (HttpWebResponse)request.GetResponse();

                    responseString = ExtractResponseFromStream(response);
                    return(jsonService.DeserializeFromJson <T>(responseString));
                }
                catch (Exception e)
                {
                    numberOfTries++;
                    if (e is WebException webException)
                    {
                        Console.WriteLine(e.Message);
                        HttpWebResponse exceptionResponse = webException.Response as HttpWebResponse;
                        if (exceptionResponse != null)
                        {
                            httpStatusCode = (Enums.HttpStatusCode)((int)exceptionResponse.StatusCode);
                            switch (httpStatusCode)
                            {
                            case Enums.HttpStatusCode.NO_CONTENT:
                                return((T) new FrejaHttpResponse());

                            case Enums.HttpStatusCode.BAD_REQUEST:
                            case Enums.HttpStatusCode.UNPROCESSABLE_ENTITY:
                                FrejaHttpErrorResponse errorResponse = jsonService.DeserializeFromJson <FrejaHttpErrorResponse>(ExtractResponseFromStream(exceptionResponse));
                                throw new FrejaEidException(errorResponse.Message, errorResponse.Code);

                            default:
                                if (numberOfTries >= DEFAULT_NUMBER_OF_RETRIES)
                                {
                                    throw new FrejaEidException(message: $"HTTP code {exceptionResponse.StatusCode}.");
                                }
                                break;
                            }
                        }
                    }
                    else
                    {
                        if (numberOfTries >= DEFAULT_NUMBER_OF_RETRIES)
                        {
                            throw new FrejaEidClientInternalException(message: "Failed to send HTTP request.", cause: e);
                        }
                    }
                }
                finally
                {
                    if (response != null)
                    {
                        try
                        {
                            response.Close();
                        }
                        catch (Exception ex)
                        {
                            throw new FrejaEidClientInternalException(message: "Failed to close HTTP connection.", cause: ex);
                        }
                    }
                }
            }
            throw new FrejaEidClientInternalException(message: "Failed to send HTTP request.");
        }