Index: pkg/http_throttle/lib/http_throttle.dart |
diff --git a/pkg/http_throttle/lib/http_throttle.dart b/pkg/http_throttle/lib/http_throttle.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7cd95a6b40696a46bd4c03d1ff7d78e59598a28c |
--- /dev/null |
+++ b/pkg/http_throttle/lib/http_throttle.dart |
@@ -0,0 +1,50 @@ |
+// Copyright (c) 2014, 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. |
+ |
+library http_throttle; |
+ |
+import 'dart:async'; |
+ |
+import 'package:http/http.dart'; |
+import 'package:pool/pool.dart'; |
+ |
+/// A middleware client that throttles the number of concurrent requests. |
+/// |
+/// As long as the number of requests is within the limit, this works just like |
+/// a normal client. If a request is made beyond the limit, the underlying HTTP |
+/// request won't be sent until other requests have completed. |
+class ThrottleClient extends BaseClient { |
+ final Pool _pool; |
+ final Client _inner; |
+ |
+ /// Creates a new client that allows no more than [maxActiveRequests] |
+ /// concurrent requests. |
+ /// |
+ /// If [inner] is passed, it's used as the inner client for sending HTTP |
+ /// requests. It defaults to `new http.Client()`. |
+ ThrottleClient(int maxActiveRequests, [Client inner]) |
+ : _pool = new Pool(maxActiveRequests), |
+ _inner = inner == null ? new Client() : inner; |
+ |
+ Future<StreamedResponse> send(BaseRequest request) { |
+ return _pool.request().then((resource) { |
+ return _inner.send(request).then((response) { |
+ var stream = response.stream.transform( |
+ new StreamTransformer.fromHandlers(handleDone: (sink) { |
+ resource.release(); |
+ sink.close(); |
+ })); |
+ return new StreamedResponse(stream, response.statusCode, |
+ contentLength: response.contentLength, |
+ request: response.request, |
+ headers: response.headers, |
+ isRedirect: response.isRedirect, |
+ persistentConnection: response.persistentConnection, |
+ reasonPhrase: response.reasonPhrase); |
+ }); |
+ }); |
+ } |
+ |
+ void close() => _inner.close(); |
+} |