@@ -89,10 +89,6 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
89
89
var httpMethod = AsHttpMethod ( request . Method ) ;
90
90
var url = this . BuildUri ( request ) ;
91
91
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
-
96
92
using var timeoutCts = new CancellationTokenSource ( request . Timeout > 0 ? request . Timeout : int . MaxValue ) ;
97
93
using var cts = CancellationTokenSource . CreateLinkedTokenSource ( timeoutCts . Token , cancellationToken ) ;
98
94
@@ -109,11 +105,46 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
109
105
. AddCookieHeaders ( url , cookieContainer )
110
106
. AddCookieHeaders ( url , Options . CookieContainer ) ;
111
107
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
+ }
113
134
114
- if ( request . OnBeforeRequest != null ) await request . OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
135
+ if ( responseMessage . StatusCode == HttpStatusCode . RedirectMethod ) {
136
+ httpMethod = HttpMethod . Get ;
137
+ }
115
138
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
+ }
117
148
118
149
// Parse all the cookies from the response and update the cookie jar with cookies
119
150
if ( responseMessage . Headers . TryGetValues ( KnownHeaders . SetCookie , out var cookiesHeader ) ) {
@@ -132,6 +163,27 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
132
163
}
133
164
}
134
165
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
+
135
187
record HttpResponse (
136
188
HttpResponseMessage ? ResponseMessage ,
137
189
Uri Url ,
0 commit comments