Skip to content

Commit ad02a41

Browse files
committed
Ensure that URLs passed to parser objects are canonicalized
Closes #2297
1 parent 613fb17 commit ad02a41

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

lib/src/parse/parser.dart

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:charcode/charcode.dart';
66
import 'package:meta/meta.dart';
7+
import 'package:path/path.dart' as p;
78
import 'package:source_span/source_span.dart';
89
import 'package:string_scanner/string_scanner.dart';
910

@@ -59,10 +60,27 @@ class Parser {
5960
@protected
6061
Parser(String contents,
6162
{Object? url, Logger? logger, InterpolationMap? interpolationMap})
62-
: scanner = SpanScanner(contents, sourceUrl: url),
63+
: scanner =
64+
SpanScanner(contents, sourceUrl: _canonicalizeIfRelative(url)),
6365
logger = logger ?? const Logger.stderr(),
6466
_interpolationMap = interpolationMap;
6567

68+
/// If [url] is a relative (possibly String-serialized) URL, canonicalizes it
69+
/// as a path and returns it as a URL.
70+
static Uri? _canonicalizeIfRelative(Object? urlOrString) {
71+
var url = switch (urlOrString) {
72+
null => null,
73+
Uri() => urlOrString,
74+
String() => Uri.parse(urlOrString),
75+
_ => throw ArgumentError("url $urlOrString must be a Uri or a String")
76+
};
77+
78+
return switch (url) {
79+
Uri(scheme: '') => p.toUri(canonicalize(p.fromUri(url))),
80+
_ => url
81+
};
82+
}
83+
6684
String _parseIdentifier() {
6785
return wrapSpanFormatException(() {
6886
var result = identifier();

0 commit comments

Comments
 (0)