@@ -90,10 +90,6 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
90
90
var httpMethod = AsHttpMethod ( request . Method ) ;
91
91
var url = this . BuildUri ( request ) ;
92
92
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
-
97
93
using var timeoutCts = new CancellationTokenSource ( request . Timeout > 0 ? request . Timeout : int . MaxValue ) ;
98
94
using var cts = CancellationTokenSource . CreateLinkedTokenSource ( timeoutCts . Token , cancellationToken ) ;
99
95
@@ -116,7 +112,57 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
116
112
await OnBeforeRequest ( message ) . ConfigureAwait ( false ) ;
117
113
118
114
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
+
120
166
// Parse all the cookies from the response and update the cookie jar with cookies
121
167
if ( responseMessage . Headers . TryGetValues ( KnownHeaders . SetCookie , out var cookiesHeader ) ) {
122
168
// ReSharper disable once PossibleMultipleEnumeration
@@ -162,6 +208,27 @@ async Task OnAfterRequest(HttpResponseMessage responseMessage) {
162
208
}
163
209
}
164
210
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
+
165
232
record HttpResponse (
166
233
HttpResponseMessage ? ResponseMessage ,
167
234
Uri Url ,
0 commit comments