@@ -90,10 +90,6 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
9090 var httpMethod = AsHttpMethod ( request . Method ) ;
9191 var url = this . BuildUri ( request ) ;
9292
93- using var message = new HttpRequestMessage ( httpMethod , url ) { Content = requestContent . BuildContent ( ) } ;
94- message . Headers . Host = Options . BaseHost ;
95- message . Headers . CacheControl = request . CachePolicy ?? Options . CachePolicy ;
96-
9793 using var timeoutCts = new CancellationTokenSource ( request . Timeout > 0 ? request . Timeout : int . MaxValue ) ;
9894 using var cts = CancellationTokenSource . CreateLinkedTokenSource ( timeoutCts . Token , cancellationToken ) ;
9995
@@ -116,7 +112,57 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
116112 await OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
117113
118114 try {
119- responseMessage = await HttpClient . SendAsync ( message , request . CompletionOption , ct ) . ConfigureAwait ( false ) ;
115+ // Make sure we have a cookie container if not provided in the request
116+ var cookieContainer = request . CookieContainer ??= new CookieContainer ( ) ;
117+
118+ var headers = new RequestHeaders ( )
119+ . AddHeaders ( request . Parameters )
120+ . AddHeaders ( DefaultParameters )
121+ . AddAcceptHeader ( AcceptedContentTypes )
122+ . AddCookieHeaders ( url , cookieContainer )
123+ . AddCookieHeaders ( url , Options . CookieContainer ) ;
124+
125+ HttpResponseMessage ? responseMessage ;
126+
127+ while ( true ) {
128+ using var requestContent = new RequestContent ( this , request ) ;
129+ using var message = PrepareRequestMessage ( httpMethod , url , requestContent , headers ) ;
130+
131+ if ( request . OnBeforeRequest != null ) await request . OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
132+
133+ responseMessage = await HttpClient . SendAsync ( message , request . CompletionOption , ct ) . ConfigureAwait ( false ) ;
134+
135+ if ( request . OnAfterRequest != null ) await request . OnAfterRequest ( responseMessage ) . ConfigureAwait ( false ) ;
136+
137+ if ( ! IsRedirect ( responseMessage ) ) {
138+ // || !Options.FollowRedirects) {
139+ break ;
140+ }
141+
142+ var location = responseMessage . Headers . Location ;
143+
144+ if ( location == null ) {
145+ break ;
146+ }
147+
148+ if ( ! location . IsAbsoluteUri ) {
149+ location = new Uri ( url , location ) ;
150+ }
151+
152+ if ( responseMessage . StatusCode == HttpStatusCode . RedirectMethod ) {
153+ httpMethod = HttpMethod . Get ;
154+ }
155+
156+ url = location ;
157+
158+ if ( responseMessage . Headers . TryGetValues ( KnownHeaders . SetCookie , out var cookiesHeader ) ) {
159+ // ReSharper disable once PossibleMultipleEnumeration
160+ cookieContainer . AddCookies ( url , cookiesHeader ) ;
161+ // ReSharper disable once PossibleMultipleEnumeration
162+ Options . CookieContainer ? . AddCookies ( url , cookiesHeader ) ;
163+ }
164+ }
165+
120166 // Parse all the cookies from the response and update the cookie jar with cookies
121167 if ( responseMessage . Headers . TryGetValues ( KnownHeaders . SetCookie , out var cookiesHeader ) ) {
122168 // ReSharper disable once PossibleMultipleEnumeration
@@ -162,6 +208,27 @@ async Task OnAfterRequest(HttpResponseMessage responseMessage) {
162208 }
163209 }
164210
211+ HttpRequestMessage PrepareRequestMessage ( HttpMethod httpMethod , Uri url , RequestContent requestContent , RequestHeaders headers ) {
212+ var message = new HttpRequestMessage ( httpMethod , url ) { Content = requestContent . BuildContent ( ) } ;
213+ message . Headers . Host = Options . BaseHost ;
214+ message . Headers . CacheControl = Options . CachePolicy ;
215+ message . AddHeaders ( headers ) ;
216+
217+ return message ;
218+ }
219+
220+ static bool IsRedirect ( HttpResponseMessage responseMessage )
221+ => responseMessage . StatusCode switch {
222+ HttpStatusCode . MovedPermanently => true ,
223+ HttpStatusCode . SeeOther => true ,
224+ HttpStatusCode . TemporaryRedirect => true ,
225+ HttpStatusCode . Redirect => true ,
226+ #if NET
227+ HttpStatusCode . PermanentRedirect => true,
228+ #endif
229+ _ => false
230+ } ;
231+
165232 record HttpResponse (
166233 HttpResponseMessage ? ResponseMessage ,
167234 Uri Url ,
0 commit comments