blob: b3a825591e2fc022d390e92dbe2012466249bc2a [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
import 'dart:async';
import 'dart:io';
import "package:expect/expect.dart";
class MyHttpClient1 implements HttpClient {
String userAgent = "MyHttpClient1";
MyHttpClient1(SecurityContext context);
Duration idleTimeout;
Duration connectionTimeout;
int maxConnectionsPerHost;
bool autoUncompress;
bool enableTimelineLogging;
Future<HttpClientRequest> open(
String method, String host, int port, String path) =>
null;
Future<HttpClientRequest> openUrl(String method, Uri url) => null;
Future<HttpClientRequest> get(String host, int port, String path) => null;
Future<HttpClientRequest> getUrl(Uri url) => null;
Future<HttpClientRequest> post(String host, int port, String path) => null;
Future<HttpClientRequest> postUrl(Uri url) => null;
Future<HttpClientRequest> put(String host, int port, String path) => null;
Future<HttpClientRequest> putUrl(Uri url) => null;
Future<HttpClientRequest> delete(String host, int port, String path) => null;
Future<HttpClientRequest> deleteUrl(Uri url) => null;
Future<HttpClientRequest> patch(String host, int port, String path) => null;
Future<HttpClientRequest> patchUrl(Uri url) => null;
Future<HttpClientRequest> head(String host, int port, String path) => null;
Future<HttpClientRequest> headUrl(Uri url) => null;
set authenticate(Future<bool> f(Uri url, String scheme, String realm)) {}
void addCredentials(
Uri url, String realm, HttpClientCredentials credentials) {}
set connectionFactory(
Future<ConnectionTask<Socket>> Function(
Uri url, String proxyHost, int proxyPort)
f) {}
set findProxy(String f(Uri url)) {}
set authenticateProxy(
Future<bool> f(String host, int port, String scheme, String realm)) {}
void addProxyCredentials(
String host, int port, String realm, HttpClientCredentials credentials) {}
set badCertificateCallback(
bool callback(X509Certificate cert, String host, int port)) {}
void set keyLog(Function(String line) callback) =>
throw UnsupportedError("keyLog not implemented");
void close({bool force: false}) {}
}
class MyHttpClient2 implements HttpClient {
String userAgent = "MyHttpClient2";
MyHttpClient2(SecurityContext context);
Duration idleTimeout;
Duration connectionTimeout;
int maxConnectionsPerHost;
bool autoUncompress;
bool enableTimelineLogging;
Future<HttpClientRequest> open(
String method, String host, int port, String path) =>
null;
Future<HttpClientRequest> openUrl(String method, Uri url) => null;
Future<HttpClientRequest> get(String host, int port, String path) => null;
Future<HttpClientRequest> getUrl(Uri url) => null;
Future<HttpClientRequest> post(String host, int port, String path) => null;
Future<HttpClientRequest> postUrl(Uri url) => null;
Future<HttpClientRequest> put(String host, int port, String path) => null;
Future<HttpClientRequest> putUrl(Uri url) => null;
Future<HttpClientRequest> delete(String host, int port, String path) => null;
Future<HttpClientRequest> deleteUrl(Uri url) => null;
Future<HttpClientRequest> patch(String host, int port, String path) => null;
Future<HttpClientRequest> patchUrl(Uri url) => null;
Future<HttpClientRequest> head(String host, int port, String path) => null;
Future<HttpClientRequest> headUrl(Uri url) => null;
set authenticate(Future<bool> f(Uri url, String scheme, String realm)) {}
void addCredentials(
Uri url, String realm, HttpClientCredentials credentials) {}
set connectionFactory(
Future<ConnectionTask<Socket>> Function(
Uri url, String proxyHost, int proxyPort)
f) {}
set findProxy(String f(Uri url)) {}
set authenticateProxy(
Future<bool> f(String host, int port, String scheme, String realm)) {}
void addProxyCredentials(
String host, int port, String realm, HttpClientCredentials credentials) {}
set badCertificateCallback(
bool callback(X509Certificate cert, String host, int port)) {}
void set keyLog(Function(String line) callback) =>
throw UnsupportedError("keyLog not implemented");
void close({bool force: false}) {}
}
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
return new MyHttpClient1(context);
}
}
HttpClient myCreateHttp1Client(SecurityContext context) {
return new MyHttpClient1(context);
}
HttpClient myCreateHttp2Client(SecurityContext context) {
return new MyHttpClient2(context);
}
String myFindProxyFromEnvironment(Uri url, Map<String, String> environment) {
return "proxy";
}
withHttpOverridesTest() {
HttpOverrides.runZoned(() {
var httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
}, createHttpClient: myCreateHttp1Client);
var httpClient = new HttpClient();
Expect.isTrue(httpClient is HttpClient);
Expect.isTrue(httpClient is! MyHttpClient1);
}
nestedWithHttpOverridesTest() {
HttpOverrides.runZoned(() {
var httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
HttpOverrides.runZoned(() {
var httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient2);
Expect.equals((new MyHttpClient2(null)).userAgent, httpClient.userAgent);
}, createHttpClient: myCreateHttp2Client);
httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
}, createHttpClient: myCreateHttp1Client);
var httpClient = new HttpClient();
Expect.isTrue(httpClient is HttpClient);
Expect.isTrue(httpClient is! MyHttpClient1);
Expect.isTrue(httpClient is! MyHttpClient2);
}
nestedDifferentOverridesTest() {
HttpOverrides.runZoned(() {
var httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
HttpOverrides.runZoned(() {
var httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
Expect.equals(myFindProxyFromEnvironment(null, null),
HttpClient.findProxyFromEnvironment(null));
}, findProxyFromEnvironment: myFindProxyFromEnvironment);
httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
}, createHttpClient: myCreateHttp1Client);
var httpClient = new HttpClient();
Expect.isTrue(httpClient is HttpClient);
Expect.isTrue(httpClient is! MyHttpClient1);
Expect.isTrue(httpClient is! MyHttpClient2);
}
zonedWithHttpOverridesTest() {
HttpOverrides.runWithHttpOverrides(() {
var httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
}, new MyHttpOverrides());
}
globalHttpOverridesTest() {
HttpOverrides.global = new MyHttpOverrides();
var httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
HttpOverrides.global = null;
httpClient = new HttpClient();
Expect.isTrue(httpClient is HttpClient);
Expect.isTrue(httpClient is! MyHttpClient1);
}
globalHttpOverridesZoneTest() {
HttpOverrides.global = new MyHttpOverrides();
runZoned(() {
runZoned(() {
var httpClient = new HttpClient();
Expect.isNotNull(httpClient);
Expect.isTrue(httpClient is MyHttpClient1);
Expect.equals((new MyHttpClient1(null)).userAgent, httpClient.userAgent);
});
});
HttpOverrides.global = null;
var httpClient = new HttpClient();
Expect.isTrue(httpClient is HttpClient);
Expect.isTrue(httpClient is! MyHttpClient1);
}
main() {
withHttpOverridesTest();
nestedWithHttpOverridesTest();
nestedDifferentOverridesTest();
zonedWithHttpOverridesTest();
globalHttpOverridesTest();
globalHttpOverridesZoneTest();
}