Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
import software.amazon.smithy.java.client.core.ClientProtocolFactory;
import software.amazon.smithy.java.client.core.ProtocolSettings;
import software.amazon.smithy.java.core.serde.Codec;
import software.amazon.smithy.java.http.api.HttpVersion;
import software.amazon.smithy.java.http.api.ModifiableHttpRequest;
import software.amazon.smithy.model.shapes.ShapeId;
import software.amazon.smithy.protocol.traits.Rpcv2CborTrait;

Expand All @@ -32,11 +30,6 @@ protected Codec codec() {
return CBOR_CODEC;
}

@Override
protected void customizeRequestBuilder(ModifiableHttpRequest builder) {
builder.setHttpVersion(HttpVersion.HTTP_2);
}

public static final class Factory implements ClientProtocolFactory<Rpcv2CborTrait> {
@Override
public ShapeId id() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import software.amazon.smithy.java.http.api.HttpRequest;
import software.amazon.smithy.java.http.api.HttpResponse;
import software.amazon.smithy.java.http.api.ModifiableHttpRequest;
import software.amazon.smithy.java.io.ByteBufferOutputStream;
import software.amazon.smithy.java.io.datastream.DataStream;
import software.amazon.smithy.java.io.uri.SmithyUri;
import software.amazon.smithy.model.shapes.ShapeId;
Expand All @@ -46,6 +45,8 @@ public abstract class AbstractRpcV2ClientProtocol extends HttpClientProtocol {
private final ShapeId service;
private final String payloadMediaType;
private final String smithyProtocolValue;
private final String targetPathPrefix;
private final ModifiableHttpRequest templateRequest;
private volatile HttpErrorDeserializer errorDeserializer;

private static final String SMITHY_PROTOCOL_PREFIX = "rpc-v2-";
Expand All @@ -67,6 +68,13 @@ protected AbstractRpcV2ClientProtocol(
this.payloadMediaType = payloadMediaType;
this.smithyProtocolValue = SMITHY_PROTOCOL_PREFIX
+ payloadMediaType.substring(MEDIA_TYPE_PREFIX_LENGTH);
this.targetPathPrefix = "/service/" + service.getName() + "/operation/";

var tmpl = HttpRequest.create();
tmpl.setMethod("POST");
tmpl.addHeader(HeaderName.SMITHY_PROTOCOL, smithyProtocolValue);
tmpl.addHeader(HeaderName.ACCEPT, payloadMediaType);
this.templateRequest = tmpl;
}

/** Returns the codec used for serialization and deserialization. */
Expand All @@ -92,42 +100,27 @@ private HttpErrorDeserializer errorDeserializer() {
return errorDeserializer;
}

/**
* Hook for subclasses to customize the request builder before headers and body are set.
* For example, the CBOR protocol uses this to force HTTP/2.
*/
protected void customizeRequestBuilder(ModifiableHttpRequest builder) {
// default: no customization
}

@Override
public <I extends SerializableStruct, O extends SerializableStruct> HttpRequest createRequest(
ApiOperation<I, O> operation,
I input,
Context context,
SmithyUri endpoint
) {
var target = "/service/" + service.getName() + "/operation/" + operation.schema().id().getName();
var builder = HttpRequest.create().setMethod("POST").setUri(endpoint.withConcatPath(target));

customizeRequestBuilder(builder);
var target = targetPathPrefix + operation.schema().id().getName();
var builder = templateRequest.toModifiableCopy();
builder.setUri(endpoint.withConcatPath(target));

if (operation.inputSchema().hasTrait(TraitKey.UNIT_TYPE_TRAIT)) {
builder.addHeader(HeaderName.SMITHY_PROTOCOL, smithyProtocolValue)
.addHeader(HeaderName.ACCEPT, payloadMediaType)
.setBody(DataStream.ofEmpty());
builder.setBody(DataStream.ofEmpty());
} else if (operation.inputEventBuilderSupplier() != null) {
var encoderFactory = getEventEncoderFactory(operation);
var body = RpcEventStreamsUtil.bodyForEventStreaming(encoderFactory, input);
builder.addHeader(HeaderName.SMITHY_PROTOCOL, smithyProtocolValue)
.addHeader(HeaderName.CONTENT_TYPE, "application/vnd.amazon.eventstream")
.addHeader(HeaderName.ACCEPT, payloadMediaType)
.setBody(body);
builder.addHeader(HeaderName.CONTENT_TYPE, "application/vnd.amazon.eventstream");
builder.setBody(body);
} else {
builder.addHeader(HeaderName.SMITHY_PROTOCOL, smithyProtocolValue)
.addHeader(HeaderName.CONTENT_TYPE, payloadMediaType)
.addHeader(HeaderName.ACCEPT, payloadMediaType)
.setBody(getBody(input));
builder.addHeader(HeaderName.CONTENT_TYPE, payloadMediaType);
builder.setBody(getBody(input));
}
return builder;
}
Expand Down Expand Up @@ -166,11 +159,7 @@ private static DataStream bodyDataStream(HttpResponse response) {
}

private DataStream getBody(SerializableStruct input) {
var sink = new ByteBufferOutputStream();
try (var serializer = codec().createSerializer(sink)) {
input.serialize(serializer);
}
return DataStream.ofByteBuffer(sink.toByteBuffer(), payloadMediaType);
return DataStream.ofByteBuffer(codec().serialize(input), payloadMediaType);
}

private EventEncoderFactory<AwsEventFrame> getEventEncoderFactory(ApiOperation<?, ?> operation) {
Expand Down
Loading