public void DeserializeFromJsonTest()
        {
            string   json = "{\"name\":\"Milica\",\"age\":26,\"birthDate\":100000000000,\"addresses\":[{\"street\":\"Francuska 29\"},{\"street\":\"Dositejeva 64\"}],\"array\":[1,2,3,4,5],\"date\":\"2009-02-15\"}";
            TestData deserializedTestData = jsonService.DeserializeFromJson <TestData>(json);

            AssertTestData(deserializedTestData);
        }
Пример #2
0
        protected void StartMockServer <T>(T expectedRequest, int statusCodeToReturn, string responseToReturn) where T : RelyingPartyRequest
        {
            server = new HttpServer(MOCK_SERVICE_PORT, async context =>
            {
                HttpListenerRequest request = context.Request;
                Encoding encode             = Encoding.UTF8;
                try
                {
                    using (StreamReader requestStream = new StreamReader(request.InputStream, encode))
                    {
                        string requestData  = requestStream.ReadToEnd();
                        string[] postParams = requestData.Split(POST_PARAMS_DELIMITER.ToCharArray());
                        string RequestParam = postParams[0].Split(KEY_VALUE_DELIMITER.ToCharArray(), 2)[1];
                        if (postParams.Length == 2)
                        {
                            string relyingPartyIdParam = postParams[1].Split(KEY_VALUE_DELIMITER.ToCharArray(), 2)[1];
                            Assert.AreEqual(RELYING_PARTY_ID, relyingPartyIdParam);
                        }


                        string jsonReceivedRequest = Encoding.UTF8.GetString(Convert.FromBase64String(RequestParam));
                        string jsonExpectedRequest = jsonService.SerializeToJson(expectedRequest);
                        Assert.AreEqual(jsonExpectedRequest, jsonReceivedRequest);

                        T receivedRequest = jsonService.DeserializeFromJson <T>(jsonReceivedRequest);

                        Assert.AreEqual(expectedRequest, receivedRequest);
                    }
                }
                catch (Exception ex)
                {
                    Assert.Fail(ex.Message);
                }

                using (Stream responseStream = context.Response.OutputStream)
                {
                    context.Response.StatusCode      = statusCodeToReturn;
                    context.Response.ContentLength64 = responseToReturn.Length;
                    await responseStream.WriteAsync(Encoding.UTF8.GetBytes(responseToReturn), 0, responseToReturn.Length).ConfigureAwait(false);
                }
            });
            server.Start();
        }
        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.");
        }