Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1742)

Side by Side Diff: example/src/examples/http_proxy_repository.dart

Issue 930513002: Added README, a bin/serve example server which can be used locally. (Closed) Base URL: https://github.com/dart-lang/pub_server.git@master
Patch Set: Moved to old-style async due to another mimepart stream issue, small bugfix' Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « example/src/examples/file_repository.dart ('k') | lib/shelf_pubserver.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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(packageVersion);
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 }
OLDNEW
« no previous file with comments | « example/src/examples/file_repository.dart ('k') | lib/shelf_pubserver.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698