示例#1
0
        public async Task <IHttpConnectionResponse> SendAsync(HttpConnectionRequest request, bool allowBuffering, CancellationToken cancellationToken, WebResponse webResponse = null)
        {
            Uri url = request.Url;
            IHttpConnectionResponse response = await this._webReaderManager.GetAsync(request, cancellationToken);

            this.Update(url, response, webResponse);
            return(response);
        }
示例#2
0
        public async Task <IWebStreamResponse> GetWebStreamAsync(Uri url, bool waitForContent, CancellationToken cancellationToken, Uri referrer = null, long?from = null, long?to = null, WebResponse webResponse = null)
        {
            HttpConnectionRequest   request  = this._webReaderManager.CreateRequest(url, referrer, (IWebReader)this, this.ContentType, (string)null, waitForContent, from, to);
            IHttpConnectionResponse response = await this._webReaderManager.GetAsync(request, cancellationToken).ConfigureAwait(false);

            this.Update(url, response, webResponse);
            return((IWebStreamResponse) new HttpConnectionWebStreamResponse(response));
        }
        private HttpConnectionRequest CreateRequest()
        {
            Uri  uri  = this.WebReader.BaseAddress;
            bool flag = false;

            if (null == this._cachedObject)
            {
                this._lastModified = (string)null;
                this._etag         = (string)null;
            }
            if (null != this._lastModified)
            {
                flag = true;
            }
            if (null != this._etag)
            {
                flag = true;
            }
            if (this._firstRequestCompleted && (!flag && null == this._cacheControl))
            {
                this._noCache = "nocache=" + Guid.NewGuid().ToString("N");
            }
            if (null != this._noCache)
            {
                UriBuilder uriBuilder = new UriBuilder(uri);
                uriBuilder.Query = !string.IsNullOrEmpty(uriBuilder.Query) ? uriBuilder.Query.Substring(1) + "&" + this._noCache : this._noCache;
                uri = uriBuilder.Uri;
            }
            HttpConnectionRequest webRequest           = this._webReader.CreateWebRequest(uri, (Uri)null);
            List <KeyValuePair <string, string> > list = new List <KeyValuePair <string, string> >();

            if (null != this._lastModified)
            {
                list.Add(new KeyValuePair <string, string>("If-Modified-Since", this._lastModified));
            }
            if (null != this._etag)
            {
                list.Add(new KeyValuePair <string, string>("If-None-Match", this._etag));
            }
            if (!flag)
            {
                list.Add(new KeyValuePair <string, string>("Cache-Control", "no-cache"));
            }
            if (list.Count > 0)
            {
                webRequest.Headers = (IEnumerable <KeyValuePair <string, string> >)list;
            }
            return(webRequest);
        }
        internal virtual async Task <IHttpConnectionResponse> GetAsync(HttpConnectionRequest request, CancellationToken cancellationToken)
        {
            IHttpConnection         connection = this._httpConnectionFactory.CreateHttpConnection();
            Uri                     requestUrl = request.Url;
            Uri                     url        = requestUrl;
            int                     retry      = 0;
            IHttpConnectionResponse response;
            string                  location;

            do
            {
                await connection.ConnectAsync(request.Proxy ?? url, cancellationToken).ConfigureAwait(false);

                request.Url = url;
                response    = await connection.GetAsync(request, true, cancellationToken).ConfigureAwait(false);

                request.Url = requestUrl;
                IHttpStatus status = response.Status;
                if (HttpStatusCode.Moved == status.StatusCode || HttpStatusCode.Found == status.StatusCode)
                {
                    if (++retry < 8)
                    {
                        connection.Close();
                        location = Enumerable.FirstOrDefault <string>(response.Headers["Location"]);
                    }
                    else
                    {
                        goto label_5;
                    }
                }
                else
                {
                    goto label_3;
                }
            }while (Uri.TryCreate(request.Url, location, out url));
            goto label_7;
label_3:
            IHttpConnectionResponse connectionResponse = response;

            goto label_9;
label_5:
            connectionResponse = response;
            goto label_9;
label_7:
            connectionResponse = response;
label_9:
            return(connectionResponse);
        }
        public virtual HttpConnectionRequest CreateRequest(Uri url, Uri referrer, ContentType contentType, long?fromBytes, long?toBytes, IEnumerable <KeyValuePair <string, string> > headers)
        {
            HttpConnectionRequest connectionRequest = new HttpConnectionRequest()
            {
                Url       = url,
                Referrer  = referrer,
                RangeFrom = fromBytes,
                RangeTo   = toBytes,
                Proxy     = this._parameters.Proxy,
                Headers   = headers
            };

            if ((ContentType)null != contentType)
            {
                connectionRequest.Accept = this.CreateAcceptHeader(contentType);
            }
            return(connectionRequest);
        }
        private async Task Fetch <TCached>(IRetry retry, Func <Uri, byte[], TCached> factory, WebResponse webResponse, CancellationToken cancellationToken) where TCached : class
        {
label_12:
            HttpConnectionRequest request = this.CreateRequest();

            using (IHttpConnectionResponse response = await this._webReader.SendAsync(request, true, cancellationToken, webResponse).ConfigureAwait(false))
            {
                if (response.IsSuccessStatusCode)
                {
                    this._firstRequestCompleted = true;
                    Func <Uri, byte[], TCached> func1 = factory;
                    Uri responseUri = response.ResponseUri;
                    Func <Uri, byte[], TCached> func2 = func1;
                    HttpConnectionWebCache      connectionWebCache = this;
                    byte[] numArray = await this.FetchObject(response, cancellationToken).ConfigureAwait(false);

                    // ISSUE: variable of a boxed type
                    var local = (object)func2(responseUri, numArray);
                    connectionWebCache._cachedObject = (object)local;
                }
                else
                {
                    HttpStatusCode statusCode = response.Status.StatusCode;
                    if (HttpStatusCode.NotModified != statusCode)
                    {
                        if (RetryPolicy.IsRetryable(statusCode))
                        {
                            if (await retry.CanRetryAfterDelayAsync(cancellationToken).ConfigureAwait(false))
                            {
                                goto label_12;
                            }
                        }
                        this._cachedObject = (object)null;
                        response.EnsureSuccessStatusCode();
                        throw new WebException("Unable to fetch " + (object)request.Url);
                    }
                }
            }
        }