Skip to content

Commit

Permalink
Fixed media type parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
robtimus committed Jul 28, 2023
1 parent 2bb05f1 commit 7b8b40b
Show file tree
Hide file tree
Showing 5 changed files with 851 additions and 698 deletions.
11 changes: 11 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@
<url>https://github.com/robtimus/data-url/issues</url>
</issueManagement>

<properties>
<version.commons-io>2.13.0</version.commons-io>
</properties>

<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
Expand All @@ -79,6 +83,13 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${version.commons-io}</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ public final class DataURLs {
private static final Handler SHARED_HANDLER = new Handler();

private DataURLs() {
throw new InternalError("cannot create instances of " + getClass().getName()); //$NON-NLS-1$
}

/**
Expand Down Expand Up @@ -122,15 +121,11 @@ private static void copyData(Reader data, StringBuilder dest) {
}
}

private static void copyData(InputStream data, OutputStream dest) {
private static void copyData(InputStream data, OutputStream dest) throws IOException {
byte[] buffer = new byte[4096];
int len;
try {
while ((len = data.read(buffer)) != -1) {
dest.write(buffer, 0, len);
}
} catch (IOException e) {
throw new UncheckedIOException(e);
while ((len = data.read(buffer)) != -1) {
dest.write(buffer, 0, len);
}
}

Expand Down
33 changes: 20 additions & 13 deletions src/main/java/com/github/robtimus/net/protocol/data/MediaType.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ private MediaType(String mediaTypeString, String mimeType, Map<String, String> p
}

static MediaType create(String mimeType, Map<String, String> parameters) {
validateMimeType(mimeType, 0, mimeType.length());
validateMimeType(mimeType);

String mediaTypeString = buildMediaTypeString(mimeType, parameters);
return new MediaType(mediaTypeString, mimeType, new LinkedHashMap<>(parameters));
Expand Down Expand Up @@ -86,32 +86,35 @@ private static void appendValue(String value, StringBuilder mediaType) {
}
}

static MediaType parse(String type) {
return parse(type, 0, type.length());
static MediaType parse(String source, int start, int end) {
return parse(source.substring(start, end));
}

static MediaType parse(String type, int start, int end) {
int index = type.indexOf(';', start);
if (isNotFound(index, end)) {
validateMimeType(type, start, end);
String mimeType = type.substring(start, end);
return new MediaType(mimeType, mimeType, Collections.emptyMap());
static MediaType parse(String type) {
int index = type.indexOf(';');
if (isNotFound(index)) {
validateMimeType(type);
return new MediaType(type, type, Collections.emptyMap());
}

int mimeTypeStart = start;
int mimeTypeStart = 0;
int mimeTypeEnd = index;

validateMimeType(type, mimeTypeStart, mimeTypeEnd);

int paramStart = skipStartingWhitespace(type, index + 1, end);
int paramEnd = end;
int paramEnd = type.length();
int paramStart = skipStartingWhitespace(type, index + 1, paramEnd);

Map<String, String> parameters = parseParameters(type, paramStart, paramEnd);
String mimeType = type.substring(mimeTypeStart, mimeTypeEnd);

return new MediaType(type, mimeType, parameters);
}

private static void validateMimeType(String mimeType) {
validateMimeType(mimeType, 0, mimeType.length());
}

private static void validateMimeType(String mimeType, int start, int end) {
if (!MIME_TYPE_PATTERN.matcher(mimeType).region(start, end).matches()) {
throw new IllegalArgumentException(Messages.mediaType.invalidMimeType(mimeType));
Expand Down Expand Up @@ -197,8 +200,12 @@ private static int getNameEnd(String params, int start, int end) {
return Math.min(indexOfEquals, indexOfSemicolon);
}

private static boolean isNotFound(int index) {
return index == -1;
}

private static boolean isNotFound(int index, int end) {
return index == -1 || index >= end;
return isNotFound(index) || index >= end;
}

private static int skipStartingWhitespace(String s, int index, int end) {
Expand Down

0 comments on commit 7b8b40b

Please sign in to comment.