public IRequest Marshall(CreateAppRequest createAppRequest)
        {
            IRequest request = new DefaultRequest(createAppRequest, "AmazonOpsWorks");
            string   target  = "OpsWorks_20130218.CreateApp";

            request.Headers["X-Amz-Target"] = target;

            request.Headers["Content-Type"] = "application/x-amz-json-1.1";

            string uriResourcePath = "";

            request.ResourcePath = uriResourcePath;


            using (StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture))
            {
                JsonWriter writer = new JsonWriter(stringWriter);
                writer.WriteObjectStart();

                if (createAppRequest != null && createAppRequest.IsSetStackId())
                {
                    writer.WritePropertyName("StackId");
                    writer.Write(createAppRequest.StackId);
                }
                if (createAppRequest != null && createAppRequest.IsSetShortname())
                {
                    writer.WritePropertyName("Shortname");
                    writer.Write(createAppRequest.Shortname);
                }
                if (createAppRequest != null && createAppRequest.IsSetName())
                {
                    writer.WritePropertyName("Name");
                    writer.Write(createAppRequest.Name);
                }
                if (createAppRequest != null && createAppRequest.IsSetDescription())
                {
                    writer.WritePropertyName("Description");
                    writer.Write(createAppRequest.Description);
                }
                if (createAppRequest != null && createAppRequest.IsSetType())
                {
                    writer.WritePropertyName("Type");
                    writer.Write(createAppRequest.Type);
                }

                if (createAppRequest != null)
                {
                    Source appSource = createAppRequest.AppSource;
                    if (appSource != null)
                    {
                        writer.WritePropertyName("AppSource");
                        writer.WriteObjectStart();
                        if (appSource != null && appSource.IsSetType())
                        {
                            writer.WritePropertyName("Type");
                            writer.Write(appSource.Type);
                        }
                        if (appSource != null && appSource.IsSetUrl())
                        {
                            writer.WritePropertyName("Url");
                            writer.Write(appSource.Url);
                        }
                        if (appSource != null && appSource.IsSetUsername())
                        {
                            writer.WritePropertyName("Username");
                            writer.Write(appSource.Username);
                        }
                        if (appSource != null && appSource.IsSetPassword())
                        {
                            writer.WritePropertyName("Password");
                            writer.Write(appSource.Password);
                        }
                        if (appSource != null && appSource.IsSetSshKey())
                        {
                            writer.WritePropertyName("SshKey");
                            writer.Write(appSource.SshKey);
                        }
                        if (appSource != null && appSource.IsSetRevision())
                        {
                            writer.WritePropertyName("Revision");
                            writer.Write(appSource.Revision);
                        }
                        writer.WriteObjectEnd();
                    }
                }

                if (createAppRequest != null && createAppRequest.Domains != null && createAppRequest.Domains.Count > 0)
                {
                    List <string> domainsList = createAppRequest.Domains;
                    writer.WritePropertyName("Domains");
                    writer.WriteArrayStart();

                    foreach (string domainsListValue in domainsList)
                    {
                        writer.Write(StringUtils.FromString(domainsListValue));
                    }

                    writer.WriteArrayEnd();
                }
                if (createAppRequest != null && createAppRequest.IsSetEnableSsl())
                {
                    writer.WritePropertyName("EnableSsl");
                    writer.Write(createAppRequest.EnableSsl);
                }

                if (createAppRequest != null)
                {
                    SslConfiguration sslConfiguration = createAppRequest.SslConfiguration;
                    if (sslConfiguration != null)
                    {
                        writer.WritePropertyName("SslConfiguration");
                        writer.WriteObjectStart();
                        if (sslConfiguration != null && sslConfiguration.IsSetCertificate())
                        {
                            writer.WritePropertyName("Certificate");
                            writer.Write(sslConfiguration.Certificate);
                        }
                        if (sslConfiguration != null && sslConfiguration.IsSetPrivateKey())
                        {
                            writer.WritePropertyName("PrivateKey");
                            writer.Write(sslConfiguration.PrivateKey);
                        }
                        if (sslConfiguration != null && sslConfiguration.IsSetChain())
                        {
                            writer.WritePropertyName("Chain");
                            writer.Write(sslConfiguration.Chain);
                        }
                        writer.WriteObjectEnd();
                    }
                }
                if (createAppRequest != null)
                {
                    if (createAppRequest.Attributes != null && createAppRequest.Attributes.Count > 0)
                    {
                        writer.WritePropertyName("Attributes");
                        writer.WriteObjectStart();
                        foreach (string createAppRequestAttributesKey in createAppRequest.Attributes.Keys)
                        {
                            string attributesListValue;
                            bool   attributesListValueHasValue = createAppRequest.Attributes.TryGetValue(createAppRequestAttributesKey, out attributesListValue);
                            writer.WritePropertyName(createAppRequestAttributesKey);

                            writer.Write(attributesListValue);
                        }
                        writer.WriteObjectEnd();
                    }
                }

                writer.WriteObjectEnd();

                string snippet = stringWriter.ToString();
                request.Content = System.Text.Encoding.UTF8.GetBytes(snippet);
            }


            return(request);
        }
        public IRequest Marshall(UpdateAppRequest updateAppRequest)
        {
            IRequest request = new DefaultRequest(updateAppRequest, "AmazonOpsWorks");
            string   target  = "OpsWorks_20130218.UpdateApp";

            request.Headers["X-Amz-Target"] = target;

            request.Headers["Content-Type"] = "application/x-amz-json-1.1";


            string uriResourcePath = "";

            if (uriResourcePath.Contains("?"))
            {
                int    queryPosition = uriResourcePath.IndexOf("?", StringComparison.OrdinalIgnoreCase);
                string queryString   = uriResourcePath.Substring(queryPosition + 1);
                uriResourcePath = uriResourcePath.Substring(0, queryPosition);

                foreach (string s in queryString.Split('&', ';'))
                {
                    string[] nameValuePair = s.Split('=');
                    if (nameValuePair.Length == 2 && nameValuePair[1].Length > 0)
                    {
                        request.Parameters.Add(nameValuePair[0], nameValuePair[1]);
                    }
                    else
                    {
                        request.Parameters.Add(nameValuePair[0], null);
                    }
                }
            }

            request.ResourcePath = uriResourcePath;


            using (StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture))
            {
                JsonWriter writer = new JsonWriter(stringWriter);
                writer.WriteObjectStart();

                if (updateAppRequest != null && updateAppRequest.IsSetAppId())
                {
                    writer.WritePropertyName("AppId");
                    writer.Write(updateAppRequest.AppId);
                }
                if (updateAppRequest != null && updateAppRequest.IsSetName())
                {
                    writer.WritePropertyName("Name");
                    writer.Write(updateAppRequest.Name);
                }
                if (updateAppRequest != null && updateAppRequest.IsSetDescription())
                {
                    writer.WritePropertyName("Description");
                    writer.Write(updateAppRequest.Description);
                }
                if (updateAppRequest != null && updateAppRequest.IsSetType())
                {
                    writer.WritePropertyName("Type");
                    writer.Write(updateAppRequest.Type);
                }

                if (updateAppRequest != null)
                {
                    Source appSource = updateAppRequest.AppSource;
                    if (appSource != null)
                    {
                        writer.WritePropertyName("AppSource");
                        writer.WriteObjectStart();
                        if (appSource != null && appSource.IsSetType())
                        {
                            writer.WritePropertyName("Type");
                            writer.Write(appSource.Type);
                        }
                        if (appSource != null && appSource.IsSetUrl())
                        {
                            writer.WritePropertyName("Url");
                            writer.Write(appSource.Url);
                        }
                        if (appSource != null && appSource.IsSetUsername())
                        {
                            writer.WritePropertyName("Username");
                            writer.Write(appSource.Username);
                        }
                        if (appSource != null && appSource.IsSetPassword())
                        {
                            writer.WritePropertyName("Password");
                            writer.Write(appSource.Password);
                        }
                        if (appSource != null && appSource.IsSetSshKey())
                        {
                            writer.WritePropertyName("SshKey");
                            writer.Write(appSource.SshKey);
                        }
                        if (appSource != null && appSource.IsSetRevision())
                        {
                            writer.WritePropertyName("Revision");
                            writer.Write(appSource.Revision);
                        }
                        writer.WriteObjectEnd();
                    }
                }

                if (updateAppRequest != null && updateAppRequest.Domains != null && updateAppRequest.Domains.Count > 0)
                {
                    List <string> domainsList = updateAppRequest.Domains;
                    writer.WritePropertyName("Domains");
                    writer.WriteArrayStart();

                    foreach (string domainsListValue in domainsList)
                    {
                        writer.Write(StringUtils.FromString(domainsListValue));
                    }

                    writer.WriteArrayEnd();
                }
                if (updateAppRequest != null && updateAppRequest.IsSetEnableSsl())
                {
                    writer.WritePropertyName("EnableSsl");
                    writer.Write(updateAppRequest.EnableSsl);
                }

                if (updateAppRequest != null)
                {
                    SslConfiguration sslConfiguration = updateAppRequest.SslConfiguration;
                    if (sslConfiguration != null)
                    {
                        writer.WritePropertyName("SslConfiguration");
                        writer.WriteObjectStart();
                        if (sslConfiguration != null && sslConfiguration.IsSetCertificate())
                        {
                            writer.WritePropertyName("Certificate");
                            writer.Write(sslConfiguration.Certificate);
                        }
                        if (sslConfiguration != null && sslConfiguration.IsSetPrivateKey())
                        {
                            writer.WritePropertyName("PrivateKey");
                            writer.Write(sslConfiguration.PrivateKey);
                        }
                        if (sslConfiguration != null && sslConfiguration.IsSetChain())
                        {
                            writer.WritePropertyName("Chain");
                            writer.Write(sslConfiguration.Chain);
                        }
                        writer.WriteObjectEnd();
                    }
                }
                if (updateAppRequest != null)
                {
                    if (updateAppRequest.Attributes != null && updateAppRequest.Attributes.Count > 0)
                    {
                        writer.WritePropertyName("Attributes");
                        writer.WriteObjectStart();
                        foreach (string updateAppRequestAttributesKey in updateAppRequest.Attributes.Keys)
                        {
                            string attributesListValue;
                            bool   attributesListValueHasValue = updateAppRequest.Attributes.TryGetValue(updateAppRequestAttributesKey, out attributesListValue);
                            writer.WritePropertyName(updateAppRequestAttributesKey);

                            writer.Write(attributesListValue);
                        }
                        writer.WriteObjectEnd();
                    }
                }

                writer.WriteObjectEnd();

                string snippet = stringWriter.ToString();
                request.Content = System.Text.Encoding.UTF8.GetBytes(snippet);
            }


            return(request);
        }
        //[Test]
        //[Ignore("Only for creating the certificate bytes from the file")]
        //public void CreateCertificate()
        //{
        //    // to recreate the cert, you want something like the following, run with root/admin level access (with common name = localhost):
        //    // openssl req -newkey rsa:2048 -nodes -keyout localhost.key -x509 -days 3650 -out localhost.crt
        //    // openssl pkcs12 -inkey localhost.key -in localhost.crt -export -out localhost.pfx

        //    var path = @"C:\Code\KafkaClient\src\KafkaClient.Tests\localhost.pfx";
        //    var cert = new X509Certificate2();
        //    cert.Import(path, CertPassword, X509KeyStorageFlags.Exportable);

        //    var buffer = new StringBuilder("private static readonly byte[] CertRawBytes = { ");
        //    foreach (var b in cert.Export(X509ContentType.Pfx, CertPassword))
        //    {
        //        buffer.AppendFormat("0x{0:X}, ", b);
        //    }
        //    buffer.Remove(buffer.Length - 2, 2);
        //    buffer.Append(" };");

        //    Console.WriteLine(buffer.ToString());
        //}

        protected override SslTransport CreateTransport(Endpoint endpoint, IConnectionConfiguration configuration, ILog log)
        {
            var sslConfiguration = new SslConfiguration((sender, certificate, chain, errors) => (errors | SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors);

            return(new SslTransport(endpoint, configuration.CopyWith(sslConfiguration: sslConfiguration), log));
        }