Sorry if this question so basic, but I am new to flutter and recently couldn\'t find a good way to set a default headers in the HTTP request I can extend the class or wrap a fun
Dart allows to register a factory for creating an HttpClient
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
return new MyHttpClient(super.createHttpClient(context));
}
}
void main() {
HttpOverrides.global = new MyHttpOverrides();
runApp(MyApp());
}
Implementing such a custom HttpClient seems overly complicated, but perhaps there is a better way.
The class implements HttpClient from dart:io and all its abstract classes.
The methods get(...) and getUrl(...) are customized to add a custom header using _updateHeaders(...). You would need to extend that to all other methods like head, headUrl, open, post, ...
import 'dart:io';
class MyHttpClient implements HttpClient {
HttpClient _realClient;
MyHttpClient(this._realClient);
@override
bool get autoUncompress => _realClient.autoUncompress;
@override
set autoUncompress(bool value) => _realClient.autoUncompress = value;
@override
Duration get connectionTimeout => _realClient.connectionTimeout;
@override
set connectionTimeout(Duration value) =>
_realClient.connectionTimeout = value;
@override
Duration get idleTimeout => _realClient.idleTimeout;
@override
set idleTimeout(Duration value) => _realClient.idleTimeout = value;
@override
int get maxConnectionsPerHost => _realClient.maxConnectionsPerHost;
@override
set maxConnectionsPerHost(int value) =>
_realClient.maxConnectionsPerHost = value;
@override
String get userAgent => _realClient.userAgent;
@override
set userAgent(String value) => _realClient.userAgent = value;
@override
void addCredentials(
Uri url, String realm, HttpClientCredentials credentials) =>
_realClient.addCredentials(url, realm, credentials);
@override
void addProxyCredentials(String host, int port, String realm,
HttpClientCredentials credentials) =>
_realClient.addProxyCredentials(host, port, realm, credentials);
@override
void set authenticate(
Future Function(Uri url, String scheme, String realm) f) =>
_realClient.authenticate = f;
@override
void set authenticateProxy(
Future Function(
String host, int port, String scheme, String realm)
f) =>
_realClient.authenticateProxy = f;
@override
void set badCertificateCallback(
bool Function(X509Certificate cert, String host, int port)
callback) =>
_realClient.badCertificateCallback = callback;
@override
void close({bool force = false}) => _realClient.close(force: force);
@override
Future delete(String host, int port, String path) =>
_realClient.delete(host, port, path);
@override
Future deleteUrl(Uri url) => _realClient.deleteUrl(url);
@override
void set findProxy(String Function(Uri url) f) => _realClient.findProxy = f;
@override
Future get(String host, int port, String path) =>
_updateHeaders(_realClient.get(host, port, path));
Future _updateHeaders(
Future httpClientRequest) async {
return (await httpClientRequest)..headers.add('foo', 'bar');
}
@override
Future getUrl(Uri url) =>
_updateHeaders(_realClient.getUrl(url.replace(path: url.path)));
@override
Future head(String host, int port, String path) =>
_realClient.head(host, port, path);
@override
Future headUrl(Uri url) => _realClient.headUrl(url);
@override
Future open(
String method, String host, int port, String path) =>
_realClient.open(method, host, port, path);
@override
Future openUrl(String method, Uri url) =>
_realClient.openUrl(method, url);
@override
Future patch(String host, int port, String path) =>
_realClient.patch(host, port, path);
@override
Future patchUrl(Uri url) => _realClient.patchUrl(url);
@override
Future post(String host, int port, String path) =>
_realClient.post(host, port, path);
@override
Future postUrl(Uri url) => _realClient.postUrl(url);
@override
Future put(String host, int port, String path) =>
_realClient.put(host, port, path);
@override
Future putUrl(Uri url) => _realClient.putUrl(url);
}