Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 library appengine_pub.http_proxy_repository; | |
| 6 | |
| 7 import 'dart:async'; | |
| 8 import 'dart:convert'; | |
| 9 | |
| 10 import 'package:http/http.dart' as http; | |
| 11 import 'package:logging/logging.dart'; | |
| 12 import 'package:pub_server/repository.dart'; | |
| 13 | |
| 14 final Logger _logger = new Logger('pub_server.http_proxy_repository'); | |
| 15 | |
| 16 /// Implements the [PackageRepository] by talking to a remote HTTP server via | |
| 17 /// the pub HTTP API. | |
| 18 /// | |
| 19 /// This [PackageRepository] does not support uploading so far. | |
| 20 class HttpProxyRepository extends PackageRepository { | |
| 21 final http.Client client; | |
| 22 final Uri baseUrl; | |
| 23 | |
| 24 HttpProxyRepository(this.client, this.baseUrl); | |
| 25 | |
| 26 Stream<PackageVersion> versions(String package) { | |
| 27 Uri versionUrl = baseUrl.resolve( | |
| 28 '/api/packages/${Uri.encodeComponent(package)}'); | |
| 29 | |
| 30 bool done = false; | |
| 31 | |
| 32 Future<List<PackageVersion>> nextPage() async { | |
| 33 if (done) return null; | |
| 34 | |
| 35 done = true; | |
| 36 http.Response response = await client.get(versionUrl); | |
| 37 var json = JSON.decode(response.body); | |
| 38 var versions = json['versions']; | |
| 39 if (versions != null) { | |
| 40 return versions.map((Map item) { | |
| 41 var pubspec = item['pubspec']; | |
| 42 var pubspecString = JSON.encode(pubspec); | |
| 43 return new PackageVersion( | |
| 44 pubspec['name'], pubspec['version'], pubspecString); | |
| 45 }).toList(); | |
| 46 } | |
| 47 return const []; | |
| 48 } | |
| 49 return _streamViaPaging(nextPage); | |
|
Søren Gjesse
2015/02/16 10:23:54
Why are you using _streamViaPaging? There is alway
kustermann
2015/02/16 11:42:10
Good point.
This was old code from when I had the
| |
| 50 } | |
| 51 | |
| 52 // TODO: Could be optimized, since we don't need to list all versions and can | |
| 53 // just talk to the HTTP endpoint which gives us a specific package/version | |
| 54 // combination. | |
| 55 Future<PackageVersion> lookupVersion(String package, String version) { | |
| 56 return versions(package) | |
| 57 .where((v) => v.packageName == package && v.versionString == version) | |
| 58 .toList().then((List<PackageVersion> versions) { | |
| 59 if (versions.length >= 1) return versions.first; | |
| 60 return null; | |
| 61 }); | |
| 62 } | |
| 63 | |
| 64 bool get supportsUpload => false; | |
| 65 | |
| 66 bool get supportsAsyncUpload => false; | |
| 67 | |
| 68 bool get supportsDownloadUrl => true; | |
| 69 | |
| 70 Future<Uri> downloadUrl(String package, String version) async { | |
| 71 package = Uri.encodeComponent(package); | |
| 72 version = Uri.encodeComponent(version); | |
| 73 return baseUrl.resolve('/packages/$package/versions/$version.tar.gz'); | |
| 74 } | |
| 75 | |
| 76 Future<Stream> download(String package, String version) async { | |
| 77 _logger.info('Downloading package $package/$version.'); | |
| 78 | |
| 79 var url = await downloadUrl(package, version); | |
| 80 var response = await client.send(new http.Request('GET', url)); | |
| 81 return response.stream; | |
| 82 } | |
| 83 } | |
| 84 | |
| 85 Stream _streamViaPaging(Future nextPage()) { | |
| 86 var controller; | |
| 87 | |
| 88 bool fetching = false; | |
| 89 bool paused = false; | |
| 90 bool canceled = false; | |
| 91 | |
| 92 fetch() async { | |
| 93 if (!fetching && !paused && !canceled) { | |
| 94 fetching = true; | |
| 95 var items = await nextPage(); | |
| 96 if (items == null) { | |
| 97 controller.close(); | |
| 98 } else { | |
| 99 for (var item in items) { | |
| 100 controller.add(item); | |
| 101 } | |
| 102 fetching = false; | |
| 103 fetch(); | |
| 104 } | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 onListen() => fetch(); | |
| 109 onPause() { | |
| 110 paused = true; | |
| 111 } | |
| 112 onResume() { | |
| 113 paused = false; | |
| 114 fetch(); | |
| 115 } | |
| 116 onCancel() { | |
| 117 canceled = true; | |
| 118 controller.close(); | |
| 119 } | |
| 120 | |
| 121 controller = new StreamController(onListen: onListen, | |
| 122 onPause: onPause, | |
| 123 onResume: onResume, | |
| 124 onCancel: onCancel); | |
| 125 return controller.stream; | |
| 126 } | |
| OLD | NEW |