| Index: pkg/shelf/lib/src/media_type.dart
|
| diff --git a/pkg/shelf/lib/src/media_type.dart b/pkg/shelf/lib/src/media_type.dart
|
| index 595fc9aca3f2affaad41a7eaa6aab2725a5b2922..a1f5ed260e7fb96c7729b2c0c04e912abc8bdf46 100644
|
| --- a/pkg/shelf/lib/src/media_type.dart
|
| +++ b/pkg/shelf/lib/src/media_type.dart
|
| @@ -5,8 +5,7 @@
|
| library shelf.media_type;
|
|
|
| import 'package:collection/collection.dart';
|
| -
|
| -import 'string_scanner.dart';
|
| +import 'package:string_scanner/string_scanner.dart';
|
|
|
| // All of the following regular expressions come from section 2.2 of the HTTP
|
| // spec: http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html
|
| @@ -48,40 +47,43 @@ class MediaType {
|
| factory MediaType.parse(String mediaType) {
|
| // This parsing is based on sections 3.6 and 3.7 of the HTTP spec:
|
| // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html.
|
| - var errorMessage = 'Invalid media type "$mediaType".';
|
| - var scanner = new StringScanner(mediaType);
|
| - scanner.scan(_whitespace);
|
| - scanner.expect(_token, errorMessage);
|
| - var type = scanner.lastMatch[0];
|
| - scanner.expect('/', errorMessage);
|
| - scanner.expect(_token, errorMessage);
|
| - var subtype = scanner.lastMatch[0];
|
| - scanner.scan(_whitespace);
|
| -
|
| - var parameters = {};
|
| - while (scanner.scan(';')) {
|
| + try {
|
| + var scanner = new StringScanner(mediaType);
|
| + scanner.scan(_whitespace);
|
| + scanner.expect(_token);
|
| + var type = scanner.lastMatch[0];
|
| + scanner.expect('/');
|
| + scanner.expect(_token);
|
| + var subtype = scanner.lastMatch[0];
|
| scanner.scan(_whitespace);
|
| - scanner.expect(_token, errorMessage);
|
| - var attribute = scanner.lastMatch[0];
|
| - scanner.expect('=', errorMessage);
|
|
|
| - var value;
|
| - if (scanner.scan(_token)) {
|
| - value = scanner.lastMatch[0];
|
| - } else {
|
| - scanner.expect(_quotedString, errorMessage);
|
| - var quotedString = scanner.lastMatch[0];
|
| - value = quotedString.substring(1, quotedString.length - 1).
|
| - replaceAllMapped(_quotedPair, (match) => match[1]);
|
| + var parameters = {};
|
| + while (scanner.scan(';')) {
|
| + scanner.scan(_whitespace);
|
| + scanner.expect(_token);
|
| + var attribute = scanner.lastMatch[0];
|
| + scanner.expect('=');
|
| +
|
| + var value;
|
| + if (scanner.scan(_token)) {
|
| + value = scanner.lastMatch[0];
|
| + } else {
|
| + scanner.expect(_quotedString);
|
| + var quotedString = scanner.lastMatch[0];
|
| + value = quotedString.substring(1, quotedString.length - 1).
|
| + replaceAllMapped(_quotedPair, (match) => match[1]);
|
| + }
|
| +
|
| + scanner.scan(_whitespace);
|
| + parameters[attribute] = value;
|
| }
|
|
|
| - scanner.scan(_whitespace);
|
| - parameters[attribute] = value;
|
| + scanner.expectDone();
|
| + return new MediaType(type, subtype, parameters);
|
| + } on FormatException catch (error) {
|
| + throw new FormatException(
|
| + 'Invalid media type "$mediaType": ${error.message}');
|
| }
|
| -
|
| - if (!scanner.isDone) throw new FormatException(errorMessage);
|
| -
|
| - return new MediaType(type, subtype, parameters);
|
| }
|
|
|
| MediaType(this.type, this.subtype, [Map<String, String> parameters])
|
|
|