コード例 #1
0
ファイル: AsyncRequest.cs プロジェクト: JornWildt/Ramone
        protected async Task <Response> DoRequestAsync(Uri url, string method, bool includeBody, Action <HttpWebRequest> requestModifier, int retryLevel = 0)
        {
            HttpWebRequest request = SetupRequest(url, method, includeBody, requestModifier);

            ApplyHeadersReadyInterceptors(request);

            if (includeBody && BodyData != null)
            {
                using (Stream o = await request.GetRequestStreamAsync())
                {
                    ApplyRequestStreamWrappers(o, request);

                    if (BodyCodec is IMediaTypeWriterAsync)
                    {
                        await((IMediaTypeWriterAsync)BodyCodec).WriteToAsync(new WriterContext(o, BodyData, request, Session, CodecParameters));
                    }
                    else
                    {
                        BodyCodec.WriteTo(new WriterContext(o, BodyData, request, Session, CodecParameters));
                    }
                }
            }

            ApplyDataSentInterceptors(request);

            HttpWebResponse response = ((HttpWebResponse)await request.GetResponseAsync());
            Response        r        = HandleResponse(response, method, includeBody, requestModifier, retryLevel);

            return(r);
        }
コード例 #2
0
        protected virtual void WriteBody(Stream requestStream, HttpWebRequest request, bool includeBody)
        {
            if (BodyData != null && includeBody)
            {
                // Do not call GetRequestStream unless there is any request data
                if (requestStream == null)
                {
                    requestStream = request.GetRequestStream();
                }

                ApplyHeadersReadyInterceptors(request);
                ApplyRequestStreamWrappers(requestStream, request);

                BodyCodec.WriteTo(new WriterContext(requestStream, BodyData, request, Session, CodecParameters));
                request.GetRequestStream().Close();
            }
            else
            {
                ApplyHeadersReadyInterceptors(request);
            }
        }
コード例 #3
0
ファイル: Request.cs プロジェクト: prearrangedchaos/Ramone
        protected Response DoRequest(Uri url, string method, bool includeBody, Action <HttpWebRequest> requestModifier, int retryLevel = 0)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

                // Set headers and similar before writing to stream
                request.Method            = method;
                request.CookieContainer   = Session.Cookies;
                request.UserAgent         = Session.UserAgent;
                request.AllowAutoRedirect = false;

                request.Headers.Add(AdditionalHeaders);

                if (requestModifier != null)
                {
                    requestModifier(request);
                }

                if (includeBody)
                {
                    if (BodyCharacterSet != null && BodyData == null)
                    {
                        throw new InvalidOperationException("Request character set is not allowed when no body is supplied.");
                    }

                    string charset = "";
                    if (BodyCharacterSet != null)
                    {
                        charset = "; charset=" + BodyCharacterSet;
                    }

                    string boundary = "";
                    if (BodyBoundary != null && BodyCodec != null)
                    {
                        boundary = "; boundary=" + BodyBoundary;
                        BodyCodec.CodecArgument = BodyBoundary;
                    }

                    request.ContentType = BodyContentType + charset + boundary;

                    foreach (KeyValuePair <string, IRequestInterceptor> interceptor in Session.RequestInterceptors)
                    {
                        interceptor.Value.HeadersReady(new RequestContext(request, Session));
                    }

                    if (BodyData != null)
                    {
                        Stream requestStream = request.GetRequestStream();
                        foreach (KeyValuePair <string, IRequestInterceptor> interceptor in Session.RequestInterceptors)
                        {
                            if (interceptor.Value is IRequestStreamWrapper)
                            {
                                requestStream = ((IRequestStreamWrapper)interceptor.Value).Wrap(new RequestStreamWrapperContext(requestStream, request, Session));
                            }
                        }

                        BodyCodec.WriteTo(new WriterContext(requestStream, BodyData, request, Session, CodecParameters));
                        request.GetRequestStream().Close();
                    }
                    else
                    {
                        request.ContentLength = 0;
                    }
                }
                else
                {
                    foreach (KeyValuePair <string, IRequestInterceptor> interceptor in Session.RequestInterceptors)
                    {
                        interceptor.Value.HeadersReady(new RequestContext(request, Session));
                    }
                }

                foreach (KeyValuePair <string, IRequestInterceptor> interceptor in Session.RequestInterceptors)
                {
                    interceptor.Value.DataSent(new RequestContext(request, Session));
                }

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Handle redirects
                if (300 <= (int)response.StatusCode && (int)response.StatusCode <= 399)
                {
                    int allowedRedirectCount = Session.GetAllowedRedirects((int)response.StatusCode);
                    if (retryLevel < allowedRedirectCount)
                    {
                        if (response.StatusCode == HttpStatusCode.SeeOther)
                        {
                            method      = "GET";
                            includeBody = false;
                        }
                        Uri location = response.LocationAsUri();
                        if (location == null)
                        {
                            throw new InvalidOperationException(string.Format("No redirect location supplied in {0} response from {1}.", (int)response.StatusCode, request.RequestUri));
                        }
                        return(DoRequest(location, method, includeBody, requestModifier, retryLevel + 1));
                    }
                }

                return(new Response(response, Session, retryLevel));
            }
            catch (WebException ex)
            {
                HttpWebResponse response = ex.Response as HttpWebResponse;
                if (response != null)
                {
                    if (response.StatusCode == HttpStatusCode.Unauthorized)
                    {
                        HandleUnauthorized(response, ex);
                        if (retryLevel == 0)
                        {
                            // Resend request one time if no exceptions are thrown
                            return(DoRequest(url, method, includeBody, requestModifier, retryLevel + 1));
                        }
                        else
                        {
                            throw new NotAuthorizedException(response, ex);
                        }
                    }
                    else
                    {
                        throw;
                    }
                }
                else
                {
                    throw;
                }
            }
        }