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

Side by Side Diff: bin/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: 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
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 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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698