public void AddIfRequired(IResourceConfig config) { if (!CurrentMatch(config)) { config.Accept(new AddVisitor(), this); } }
/// <summary> /// Выполняет синхронный запрос ресурса /// </summary> /// <returns></returns> public async Task <IResourceResponse> GetResponse(IResourceConfig config = null) { if (CheckCurrentCanBeReturned()) { return(Response); } config = config ?? Config ?? ResourceConfig.Default; if (ResourceRequestState.Init == State) { if (null == Response) { Response = await InternalGetResponse(config); } } if (ResourceRequestState.Error == State) { if (null == LastError) { LastError = new ResourceException("some error in request"); } throw LastError; } return(Response); }
/// <summary> /// Синхронизированный метод получения данных /// </summary> /// <param name="provider"></param> /// <param name="url"></param> /// <param name="config"></param> /// <returns></returns> public static byte[] GetData(this IResourceProvider provider, string url, IResourceConfig config = null) { var getdatatask = GetDataAsync(provider, url, config); getdatatask.Wait(); return(getdatatask.Result); }
private async Task <IResourceResponse> InternalGetResponse(IResourceConfig config) { try { if (config.UseQwebAuthentication) { PerformQwebAuthentiacation(config); } config = config ?? ResourceConfig.Default; State = ResourceRequestState.Creating; var nativeRequest = WebRequest.Create(Uri); SetupNativeRequest(nativeRequest, config); State = ResourceRequestState.Created; await PostDataToServer(config, nativeRequest); State = ResourceRequestState.Get; if (config.AcceptAllCeritficates) { nativeRequest.Headers[ALLOW_ALL_CERTIFICATES_HEADER] = "1"; } var nativeResponse = await nativeRequest.GetResponseAsync(); State = ResourceRequestState.Finished; return(new WebResourceResponse(nativeResponse, nativeRequest, config)); } catch (Exception ex) { State = ResourceRequestState.Error; LastError = new ResourceException("erorr in get response", ex); } return(null); }
/// <summary> /// Основной конструктор обертки над откликом /// </summary> /// <param name="nativeResponse"></param> /// <param name="nativeRequest"></param> /// <param name="config"></param> public WebResourceResponse(WebResponse nativeResponse, WebRequest nativeRequest, IResourceConfig config) { State = ResourceResponseState.Init; NativeResponse = nativeResponse; NativeRequest = nativeRequest; Config = config; SetupResponseEncoding(nativeResponse, config); }
/// <summary> /// /// </summary> /// <param name="totalDuration">A duration of all tasks, in seconds.</param> /// <param name="config">A resource config.</param> /// <param name="timeSlotAndDuration">A time slot and duration (in seconds) of the task. /// </param> public TaskProgress( int totalDuration, IResourceConfig config, Tuple <TimeSlot, int> timeSlotAndDuration) { Config = config; _TotalDuration = totalDuration; _TimeSlot = timeSlotAndDuration.Item1; _Duration = timeSlotAndDuration.Item2; }
/// <summary> /// Формирует объект запроса ресурса, который может использоваться для получения контента /// </summary> /// <param name="uri"></param> /// <param name="config"></param> /// <returns></returns> public IResourceRequest CreateRequest(Uri uri, IResourceConfig config = null) { if (null == Extensions || 0==Extensions.Length) throw new ResourceException("нет расширений для реализации запросов"); var realuri = RewriteUri(uri); var resourcegetter = Extensions.FirstOrDefault(_ => _.IsCreateRequestSupported && _.IsSupported(realuri)); if (null == resourcegetter) throw new ResourceException("нет расширений для реализации запроса "+uri+" => "+realuri); return resourcegetter.CreateRequest(uri, config); }
/// <summary> /// Выполняет конфигурацию провайдера ресурсов /// </summary> /// <param name="config"></param> /// <returns></returns> public void Configure(IResourceConfig config = null) { _config = config; if (null != config) { InternalProcessConfig(config); } }
private static void SetupHttpMethod(WebRequest nativeRequest, IResourceConfig config) { var method = config.Method; if (string.IsNullOrWhiteSpace(method)) { method = null != config.RequestPostData ? "POST" : "GET"; } nativeRequest.Method = method; }
public ResourceConfig( ResourceStrategy <TModel> strategy, IResourceConfig resourceGroup, string name, Func <IEngine, TModel> createModel, IEnumerable <IEntityConfig> dependencies) { Strategy = strategy; ResourceGroup = resourceGroup; Name = name; CreateModel = createModel; _Dependencies = dependencies; }
/// <summary> /// Формирует объект запроса ресурса, который может использоваться для получения контента /// </summary> /// <param name="uri"></param> /// <param name="config"></param> /// <returns></returns> public IResourceRequest CreateRequest(Uri uri, IResourceConfig config = null) { if (null == Extensions || 0 == Extensions.Length) { throw new ResourceException("нет расширений для реализации запросов"); } var realuri = RewriteUri(uri); var resourcegetter = Extensions.FirstOrDefault(_ => _.IsCreateRequestSupported && _.IsSupported(realuri)); if (null == resourcegetter) { throw new ResourceException("нет расширений для реализации запроса " + uri + " => " + realuri); } return(resourcegetter.CreateRequest(uri, config)); }
public static ResourceConfig <TModel> CreateResourceConfig <TModel>( this ResourceStrategy <TModel> strategy, IResourceConfig resourceGroup, string name, Func <IEngine, TModel> createModel, IEnumerable <IEntityConfig> dependencies) where TModel : class => new ResourceConfig <TModel>( strategy, resourceGroup, name, createModel, new[] { resourceGroup } .Concat(dependencies) .Where(v => v != null));
/// <summary> /// Донастройка веб-запроса /// </summary> /// <param name="nativeRequest"></param> /// <param name="config"></param> private void SetupNativeRequest(WebRequest nativeRequest, IResourceConfig config) { SetupHttpMethod(nativeRequest, config); if (null != config.Credentials) { nativeRequest.Credentials = config.Credentials; } else { nativeRequest.UseDefaultCredentials = true; } nativeRequest.Proxy = ProxySelectorHelper.Select(Uri, config); ((HttpWebRequest)nativeRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"; ((HttpWebRequest)nativeRequest).CookieContainer = config.Cookies ?? MainContainer; }
/// <summary> /// Формирует объект запроса ресурса, который может использоваться для получения контента /// </summary> /// <param name="uri"></param> /// <param name="config"></param> /// <returns></returns> public IResourceRequest CreateRequest(Uri uri, IResourceConfig config = null) { if (!IsCreateRequestSupported) { throw new ResourceException("cannot retrieve request by settings"); } if (!IsSupported(uri)) { throw new ResourceException("cannot process such uris " + uri); } config = config ?? new ResourceConfig(); if (null == config.GetParent()) { config.AddParent(_config); } return(InternalCreateRequest(uri, config)); }
private void SetupResponseEncoding(WebResponse nativeResponse, IResourceConfig config) { var enc = nativeResponse.Headers[HttpResponseHeader.ContentEncoding]; if (!string.IsNullOrWhiteSpace(enc)) { config.ResponseEncoding = Encoding.GetEncoding(enc); } else { var ctype = NativeResponse.Headers[HttpResponseHeader.ContentType]; if (ctype.Contains("charset=")) { enc = ctype.Substring(ctype.IndexOf("charset=") + 8); config.ResponseEncoding = Encoding.GetEncoding(enc); } } }
public static ResourceConfig <TModel> CreateResourceConfig <TModel>( this ResourceStrategy <TModel> strategy, IResourceConfig resourceGroup, string name, Func <IEngine, TModel> createModel = null) where TModel : class, new() { // update dependencies createModel = createModel ?? (_ => new TModel()); var engine = new DependencyEngine(); createModel(engine); // return(strategy.CreateResourceConfig( resourceGroup, name, createModel, engine .Dependencies .Values)); }
private async Task PostDataToServer(IResourceConfig config, WebRequest nativeRequest) { if (config.Method == "POST") { if (null != config.RequestPostData) { State = ResourceRequestState.Post; using (var stream = new BinaryWriter(await nativeRequest.GetRequestStreamAsync())) { stream.Write(config.RequestPostData, 0, config.RequestPostData.Length); } } else if (!string.IsNullOrWhiteSpace(config.RequestFormString)) { nativeRequest.ContentType = "application/x-www-form-urlencoded"; State = ResourceRequestState.Post; using (var stream = new StreamWriter(await nativeRequest.GetRequestStreamAsync())) { stream.Write(config.RequestFormString); } } } }
private void PerformQwebAuthentiacation(IResourceConfig config) { var root = GetApplicationPath(Uri); var whoami = root + "/_sys/whoami.xml.qweb"; var nr = (HttpWebRequest)WebRequest.Create(whoami); nr.CookieContainer = config.Cookies ?? MainContainer; if (config.AcceptAllCeritficates) { nr.Headers[ALLOW_ALL_CERTIFICATES_HEADER] = "1"; } var r = nr.GetResponse(); var x = XElement.Load(XmlReader.Create(r.GetResponseStream())); var logonname = x.Element("result").Attr("logonname"); if (string.IsNullOrWhiteSpace(logonname)) { if (null == config.Credentials) { throw new ResourceException("cannot perform qweb auth without credentials"); } var login = root + "/_sys/login.string.qweb"; var nl = ((NetworkCredential)config.Credentials); var postdata = string.Format("_l_o_g_i_n_={0}&_p_a_s_s_={1}", nl.UserName, nl.Password); var lr = (HttpWebRequest)WebRequest.Create(login); lr.CookieContainer = config.Cookies ?? MainContainer; lr.Method = "POST"; lr.ContentType = "application/x-www-form-urlencoded"; using (var s = new StreamWriter(lr.GetRequestStream())) { s.Write(postdata); s.Flush(); s.Close(); } lr.GetResponse(); } }
/// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> /// <filterpriority>2</filterpriority> public void Dispose() { Config = null; Response = null; }
/// <summary> /// Выполняет конфигурацию провайдера ресурсов /// </summary> /// <param name="config"></param> /// <returns></returns> public void Configure(IResourceConfig config = null) { _config = config; ConfigureExtensions(); }
public ResourceRepository(IResourceConfig resourceConfig) { _resources = resourceConfig.Get(); }
static Task GetStateAsyncDispatch( this StateOperationContext context, IResourceConfig config) => config.Accept(new GetStateAsyncVisitor(), context);
public Task UpdateStateAsyncDispatch(IResourceConfig config) => config.Accept(new UpdateStateAsyncVisitor(), this);
/// <summary> /// Get the best location for the given entity from the given state. /// </summary> /// <param name="state"></param> /// <param name="config"></param> /// <returns></returns> public static string GetLocation(this IState state, IResourceConfig config) => state.GetDependencyLocationDispatch(config)?.Location;
static DependencyLocation GetDependencyLocationDispatch(this IState state, IResourceConfig config) => config.Accept(new GetDependencyLocationVisitor(), state);
/// <summary> /// Основной конструктор /// </summary> /// <param name="nativeResponse"></param> /// <param name="config"></param> public WebResource(WebResponse nativeResponse, IResourceConfig config = null) { NativeResponse = nativeResponse; Config = config; }
public static string UpdateLocation( this IState current, string location, IResourceConfig config) => location ?? current.GetLocation(config) ?? "eastus";
Tuple <TimeSlot, int> GetTimeSlotAndDurationDispatch(IResourceConfig config) => config.Accept(new GetTimeSlotAndDurationVisitor(), this);
/// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> /// <filterpriority>2</filterpriority> public void Dispose() { NativeResponse = null; Config = null; }
/// <summary> /// Стандартный конструктор /// </summary> /// <param name="uri"></param> /// <param name="config"></param> public WebResourceRequest(Uri uri, IResourceConfig config) { State = ResourceRequestState.Init; Config = config; Uri = uri; }
public static IEnumerable <IResourceConfig> GetTargetDependencies( this IResourceConfig config, IState target) => config.GetResourceDependencies().Where(target.Contains);
/// <summary> /// /// </summary> /// <param name="uri"></param> /// <param name="config"></param> /// <returns></returns> public override IResourceRequest InternalCreateRequest(Uri uri, IResourceConfig config) { return new WebResourceRequest(uri, config); }
public static IEnumerable <IResourceConfig> GetResourceDependencies( this IResourceConfig config) => config.Dependencies.Select(d => d.Resource);