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."); }