I\'d like to make an http request to a remote server while properly handling cookies (eg. storing cookies sent by the server, and sending those cookies when I make subsequen
I found best solution to handle cookies for redirect also
import 'dart:convert';
import 'dart:io';
class CustomHTTPClient{
final HttpClient _client = new HttpClient();
Map _cookies = Map();
CustomHTTPClient(){
_client.connectionTimeout = Duration(seconds: 10);
}
Future get(String url, {int maxRedirect = 3}) async {
final parsedUrl = Uri.parse(url);
return await _client.getUrl(parsedUrl)
.then((HttpClientRequest request) {
request.followRedirects = false;
_beforeRequest(request);
return request.close();
}).then((HttpClientResponse response) async {
_afterResponse(response);
if(response.isRedirect && maxRedirect > 0){
return await response.drain().then((value) => get(parsedUrl.resolve(response.headers.value('location')).toString(), maxRedirect: maxRedirect - 1));
}
return response.transform(utf8.decoder).join();
}).catchError((error, stack){
print(error);print(stack);
});
}
void _beforeRequest(HttpClientRequest request){
request.headers.set(HttpHeaders.acceptEncodingHeader, 'gzip, deflate, br');
// Set cookie
final String rawCookies = _cookies.keys.map((String name) => '$name=${_cookies[name]}').join('; ');
if(rawCookies.isNotEmpty) request.headers.set(HttpHeaders.cookieHeader, rawCookies);
}
void _afterResponse(HttpClientResponse response){
response.headers.forEach((String name, List values){
if(name == 'set-cookie'){ // Get cookies for next request
values.forEach((String rawCookie){
try{
Cookie cookie = Cookie.fromSetCookieValue(rawCookie);
_cookies[cookie.name] = cookie.value;
} catch(e){
final List cookie = rawCookie.split(';')[0].split('=');
_cookies[cookie[0]] = cookie[1];
}
});
return false;
}
});
}
}