@@ -89,10 +89,6 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
8989 var httpMethod = AsHttpMethod ( request . Method ) ;
9090 var url = this . BuildUri ( request ) ;
9191
92- using var message = new HttpRequestMessage ( httpMethod , url ) { Content = requestContent . BuildContent ( ) } ;
93- message . Headers . Host = Options . BaseHost ;
94- message . Headers . CacheControl = request . CachePolicy ?? Options . CachePolicy ;
95-
9692 using var timeoutCts = new CancellationTokenSource ( request . Timeout > 0 ? request . Timeout : int . MaxValue ) ;
9793 using var cts = CancellationTokenSource . CreateLinkedTokenSource ( timeoutCts . Token , cancellationToken ) ;
9894
@@ -109,11 +105,46 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
109105 . AddCookieHeaders ( url , cookieContainer )
110106 . AddCookieHeaders ( url , Options . CookieContainer ) ;
111107
112- message . AddHeaders ( headers ) ;
108+ HttpResponseMessage ? responseMessage ;
109+
110+ while ( true ) {
111+ using var requestContent = new RequestContent ( this , request ) ;
112+ using var message = PrepareRequestMessage ( httpMethod , url , requestContent , headers ) ;
113+
114+ if ( request . OnBeforeRequest != null ) await request . OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
115+
116+ responseMessage = await HttpClient . SendAsync ( message , request . CompletionOption , ct ) . ConfigureAwait ( false ) ;
117+
118+ if ( request . OnAfterRequest != null ) await request . OnAfterRequest ( responseMessage ) . ConfigureAwait ( false ) ;
119+
120+ if ( ! IsRedirect ( responseMessage ) ) {
121+ // || !Options.FollowRedirects) {
122+ break ;
123+ }
124+
125+ var location = responseMessage . Headers . Location ;
126+
127+ if ( location == null ) {
128+ break ;
129+ }
130+
131+ if ( ! location . IsAbsoluteUri ) {
132+ location = new Uri ( url , location ) ;
133+ }
113134
114- if ( request . OnBeforeRequest != null ) await request . OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
135+ if ( responseMessage . StatusCode == HttpStatusCode . RedirectMethod ) {
136+ httpMethod = HttpMethod . Get ;
137+ }
115138
116- var responseMessage = await HttpClient . SendAsync ( message , request . CompletionOption , ct ) . ConfigureAwait ( false ) ;
139+ url = location ;
140+
141+ if ( responseMessage . Headers . TryGetValues ( KnownHeaders . SetCookie , out var cookiesHeader ) ) {
142+ // ReSharper disable once PossibleMultipleEnumeration
143+ cookieContainer . AddCookies ( url , cookiesHeader ) ;
144+ // ReSharper disable once PossibleMultipleEnumeration
145+ Options . CookieContainer ? . AddCookies ( url , cookiesHeader ) ;
146+ }
147+ }
117148
118149 // Parse all the cookies from the response and update the cookie jar with cookies
119150 if ( responseMessage . Headers . TryGetValues ( KnownHeaders . SetCookie , out var cookiesHeader ) ) {
@@ -132,6 +163,27 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
132163 }
133164 }
134165
166+ HttpRequestMessage PrepareRequestMessage ( HttpMethod httpMethod , Uri url , RequestContent requestContent , RequestHeaders headers ) {
167+ var message = new HttpRequestMessage ( httpMethod , url ) { Content = requestContent . BuildContent ( ) } ;
168+ message . Headers . Host = Options . BaseHost ;
169+ message . Headers . CacheControl = Options . CachePolicy ;
170+ message . AddHeaders ( headers ) ;
171+
172+ return message ;
173+ }
174+
175+ static bool IsRedirect ( HttpResponseMessage responseMessage )
176+ => responseMessage . StatusCode switch {
177+ HttpStatusCode . MovedPermanently => true ,
178+ HttpStatusCode . SeeOther => true ,
179+ HttpStatusCode . TemporaryRedirect => true ,
180+ HttpStatusCode . Redirect => true ,
181+ #if NET
182+ HttpStatusCode . PermanentRedirect => true,
183+ #endif
184+ _ => false
185+ } ;
186+
135187 record HttpResponse (
136188 HttpResponseMessage ? ResponseMessage ,
137189 Uri Url ,
0 commit comments