示例#1
0
 public void AddIfRequired(IResourceConfig config)
 {
     if (!CurrentMatch(config))
     {
         config.Accept(new AddVisitor(), this);
     }
 }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        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);
            }
        }
示例#9
0
        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;
        }
示例#10
0
 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));
示例#13
0
 /// <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));
 }
示例#15
0
        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));
        }
示例#17
0
 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);
             }
         }
     }
 }
示例#18
0
        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();
            }
        }
示例#19
0
 /// <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();
		}
示例#21
0
 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);
示例#26
0
 /// <summary>
 /// Основной конструктор
 /// </summary>
 /// <param name="nativeResponse"></param>
 /// <param name="config"></param>
 public WebResource(WebResponse nativeResponse, IResourceConfig config = null)
 {
     NativeResponse = nativeResponse;
     Config         = config;
 }
示例#27
0
 public static string UpdateLocation(
     this IState current, string location, IResourceConfig config)
 => location ?? current.GetLocation(config) ?? "eastus";
 /// <summary>
 /// Выполняет конфигурацию провайдера ресурсов
 /// </summary>
 /// <param name="config"></param>
 /// <returns></returns>
 public void Configure(IResourceConfig config = null)
 {
     _config = config;
     ConfigureExtensions();
 }
 Tuple <TimeSlot, int> GetTimeSlotAndDurationDispatch(IResourceConfig config)
 => config.Accept(new GetTimeSlotAndDurationVisitor(), this);
示例#30
0
 /// <summary>
 /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
 /// </summary>
 /// <filterpriority>2</filterpriority>
 public void Dispose()
 {
     NativeResponse = null;
     Config         = null;
 }
示例#31
0
 /// <summary>
 ///     Стандартный конструктор
 /// </summary>
 /// <param name="uri"></param>
 /// <param name="config"></param>
 public WebResourceRequest(Uri uri, IResourceConfig config)
 {
     State  = ResourceRequestState.Init;
     Config = config;
     Uri    = uri;
 }
示例#32
0
 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);