Parses a media type from its string representation. @throws IllegalArgumentException if the input is not parsable
(String input)
| 927 | |
| 928 | |
| 929 | public static MediaType parse(String input) { |
| 930 | checkNotNull(input); |
| 931 | Tokenizer tokenizer = new Tokenizer(input); |
| 932 | try { |
| 933 | String type = tokenizer.consumeToken(TOKEN_MATCHER); |
| 934 | tokenizer.consumeCharacter('/'); |
| 935 | String subtype = tokenizer.consumeToken(TOKEN_MATCHER); |
| 936 | ImmutableListMultimap.Builder<String, String> parameters = ImmutableListMultimap.builder(); |
| 937 | while (tokenizer.hasMore()) { |
| 938 | tokenizer.consumeCharacter(';'); |
| 939 | tokenizer.consumeTokenIfPresent(LINEAR_WHITE_SPACE); |
| 940 | String attribute = tokenizer.consumeToken(TOKEN_MATCHER); |
| 941 | tokenizer.consumeCharacter('='); |
| 942 | |
| 943 | final String value; |
| 944 | if ('"' == tokenizer.previewChar()) { |
| 945 | tokenizer.consumeCharacter('"'); |
| 946 | StringBuilder valueBuilder = new StringBuilder(); |
| 947 | while ('"' != tokenizer.previewChar()) { |
| 948 | if ('\\' == tokenizer.previewChar()) { |
| 949 | tokenizer.consumeCharacter('\\'); |
| 950 | valueBuilder.append(tokenizer.consumeCharacter(ascii())); |
| 951 | } else { |
| 952 | valueBuilder.append(tokenizer.consumeToken(QUOTED_TEXT_MATCHER)); |
| 953 | } |
| 954 | } |
| 955 | value = valueBuilder.toString(); |
| 956 | tokenizer.consumeCharacter('"'); |
| 957 | } else { |
| 958 | value = tokenizer.consumeToken(TOKEN_MATCHER); |
| 959 | } |
| 960 | parameters.put(attribute, value); |
| 961 | } |
| 962 | return create(type, subtype, parameters.build()); |
| 963 | } catch (IllegalStateException e) { |
| 964 | throw new IllegalArgumentException("Could not parse '" + input + "'", e); |
| 965 | } |
| 966 | } |
| 967 | |
| 968 | private static final class Tokenizer { |
| 969 | final String input; |
nothing calls this directly
no test coverage detected