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); }
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); } }
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; } } }