| // 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(); | 
 | } |