I'm trying to implement a small http wrapper with Flutter and Dart as follows:
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
class HttpWrapper {
http.Client httpClient = http.Client();
Future<http.StreamedResponse> backendHttpRequest(
String method, String endpoint) async {
String backendUrlBase = const String.fromEnvironment("backend_url_base");
var uri = Uri.parse(backendUrlBase + endpoint);
http.Request request = http.Request(method, uri);
request.followRedirects = false;
var response = await httpClient.send(request);
if (response.isRedirect) {
debugPrint("Redirecting...");
// handle redirect
return response;
} else {
return response;
}
}
}
I want to handle redirects separately, since the server may redirect me to an endpoint which does not accept XMLHttpRequests, which runs me into CORS issues then. This wouldn't be a problem if I could just handle the redirect response on my own, as I tried with handling response.statusCode == 302 - my problem is that request.followRedirect = false does not seem to have an effect at all. The client just follows the redirects, no matter what I set followRedirects.
How can I solve this, that my request does not follow redirects?
Thank you for your help!
Edit 1: Changed response.statusCode == 302 to response.isRedirect
Edit 2: How I produce the problem:
I have set up an example server in express as follows:
const express = require('express');
const app = express();
var cors = require('cors')
const logger = require('morgan');
const PORT = 3000;
app.use(logger('dev'));
app.use(cors())
// Without middleware
app.get('/endpointwhichredirects', function (req, res) {
console.log("Redirecting...");
res.redirect('/user');
});
app.get('/user', function (req, res) {
res.send("This is the user-page");
});
app.listen(PORT, function (err) {
if (err) console.log(err);
console.log("Server listening on PORT", PORT);
});
I use my http-wrapper in Dart as follows:
HttpWrapper httpWp = HttpWrapper();
res = httpWp.backendHttpRequest('Get', '/endpointwhichredirects');
My server logs the following when this Dart-code gets executed:
> GET /endpointwhichredirects 302 3.051 ms - 27
> GET /user 304 2.986 ms - -
The debug print "Redirecting..." never gets calles. If I set a breakpoint for both returns of response only the one in the else branch gets caught, never the one handling the redirect.
I just found the explanation in the docs:
Reason seems to be that with XMLHttpRequest redirects are transparent followed by the browser.