/// <summary>
        /// called when processing a valid request message and then verify state, discovery or enrollment
        /// </summary>
        /// <param name="req"></param>
        public static HttpResponse VerifyRequest(HttpMessage req)
        {
            HttpResponse ret = null;

            if (req == null)
            {
                testSite.Assert.Fail("Not receive any request");
            }

            if (!(req is HttpRequest))
            {
                testSite.Assert.Fail("only expect HTTP request");
            }
            HttpRequest r = (HttpRequest)req;

            switch (r.Method)
            {
            case HttpRequest.HttpMethod.PUT:
            {
                if (r.RequestUrl.Path.ToLower().StartsWith(Constraints.StoreUrl.ToLower() + "/"))
                {
                    StoreEntry entry = (StoreEntry)JsonUtility.DeserializeJSON(r.Body, typeof(StoreEntry));
                    if (addData(entry, true))
                    {
                        return(createSuccess());
                    }
                    else
                    {
                        return(createInternalError());
                    }
                }
            }
            break;

            case HttpRequest.HttpMethod.GET:
            {
                if (r.RequestUrl.Path.ToLower() == Constraints.StoreUrl.ToLower())
                {
                    StoreEntry[] array = getExternalEntries().ToArray();

                    ret      = createSuccess();
                    ret.Body = JsonUtility.SerializeJSON(array);
                    ret.SetHeaderField(System.Net.HttpResponseHeader.ContentLength, ret.Body.Length.ToString());
                    return(ret);
                }
                else if (r.RequestUrl.Path.ToLower() == Constraints.FederationMetadataUrl.ToLower())
                {
                }
                else if (r.RequestUrl.Path.ToLower() == Constraints.GetSTSConfigurationUrl.ToLower())
                {
                    ret = new HttpResponse(System.Net.HttpStatusCode.OK);
                    STSConfiguration conf = createValidStsConfigurationResponse();
                    ret.Body = JsonUtility.Encode(conf.ToString());
                    ret.SetHeaderField(System.Net.HttpResponseHeader.ContentLength, ret.Body.Length.ToString());
                    return(ret);
                }
                else if (r.RequestUrl.Path.ToLower() == Constraints.ProxyTrustUrl.ToLower())
                {
                    StoreEntry entry = getData(TrustIdentifierRecord);
                    if (entry == null)
                    {
                        return(createNotFound());
                    }
                    else
                    {
                        ret = new HttpResponse(System.Net.HttpStatusCode.OK);
                        ProxyRelyingPartyTrust pt = new ProxyRelyingPartyTrust();
                        pt.Identifier = entry.value;
                        ret.Body      = pt.ToString();
                        return(ret);
                    }
                }
                else if (r.RequestUrl.Path.ToLower() == Constraints.StoreUrl.ToLower())
                {
                }
                else if (r.RequestUrl.Path.ToLower() == Constraints.RelyingPartyTrustUrl.ToLower())
                {
                    StoreEntry entry = getData(managedAppsRecord);
                    if (entry == null)
                    {
                        return(createNotFound());
                    }
                    else
                    {
                        ret      = createSuccess();
                        ret.Body = entry.value;
                        ret.SetHeaderField(System.Net.HttpResponseHeader.ContentLength, ret.Body.Length.ToString());
                        return(ret);
                    }
                }
                else if (r.RequestUrl.Path.ToLower().StartsWith(Constraints.StoreUrl.ToLower() + "/"))
                {
                    StoreEntry entry = getData(r.RequestUrl.Path.ToLower().Substring((Constraints.StoreUrl.ToLower() + "/").Length));
                    if (entry == null)
                    {
                        return(createNotFound());
                    }
                    else
                    {
                        ret      = createSuccess();
                        ret.Body = entry.ToString();
                        ret.SetHeaderField(System.Net.HttpResponseHeader.ContentType, "application/json;charset=UTF-8");
                        ret.SetHeaderField(System.Net.HttpResponseHeader.ContentLength, ret.Body.Length.ToString());
                        return(ret);
                    }
                }
            }
            break;

            case HttpRequest.HttpMethod.POST:
            {
                if (r.RequestUrl.Path.ToLower() == Constraints.EstablishTrustUrl.ToLower())
                {
                    StoreEntry entry = getData(TrustCertificateRecord);
                    if (entry != null)
                    {
                        testSite.Assert.Fail("Trust already established");
                        return(createInternalError());
                    }
                    EstablishTrustRequest dict = (EstablishTrustRequest)JsonUtility.DeserializeJSON(r.Body, typeof(EstablishTrustRequest));
                    entry         = new StoreEntry();
                    entry.key     = TrustCertificateRecord;
                    entry.version = -1;
                    entry.value   = dict.SerializedTrustCertificate;
                    if (addData(entry))
                    {
                        return(createSuccess());
                    }
                }
                else if (r.RequestUrl.Path.ToLower().Contains(Constraints.RelyingPartyTrustUrl.ToLower() + "/"))
                {
                    return(createSuccess());
                }
                else if (r.RequestUrl.Path.ToLower() == Constraints.ProxyTrustUrl.ToLower())
                {
                    StoreEntry entry = getData(TrustIdentifierRecord);
                    if (entry != null)
                    {
                        return(createInternalError());
                    }
                    ProxyRelyingPartyTrust dict = (ProxyRelyingPartyTrust)JsonUtility.DeserializeJSON(r.Body, typeof(ProxyRelyingPartyTrust));
                    entry         = new StoreEntry();
                    entry.key     = TrustIdentifierRecord;
                    entry.version = -1;
                    entry.value   = dict.Identifier;
                    if (addData(entry))
                    {
                        return(createSuccess());
                    }
                }
                else if (r.RequestUrl.Path.ToLower() == Constraints.StoreUrl.ToLower())
                {
                }
                else if (r.RequestUrl.Path.ToLower().StartsWith(Constraints.StoreUrl.ToLower() + "/"))
                {
                    StoreEntry entry = (StoreEntry)JsonUtility.DeserializeJSON(r.Body, typeof(StoreEntry));
                    if (addData(entry))
                    {
                        HttpResponse tosend = createSuccess();
                        // Yuqing: MUST set bellows!!!
                        tosend.SetHeaderField(System.Net.HttpResponseHeader.ContentLength, "0");
                        tosend.SetHeaderField(System.Net.HttpResponseHeader.ContentType, "text/html;charset=UTF-8");
                        return(tosend);
                    }
                    else
                    {
                        return(createInternalError());
                    }
                }
            }
            break;

            default:
                testSite.Assert.Fail("Unsupported HTTP method");
                break;
            }
            //testSite.Assert.IsNotNull(ret, "Request is handled");
            return(ret);
        }
 /// <summary>
 /// Initializes proxy trusts.
 /// </summary>
 private void InitializeProxyTrust()
 {
     _proxyRelyingPartyTrust  = new ProxyRelyingPartyTrust();
     _proxyTrustedCertificate = new List <ProxyTrust>();
 }
        /// <summary>
        /// Add a proxy identifier.
        /// </summary>
        public void AddProxyRelyingPartyTrust(ProxyRelyingPartyTrust proxy)
        {
            _proxyRelyingPartyTrust = proxy;

            NotifyPropertyChanged("ProxyRelyingPartyTrust");
        }