Esempio n. 1
0
        private bool GetResponse(HttpWebResponse webResponse, ShopConnectorRequestContext context)
        {
            context.Status            = webResponse.StatusCode;
            context.StatusDescription = webResponse.StatusDescription;
            context.Success           = context.Status == HttpStatusCode.OK;

            try
            {
                foreach (var key in webResponse.Headers.AllKeys.Where(x => x.EmptyNull().StartsWith("Sm-ShopConnector-", StringComparison.OrdinalIgnoreCase)))
                {
                    context.Headers[key] = webResponse.Headers[key].EmptyNull();
                }

                if (context.Success)
                {
                    if (context.ResponsePath.HasValue())
                    {
                        using (var fileStream = new FileStream(context.ResponsePath, FileMode.Create, FileAccess.Write))
                            using (var stream = webResponse.GetResponseStream())
                            {
                                stream.CopyTo(fileStream);//, 81920
                            }
                    }
                }
                else
                {
                    var errorMsg = webResponse.Headers["Sm-ShopConnector-ErrorMessageShort"];
                    if (errorMsg.HasValue())
                    {
                        context.ResponseModel = new OperationResultModel(errorMsg);
                    }
                    else
                    {
                        using (var reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                        {
                            var rawResponse = reader.ReadToEnd();
                            context.ResponseModel = XmlHelper.Deserialize <OperationResultModel>(rawResponse);

                            if (context?.ResponseModel?.ShortMessage?.IsEmpty() ?? true)
                            {
                                context.ResponseModel = new OperationResultModel(rawResponse);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                context.ResponseModel = new OperationResultModel(ex.ToAllMessages());
            }

            return(true);
        }
Esempio n. 2
0
        public bool ProcessResponse(ShopConnectorRequestContext context, HttpWebRequest webRequest)
        {
            if (webRequest == null)
            {
                return(false);
            }

            context.Success = false;
            HttpWebResponse webResponse = null;

            try
            {
                webResponse = webRequest.GetResponse() as HttpWebResponse;
                GetResponse(webResponse, context);
            }
            catch (WebException webexception)
            {
                webResponse = webexception.Response as HttpWebResponse;

                if (webResponse != null && GetResponse(webResponse, context))
                {
                    // nothing to do
                }
                else
                {
                    context.ResponseModel = new OperationResultModel(webexception.ToString());
                }
            }
            catch (Exception ex)
            {
                context.ResponseModel = new OperationResultModel(ex);
            }
            finally
            {
                if (webResponse != null)
                {
                    webResponse.Close();
                    webResponse.Dispose();
                }
            }

            return(context.Success);
        }
Esempio n. 3
0
        public HttpWebRequest StartRequest(ShopConnectorRequestContext context)
        {
            if (context == null || !context.IsValid)
            {
                context.ResponseModel = new OperationResultModel("Invalid request context")
                {
                    Description = ((WebApiRequestContext)context).ToString()
                };
                return(null);
            }

            HttpWebRequest request;

            byte[] data           = null;
            string contentMd5Hash = "";
            string timestamp      = DateTime.UtcNow.ToString("o");

            var queryStringEncoded = context.RequestContent.BuildQueryString(null, true);
            var queryStringDecoded = context.RequestContent.BuildQueryString(null, false);

            if (!BodySupported(context.HttpMethod) && queryStringDecoded.HasValue())
            {
                request = (HttpWebRequest)WebRequest.Create(context.Url + "?" + queryStringEncoded);

                context.Url = context.Url + "?" + queryStringDecoded;
            }
            else
            {
                request = (HttpWebRequest)WebRequest.Create(context.Url);
            }

            request.UserAgent = "Smartstore Shop-Connector Consumer";       // optional
            request.Method    = context.HttpMethod;
            request.KeepAlive = false;
            request.Timeout   = Timeout.Infinite;

            request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");                     // Compress.
            request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;  // Decompress.

            request.Headers.Add(HttpRequestHeader.Pragma, "no-cache");
            request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache, no-store");

            request.Accept = context.HttpAcceptType;
            request.Headers.Add(HttpRequestHeader.AcceptCharset, "UTF-8");

            request.Headers.Add(ShopConnectorCore.Header.PublicKey, context.PublicKey);
            request.Headers.Add(ShopConnectorCore.Header.Date, timestamp);
            request.Headers.Add(ShopConnectorCore.Header.Version, context.Version);

            if (BodySupported(request.Method))
            {
                if (queryStringEncoded.HasValue())
                {
                    data = Encoding.UTF8.GetBytes(queryStringEncoded.ToString());

                    request.ContentLength = data.Length;
                    request.ContentType   = "application/x-www-form-urlencoded; charset=utf-8";

                    contentMd5Hash = CreateContentMd5Hash(data);
                }
                else
                {
                    request.ContentLength = 0;
                }
            }

            var messageRepresentation = CreateMessageRepresentation(context, contentMd5Hash, timestamp);
            var signature             = CreateSignature(context.SecretKey, messageRepresentation);

            request.Headers.Add(HttpRequestHeader.Authorization, CreateAuthorizationHeader(signature));

            if (data != null)
            {
                using (var stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
            }

            return(request);
        }
        public bool SendRequest(ShopConnectorRequestContext context, int id)
        {
            try
            {
                string val;
                var    controllingData = ConnectionCache.ControllingData();
                var    connection      = controllingData.Connections.FirstOrDefault(x => x.Id == id);
                context.Version    = controllingData.Version;
                context.Connection = connection;

                Debug.Assert(!connection.IsForExport || (connection.IsForExport && context.ActionMethod.IsCaseInsensitiveEqual("Notification")),
                             "Import connection must be used to consume data.", "");

                if (!connection.IsActive)
                {
                    context.ResponseModel = new OperationResultModel(T("Plugins.SmartStore.ShopConnector.ConnectionNotActive"));
                    return(false);
                }

                if (!controllingData.IsImportEnabled)
                {
                    context.ResponseModel = new OperationResultModel(T("Plugins.SmartStore.ShopConnector.ImportNotActive"));
                    return(false);
                }

                context.PublicKey      = connection.PublicKey;
                context.SecretKey      = connection.SecretKey;
                context.HttpAcceptType = "application/atom+xml,application/atomsvc+xml,application/xml";

                if (context.Url.IsEmpty())
                {
                    context.Url = connection.Url.GetEndpointUrl(context.ActionMethod);
                }
                if (context.HttpMethod.IsEmpty())
                {
                    context.HttpMethod = "GET";
                }

                if (context.ActionMethod == "About")
                {
                    var fs = new ShopConnectorFileSystem("About");
                    context.ResponsePath = fs.GetFullFilePath(string.Concat("about-", Guid.NewGuid().ToString(), ".xml"));
                }
                else if (context.ActionMethod == "ProductData")
                {
                    context.ResponsePath = new ShopConnectorFileSystem("Product").GetFilePath(context.RequestContent["DataFileName"]);
                }

                var consumer = new ShopConnectorConsumer();
                var request  = consumer.StartRequest(context);
                consumer.ProcessResponse(context, request);

                context.Success = context.ResponseModel == null;
                if (context.Success)
                {
                    controllingData.ConnectionsUpdated = true;

                    if (context.Headers.TryGetValue("Sm-ShopConnector-RequestCount", out val) && long.TryParse(val, out var requestCount))
                    {
                        connection.RequestCount = requestCount;
                    }
                    if (context.Headers.TryGetValue("Sm-ShopConnector-LastRequest", out val))
                    {
                        connection.LastRequestUtc = val.ToDateTimeIso8601();
                    }
                    if (context.Headers.TryGetValue("Sm-ShopConnector-LastProductCall", out val))
                    {
                        connection.LastProductCallUtc = val.ToDateTimeIso8601();
                    }
                }

                ShopConnectorFileSystem.CleanupDirectories();
            }
            catch (Exception ex)
            {
                context.Success       = false;
                context.ResponseModel = new OperationResultModel(ex);
            }

            return(context.Success);
        }
Esempio n. 5
0
 public ShopConnectorOperationResult(string message, bool hasError)
 {
     _context = null;
     _model   = new OperationResultModel(message, hasError);
 }
Esempio n. 6
0
 public ShopConnectorOperationResult(ShopConnectorRequestContext context)
 {
     _context = context;
 }