Exemple #1
0
        /// <summary>
        /// Creates a string that includes the information from the request in a
        /// standardized (canonical) format.
        /// </summary>
        /// <param name="uri"></param>
        /// <param name="httpMethodName"></param>
        /// <param name="parameters"></param>
        /// <param name="preSignedHeaders"></param>
        /// <param name="requestPayload"></param>
        /// <returns>canonical request string</returns>
        /// <seealso cref="http://amazonpaycheckoutintegrationguide.s3.amazonaws.com/amazon-pay-api-v2/signing-requests.html"/>
        public string CreateCanonicalRequest(ApiRequest apiRequest, Dictionary <String, List <String> > preSignedHeaders)
        {
            string        path = apiRequest.Path.AbsolutePath;
            StringBuilder canonicalRequestBuilder = new StringBuilder();

            // if a body was passed to the request, convert it into a JSON string
            string body = string.Empty;

            if (apiRequest.Body != null)
            {
                body = apiRequest.BodyAsJsonString;
            }

            canonicalRequestBuilder.Append(apiRequest.HttpMethod.ToString())
            .Append(LineSeparator)
            .Append(canonicalBuilder.GetCanonicalizedURI(path))
            .Append(LineSeparator)
            .Append(canonicalBuilder.GetCanonicalizedQueryString(apiRequest.QueryParameters))
            .Append(LineSeparator)
            .Append(canonicalBuilder.GetCanonicalizedHeaderString(preSignedHeaders))
            .Append(LineSeparator)
            .Append(canonicalBuilder.GetSignedHeadersString(preSignedHeaders))
            .Append(LineSeparator)
            .Append(canonicalBuilder.HashThenHexEncode(body));

            return(canonicalRequestBuilder.ToString());
        }
        /// <summary>
        /// Helper method to execute the request
        /// </summary>
        protected virtual HttpWebResponse SendRequest(ApiRequest apiRequest, Dictionary <string, string> postSignedHeaders)
        {
            string path = apiRequest.Path.ToString();

            // add the query parameters to the URL, if there are any
            if (apiRequest.QueryParameters != null && apiRequest.QueryParameters.Count > 0)
            {
                var canonicalBuilder = new CanonicalBuilder();
                path += "?" + canonicalBuilder.GetCanonicalizedQueryString(apiRequest.QueryParameters);
            }

            // TODO: move setting of SecurityProtocol into constructor

            // ensure the right minimum TLS version is being used
            if (Util.IsObsoleteSecurityProtocol(ServicePointManager.SecurityProtocol))
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            }

            // TODO: consider switching to HttpClient class for web requests

            // create the web request
            HttpWebRequest request = WebRequest.Create(path) as HttpWebRequest;

            foreach (KeyValuePair <string, string> header in postSignedHeaders)
            {
                if (WebHeaderCollection.IsRestricted(header.Key))
                {
                    switch (header.Key)
                    {
                    case "accept":
                        request.Accept = header.Value;
                        break;

                    case "content-type":
                        request.ContentType = header.Value;
                        break;

                    case "user-agent":
                        request.UserAgent = header.Value;
                        break;

                    default:
                        throw new AmazonPayClientException("unknown header" + " " + header.Key);
                    }
                }
                else
                {
                    request.Headers.Add(header.Key, header.Value);
                }
            }
            request.Method = apiRequest.HttpMethod.ToString();

            if (apiRequest.HttpMethod != HttpMethod.GET)
            {
                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(apiRequest.Body.ToJson());
                    streamWriter.Flush();
                }
            }

            HttpWebResponse httpResponse;

            try
            {
                httpResponse = request.GetResponse() as HttpWebResponse;
            }
            catch (WebException we)
            {
                httpResponse = (HttpWebResponse)we.Response as HttpWebResponse;

                if (httpResponse == null)
                {
                    throw new AmazonPayClientException("Http Response is empty " + we);
                }
            }

            return(httpResponse);
        }