Parses a media type from its string representation. @throws IllegalArgumentException if the input is not parsable
(String input)
| 1100 | * @throws IllegalArgumentException if the input is not parsable |
| 1101 | */ |
| 1102 | @CanIgnoreReturnValue // TODO(b/219820829): consider removing |
| 1103 | public static MediaType parse(String input) { |
| 1104 | checkNotNull(input); |
| 1105 | Tokenizer tokenizer = new Tokenizer(input); |
| 1106 | try { |
| 1107 | String type = tokenizer.consumeToken(TOKEN_MATCHER); |
| 1108 | consumeSeparator(tokenizer, '/'); |
| 1109 | String subtype = tokenizer.consumeToken(TOKEN_MATCHER); |
| 1110 | ImmutableListMultimap.Builder<String, String> parameters = ImmutableListMultimap.builder(); |
| 1111 | while (tokenizer.hasMore()) { |
| 1112 | consumeSeparator(tokenizer, ';'); |
| 1113 | String attribute = tokenizer.consumeToken(TOKEN_MATCHER); |
| 1114 | consumeSeparator(tokenizer, '='); |
| 1115 | String value; |
| 1116 | if (tokenizer.previewChar() == '"') { |
| 1117 | tokenizer.consumeCharacter('"'); |
| 1118 | StringBuilder valueBuilder = new StringBuilder(); |
| 1119 | while (tokenizer.previewChar() != '"') { |
| 1120 | if (tokenizer.previewChar() == '\\') { |
| 1121 | tokenizer.consumeCharacter('\\'); |
| 1122 | valueBuilder.append(tokenizer.consumeCharacter(ascii())); |
| 1123 | } else { |
| 1124 | valueBuilder.append(tokenizer.consumeToken(QUOTED_TEXT_MATCHER)); |
| 1125 | } |
| 1126 | } |
| 1127 | value = valueBuilder.toString(); |
| 1128 | tokenizer.consumeCharacter('"'); |
| 1129 | } else { |
| 1130 | value = tokenizer.consumeToken(TOKEN_MATCHER); |
| 1131 | } |
| 1132 | parameters.put(attribute, value); |
| 1133 | } |
| 1134 | return create(type, subtype, parameters.build()); |
| 1135 | } catch (IllegalStateException e) { |
| 1136 | throw new IllegalArgumentException("Could not parse '" + input + "'", e); |
| 1137 | } |
| 1138 | } |
| 1139 | |
| 1140 | private static void consumeSeparator(Tokenizer tokenizer, char c) { |
| 1141 | tokenizer.consumeTokenIfPresent(LINEAR_WHITE_SPACE); |