| 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 Future<List<PackageVersion>> fetch() async { |
| 28 Uri versionUrl = baseUrl.resolve( |
| 29 '/api/packages/${Uri.encodeComponent(package)}'); |
| 30 |
| 31 http.Response response = await client.get(versionUrl); |
| 32 var json = JSON.decode(response.body); |
| 33 var versions = json['versions']; |
| 34 if (versions != null) { |
| 35 return versions.map((Map item) { |
| 36 var pubspec = item['pubspec']; |
| 37 var pubspecString = JSON.encode(pubspec); |
| 38 return new PackageVersion( |
| 39 pubspec['name'], pubspec['version'], pubspecString); |
| 40 }).toList(); |
| 41 } |
| 42 return const []; |
| 43 } |
| 44 |
| 45 var controller = new StreamController(); |
| 46 |
| 47 fetch().then((List<PackageVersion> packageVersions) { |
| 48 for (var packageVersion in packageVersions) { |
| 49 controller.add(packageVersions); |
| 50 } |
| 51 }).catchError(controller.addError).whenComplete(controller.close); |
| 52 |
| 53 return controller.stream; |
| 54 } |
| 55 |
| 56 // TODO: Could be optimized, since we don't need to list all versions and can |
| 57 // just talk to the HTTP endpoint which gives us a specific package/version |
| 58 // combination. |
| 59 Future<PackageVersion> lookupVersion(String package, String version) { |
| 60 return versions(package) |
| 61 .where((v) => v.packageName == package && v.versionString == version) |
| 62 .toList().then((List<PackageVersion> versions) { |
| 63 if (versions.length >= 1) return versions.first; |
| 64 return null; |
| 65 }); |
| 66 } |
| 67 |
| 68 bool get supportsUpload => false; |
| 69 |
| 70 bool get supportsAsyncUpload => false; |
| 71 |
| 72 bool get supportsDownloadUrl => true; |
| 73 |
| 74 Future<Uri> downloadUrl(String package, String version) async { |
| 75 package = Uri.encodeComponent(package); |
| 76 version = Uri.encodeComponent(version); |
| 77 return baseUrl.resolve('/packages/$package/versions/$version.tar.gz'); |
| 78 } |
| 79 |
| 80 Future<Stream> download(String package, String version) async { |
| 81 _logger.info('Downloading package $package/$version.'); |
| 82 |
| 83 var url = await downloadUrl(package, version); |
| 84 var response = await client.send(new http.Request('GET', url)); |
| 85 return response.stream; |
| 86 } |
| 87 } |
| OLD | NEW |