Protobuf: Enhance textual content-types detection (#444)
- Move content-type introspection in a separate support class. - Add unit tests to ensure introspection is correct. Signed-off-by: Day, Jeremy(jday) <jday@paypal.com>
This commit is contained in:
parent
4784f03e8c
commit
a4bc7a8368
|
@ -77,15 +77,6 @@ class ProtoSerializer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The proto spec says all text data should go into the text field. It is really difficult to figure out every case
|
|
||||||
// of text data based on the media type though, so I am just going to check for some common cases.
|
|
||||||
private static boolean isTextType(String type) {
|
|
||||||
if (type == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return type.startsWith("text/") || "application/json".equals(type) || "application/xml".equals(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a {@link CloudEventContextWriter} that will allow setting the attributes within a Protobuf object.
|
* Defines a {@link CloudEventContextWriter} that will allow setting the attributes within a Protobuf object.
|
||||||
*/
|
*/
|
||||||
|
@ -272,9 +263,16 @@ class ProtoSerializer {
|
||||||
throw CloudEventRWException.newDataConversion(e, "byte[]", "com.google.protobuf.Any");
|
throw CloudEventRWException.newDataConversion(e, "byte[]", "com.google.protobuf.Any");
|
||||||
}
|
}
|
||||||
protoBuilder.setProtoData(dataAsAny);
|
protoBuilder.setProtoData(dataAsAny);
|
||||||
} else if (isTextType(dataContentType)) {
|
} else if (ProtoSupport.isTextContent(dataContentType)) {
|
||||||
|
/**
|
||||||
|
* The protobuf format specification states that textual data must
|
||||||
|
* be carried in the 'text_data' field.
|
||||||
|
*/
|
||||||
protoBuilder.setTextDataBytes(ByteString.copyFrom(data.toBytes()));
|
protoBuilder.setTextDataBytes(ByteString.copyFrom(data.toBytes()));
|
||||||
} else {
|
} else {
|
||||||
|
/**
|
||||||
|
* All other content is assumed to be binary.
|
||||||
|
*/
|
||||||
ByteString byteString = ByteString.copyFrom(data.toBytes());
|
ByteString byteString = ByteString.copyFrom(data.toBytes());
|
||||||
protoBuilder.setBinaryData(byteString);
|
protoBuilder.setBinaryData(byteString);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018-Present The CloudEvents Authors
|
||||||
|
* <p>
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* <p>
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* <p>
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.cloudevents.protobuf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* General support functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
final class ProtoSupport {
|
||||||
|
|
||||||
|
// Prevent Instantiation
|
||||||
|
private ProtoSupport() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the given content type indicates that
|
||||||
|
* content is textual.
|
||||||
|
*/
|
||||||
|
static boolean isTextContent(String contentType) {
|
||||||
|
|
||||||
|
if (contentType == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return contentType.startsWith("text/")
|
||||||
|
|| "application/json".equals(contentType)
|
||||||
|
|| "application/xml".equals(contentType)
|
||||||
|
|| contentType.endsWith("+json")
|
||||||
|
|| contentType.endsWith("+xml")
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018-Present The CloudEvents Authors
|
||||||
|
* <p>
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* <p>
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* <p>
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.cloudevents.protobuf;
|
||||||
|
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.Arguments;
|
||||||
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
public class ProtoSupportTest {
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@MethodSource("textContentArguments")
|
||||||
|
public void serialize(String contentType, boolean isText) throws IOException {
|
||||||
|
|
||||||
|
assertThat(isText).isEqualTo(ProtoSupport.isTextContent(contentType));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test Data set for contentType text determination.
|
||||||
|
public static Stream<Arguments> textContentArguments() {
|
||||||
|
return Stream.of(
|
||||||
|
Arguments.of("application/json", true),
|
||||||
|
Arguments.of("application/xml", true),
|
||||||
|
Arguments.of("text/plain", true),
|
||||||
|
Arguments.of("application/protobuf", false),
|
||||||
|
Arguments.of("application/fubar+xml", true),
|
||||||
|
Arguments.of("application/fubar+json", true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue