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); }
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); }
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); }
public ShopConnectorOperationResult(string message, bool hasError) { _context = null; _model = new OperationResultModel(message, hasError); }
public ShopConnectorOperationResult(ShopConnectorRequestContext context) { _context = context; }