@@ -96,11 +96,10 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
9696 var ct = cts . Token ;
9797
9898 HttpResponseMessage ? responseMessage = null ;
99+ // Make sure we have a cookie container if not provided in the request
99100 var cookieContainer = request . CookieContainer ??= new CookieContainer ( ) ;
100101
101102 try {
102- // Make sure we have a cookie container if not provided in the request
103-
104103 var headers = new RequestHeaders ( )
105104 . AddHeaders ( request . Parameters )
106105 . AddHeaders ( DefaultParameters )
@@ -109,6 +108,7 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
109108 . AddCookieHeaders ( url , Options . CookieContainer ) ;
110109
111110 bool foundCookies = false ;
111+ bool firstAttempt = true ;
112112
113113 do {
114114 using var requestContent = new RequestContent ( this , request ) ;
@@ -121,14 +121,19 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
121121 }
122122 using var message = PrepareRequestMessage ( httpMethod , url , content , headers ) ;
123123
124- if ( request . OnBeforeRequest != null ) await request . OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
125- await OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
124+ if ( firstAttempt ) {
125+ firstAttempt = false ;
126+ try {
127+ if ( request . OnBeforeRequest != null ) await request . OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
128+ await OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
129+ }
130+ catch ( Exception e ) {
131+ throw new RestClientInternalException ( "RestClient.ExecuteRequestAsync OnBeforeRequest threw an exception: " , e ) ;
132+ }
133+ }
126134
127135 responseMessage = await HttpClient . SendAsync ( message , request . CompletionOption , ct ) . ConfigureAwait ( false ) ;
128136
129- if ( request . OnAfterRequest != null ) await request . OnAfterRequest ( responseMessage ) . ConfigureAwait ( false ) ;
130- await OnAfterRequest ( responseMessage ) . ConfigureAwait ( false ) ;
131-
132137 if ( ! IsRedirect ( Options . RedirectOptions , responseMessage ) ) {
133138 break ;
134139 }
@@ -187,6 +192,10 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
187192 httpMethod = HttpMethod . Get ;
188193 if ( ! Options . RedirectOptions . ForceForwardBody ) {
189194 // HttpClient RedirectHandler sets request.Content to null here:
195+ // TODO: I don't think is quite correct yet..
196+ // We don't necessarily want to modify the original request, but..
197+ // is there a way to clone it properly and then clear out what we don't
198+ // care about?
190199 message . Content = null ;
191200 // HttpClient Redirect handler also foribly removes
192201 // a Transfer-Encoding of chunked in this case.
@@ -218,6 +227,9 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
218227 Options . CookieContainer ? . AddCookies ( url , cookiesHeader2 ) ;
219228 }
220229 }
230+ catch ( RestClientInternalException e ) {
231+ throw e . InnerException ! ;
232+ }
221233 catch ( Exception ex ) {
222234 return new HttpResponse ( null , url , null , ex , timeoutCts . Token ) ;
223235 }
@@ -310,7 +322,7 @@ HttpRequestMessage PrepareRequestMessage(HttpMethod httpMethod, Uri url, HttpCon
310322 }
311323
312324 static bool IsRedirect ( RestClientRedirectionOptions options , HttpResponseMessage responseMessage ) {
313- return options . RedirectStatusCodes . Contains ( responseMessage . StatusCode ) ;
325+ return options . FollowRedirects && options . RedirectStatusCodes . Contains ( responseMessage . StatusCode ) ;
314326 }
315327
316328 record HttpResponse (
0 commit comments