|  | // 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. | 
|  |  | 
|  | import 'dart:async'; | 
|  | import 'dart:io'; | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | class MyHttpClient1 implements HttpClient { | 
|  | String? userAgent = "MyHttpClient1"; | 
|  |  | 
|  | MyHttpClient1(SecurityContext? context); | 
|  |  | 
|  | Duration idleTimeout = Duration.zero; | 
|  | Duration? connectionTimeout; | 
|  | int? maxConnectionsPerHost; | 
|  | bool autoUncompress = true; | 
|  | bool enableTimelineLogging = false; | 
|  |  | 
|  | Future<HttpClientRequest> open( | 
|  | String method, | 
|  | String host, | 
|  | int port, | 
|  | String path, | 
|  | ) => throw ""; | 
|  | Future<HttpClientRequest> openUrl(String method, Uri url) => throw ""; | 
|  | Future<HttpClientRequest> get(String host, int port, String path) => throw ""; | 
|  | Future<HttpClientRequest> getUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> post(String host, int port, String path) => | 
|  | throw ""; | 
|  | Future<HttpClientRequest> postUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> put(String host, int port, String path) => throw ""; | 
|  | Future<HttpClientRequest> putUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> delete(String host, int port, String path) => | 
|  | throw ""; | 
|  | Future<HttpClientRequest> deleteUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> patch(String host, int port, String path) => | 
|  | throw ""; | 
|  | Future<HttpClientRequest> patchUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> head(String host, int port, String path) => | 
|  | throw ""; | 
|  | Future<HttpClientRequest> headUrl(Uri url) => throw ""; | 
|  | 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) {} | 
|  | void close({bool force = false}) {} | 
|  | } | 
|  |  | 
|  | class MyHttpClient2 implements HttpClient { | 
|  | String? userAgent = "MyHttpClient2"; | 
|  |  | 
|  | MyHttpClient2(SecurityContext? context); | 
|  |  | 
|  | Duration idleTimeout = Duration.zero; | 
|  | Duration? connectionTimeout; | 
|  | int? maxConnectionsPerHost; | 
|  | bool autoUncompress = true; | 
|  | bool enableTimelineLogging = false; | 
|  |  | 
|  | Future<HttpClientRequest> open( | 
|  | String method, | 
|  | String host, | 
|  | int port, | 
|  | String path, | 
|  | ) => throw ""; | 
|  | Future<HttpClientRequest> openUrl(String method, Uri url) => throw ""; | 
|  | Future<HttpClientRequest> get(String host, int port, String path) => throw ""; | 
|  | Future<HttpClientRequest> getUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> post(String host, int port, String path) => | 
|  | throw ""; | 
|  | Future<HttpClientRequest> postUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> put(String host, int port, String path) => throw ""; | 
|  | Future<HttpClientRequest> putUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> delete(String host, int port, String path) => | 
|  | throw ""; | 
|  | Future<HttpClientRequest> deleteUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> patch(String host, int port, String path) => | 
|  | throw ""; | 
|  | Future<HttpClientRequest> patchUrl(Uri url) => throw ""; | 
|  | Future<HttpClientRequest> head(String host, int port, String path) => | 
|  | throw ""; | 
|  | Future<HttpClientRequest> headUrl(Uri url) => throw ""; | 
|  | 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) {} | 
|  | 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(new Uri(), null), | 
|  | HttpClient.findProxyFromEnvironment(new Uri()), | 
|  | ); | 
|  | }, 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(); | 
|  | } |