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

Unified Diff: lib/src/source/hosted.dart

Issue 2028853002: Properly handle HTTP hosted URLs. (Closed) Base URL: git@github.com:dart-lang/pub.git@master
Patch Set: Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/source/hosted.dart
diff --git a/lib/src/source/hosted.dart b/lib/src/source/hosted.dart
index 6971e54a8310727efb5a503f81d8ce07b4154b2c..0808105a2c4ff294ab7464401aad11980b0cb1e0 100644
--- a/lib/src/source/hosted.dart
+++ b/lib/src/source/hosted.dart
@@ -7,7 +7,7 @@ import 'dart:io' as io;
import "dart:convert";
import 'package:http/http.dart' as http;
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
import '../exceptions.dart';
@@ -114,7 +114,7 @@ class HostedSource extends CachedSource {
Future<Package> downloadToSystemCache(PackageId id) async {
if (!isInSystemCache(id)) {
var packageDir = getDirectory(id);
- ensureDir(path.dirname(packageDir));
+ ensureDir(p.dirname(packageDir));
var parsed = _parseDescription(id.description);
await _download(parsed.last, parsed.first, id.version, packageDir);
}
@@ -130,7 +130,7 @@ class HostedSource extends CachedSource {
String getDirectory(PackageId id) {
var parsed = _parseDescription(id.description);
var dir = _urlToDirectory(parsed.last);
- return path.join(systemCacheRoot, dir, "${parsed.first}-${id.version}");
+ return p.join(systemCacheRoot, dir, "${parsed.first}-${id.version}");
}
String packageName(description) => _parseDescription(description).first;
@@ -162,8 +162,8 @@ class HostedSource extends CachedSource {
var failures = [];
for (var serverDir in listDir(systemCacheRoot)) {
- var url = _directoryToUrl(path.basename(serverDir));
- var packages = _getCachedPackagesInDirectory(path.basename(serverDir));
+ var url = _directoryToUrl(p.basename(serverDir));
+ var packages = _getCachedPackagesInDirectory(p.basename(serverDir));
packages.sort(Package.orderByNameAndVersion);
for (var package in packages) {
@@ -197,7 +197,7 @@ class HostedSource extends CachedSource {
/// Gets all of the packages that have been downloaded into the system cache
/// into [dir].
List<Package> _getCachedPackagesInDirectory(String dir) {
- var cacheDir = path.join(systemCacheRoot, dir);
+ var cacheDir = p.join(systemCacheRoot, dir);
if (!dirExists(cacheDir)) return [];
return listDir(cacheDir)
@@ -263,12 +263,12 @@ class OfflineHostedSource extends HostedSource {
log.io("Finding versions of ${ref.name} in "
"$systemCacheRoot/${_urlToDirectory(server)}");
- var dir = path.join(systemCacheRoot, _urlToDirectory(server));
+ var dir = p.join(systemCacheRoot, _urlToDirectory(server));
var versions;
if (dirExists(dir)) {
versions = await listDir(dir).map((entry) {
- var components = path.basename(entry).split("-");
+ var components = p.basename(entry).split("-");
if (components.first != ref.name) return null;
return HostedSource.idFor(
ref.name, new Version.parse(components.skip(1).join("-")),
@@ -315,8 +315,16 @@ class OfflineHostedSource extends HostedSource {
/// This behavior is a bug, but is being preserved for compatibility.
String _urlToDirectory(String url) {
// Normalize all loopback URLs to "localhost".
- url = url.replaceAllMapped(new RegExp(r"^https?://(127\.0\.0\.1|\[::1\])?"),
- (match) => match[1] == null ? '' : 'localhost');
+ url = url.replaceAllMapped(
+ new RegExp(r"^(https?://)(127\.0\.0\.1|\[::1\]|localhost)?"),
+ (match) {
+ // Don't include the scheme for HTTPS URLs. This makes the directory names
+ // nice for the default and most recommended scheme. We also don't include
+ // it for localhost URLs, since they're always known to be HTTP.
+ var localhost = match[2] == null ? '' : 'localhost';
+ var scheme = match[1] == 'https://' || localhost.isNotEmpty ? '' : match[1];
+ return "$scheme$localhost";
+ });
return replace(url, new RegExp(r'[<>:"\\/|?*%]'),
(match) => '%${match[0].codeUnitAt(0)}');
}
@@ -336,11 +344,12 @@ String _directoryToUrl(String url) {
url = url.replaceAll("%${c.codeUnitAt(0)}", c);
}
- // Figure out the scheme.
- var scheme = "https";
+ // If the URL has an explicit scheme, use that.
+ if (url.contains("://")) return url;
- // See if it's a loopback IP address.
- if (isLoopback(url.replaceAll(new RegExp(":.*"), ""))) scheme = "http";
+ // Otherwise, default to http for localhost and https for everything else.
+ var scheme =
+ isLoopback(url.replaceAll(new RegExp(":.*"), "")) ? "http" : "https";
return "$scheme://$url";
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698