Skip to content

Commit

Permalink
chore: differentiate serde between servers and clients (#2220)
Browse files Browse the repository at this point in the history
* chore: update rest-json abstract methods

* chore: differentiate restJson1 empty body behavior

This adds differentation for empty body behavior in restJson1. For
responses this protocol requires always sending an empty json object
if there is some shape defined as output but nothing bound to the
body or payload.

* chore: don't pass in an isInput bool

* chore: public -> protected
  • Loading branch information
JordonPhillips committed May 12, 2021
1 parent f164177 commit deed209
Show file tree
Hide file tree
Showing 2 changed files with 210 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -139,16 +139,40 @@ private boolean usesWrappedErrorResponse(GenerationContext context) {
}

@Override
protected void writeDefaultHeaders(GenerationContext context, OperationShape operation) {
super.writeDefaultHeaders(context, operation);
protected void writeDefaultInputHeaders(GenerationContext context, OperationShape operation) {
AwsProtocolUtils.generateUnsignedPayloadSigV4Header(context, operation);
}

@Override
protected void serializeInputDocument(
protected void serializeInputDocumentBody(
GenerationContext context,
OperationShape operation,
List<HttpBinding> documentBindings
) {
serializeDocumentBody(context, documentBindings);
}

@Override
protected void serializeOutputDocumentBody(
GenerationContext context,
OperationShape operation,
List<HttpBinding> documentBindings
) {
serializeDocumentBody(context, documentBindings);
}

@Override
protected void serializeErrorDocumentBody(
GenerationContext context,
StructureShape error,
List<HttpBinding> documentBindings
) {
serializeDocumentBody(context, documentBindings);
}

private void serializeDocumentBody(
GenerationContext context,
List<HttpBinding> documentBindings
) {
// Short circuit when we have no bindings.
TypeScriptWriter writer = context.getWriter();
Expand Down Expand Up @@ -205,6 +229,34 @@ protected void serializeInputPayload(
GenerationContext context,
OperationShape operation,
HttpBinding payloadBinding
) {
super.serializeInputPayload(context, operation, payloadBinding);
serializePayload(context, payloadBinding);
}

@Override
protected void serializeOutputPayload(
GenerationContext context,
OperationShape operation,
HttpBinding payloadBinding
) {
super.serializeOutputPayload(context, operation, payloadBinding);
serializePayload(context, payloadBinding);
}

@Override
protected void serializeErrorPayload(
GenerationContext context,
StructureShape error,
HttpBinding payloadBinding
) {
super.serializeErrorPayload(context, error, payloadBinding);
serializePayload(context, payloadBinding);
}

private void serializePayload(
GenerationContext context,
HttpBinding payloadBinding
) {
SymbolProvider symbolProvider = context.getSymbolProvider();
TypeScriptWriter writer = context.getWriter();
Expand Down Expand Up @@ -252,9 +304,34 @@ protected void writeErrorCodeParser(GenerationContext context) {
}

@Override
protected void deserializeOutputDocument(
protected void deserializeInputDocumentBody(
GenerationContext context,
OperationShape operation,
List<HttpBinding> documentBindings
) {
deserializeDocumentBody(context, documentBindings);
}

@Override
protected void deserializeOutputDocumentBody(
GenerationContext context,
OperationShape operation,
List<HttpBinding> documentBindings
) {
deserializeDocumentBody(context, documentBindings);
}

@Override
protected void deserializeErrorDocumentBody(
GenerationContext context,
StructureShape error,
List<HttpBinding> documentBindings
) {
deserializeDocumentBody(context, documentBindings);
}

private void deserializeDocumentBody(
GenerationContext context,
Shape operationOrError,
List<HttpBinding> documentBindings
) {
SymbolProvider symbolProvider = context.getSymbolProvider();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,19 +87,17 @@ public void generateSharedComponents(GenerationContext context) {
}

@Override
protected void writeDefaultHeaders(GenerationContext context, OperationShape operation) {
super.writeDefaultHeaders(context, operation);
protected void writeDefaultInputHeaders(GenerationContext context, OperationShape operation) {
AwsProtocolUtils.generateUnsignedPayloadSigV4Header(context, operation);
}

@Override
protected void writeDefaultErrorHeaders(GenerationContext context, StructureShape error) {
super.writeDefaultErrorHeaders(context, error);
context.getWriter().write("'x-amzn-errortype': $S,", error.getId().getName());
}

@Override
public void serializeInputDocument(
protected void serializeInputDocumentBody(
GenerationContext context,
OperationShape operation,
List<HttpBinding> documentBindings
Expand All @@ -110,7 +108,41 @@ public void serializeInputDocument(
writer.write("body = \"\";");
return;
}
serializeDocumentBody(context, documentBindings);
}

@Override
protected void serializeOutputDocumentBody(
GenerationContext context,
OperationShape operation,
List<HttpBinding> documentBindings
) {
// Short circuit when we have no bindings.
TypeScriptWriter writer = context.getWriter();
if (documentBindings.isEmpty()) {
writer.write("body = \"{}\";");
return;
}
serializeDocumentBody(context, documentBindings);
}

@Override
protected void serializeErrorDocumentBody(
GenerationContext context,
StructureShape error,
List<HttpBinding> documentBindings
) {
// Short circuit when we have no bindings.
TypeScriptWriter writer = context.getWriter();
if (documentBindings.isEmpty()) {
writer.write("body = \"{}\";");
return;
}
serializeDocumentBody(context, documentBindings);
}

private void serializeDocumentBody(GenerationContext context, List<HttpBinding> documentBindings) {
TypeScriptWriter writer = context.getWriter();
SymbolProvider symbolProvider = context.getSymbolProvider();

writer.openBlock("body = JSON.stringify({", "});", () -> {
Expand Down Expand Up @@ -147,9 +179,34 @@ protected void serializeInputPayload(
OperationShape operation,
HttpBinding payloadBinding
) {
// We want the standard serialization, but need to alter it to JSON.
super.serializeInputPayload(context, operation, payloadBinding);
serializePayload(context, payloadBinding);
}

@Override
protected void serializeOutputPayload(
GenerationContext context,
OperationShape operation,
HttpBinding payloadBinding
) {
super.serializeOutputPayload(context, operation, payloadBinding);
serializePayload(context, payloadBinding);
}

@Override
protected void serializeErrorPayload(
GenerationContext context,
StructureShape error,
HttpBinding payloadBinding
) {
super.serializeErrorPayload(context, error, payloadBinding);
serializePayload(context, payloadBinding);
}

private void serializePayload(
GenerationContext context,
HttpBinding payloadBinding
) {
TypeScriptWriter writer = context.getWriter();
MemberShape payloadMember = payloadBinding.getMember();
Shape target = context.getModel().expectShape(payloadMember.getTarget());
Expand All @@ -172,6 +229,11 @@ private DocumentMemberSerVisitor getMemberSerVisitor(GenerationContext context,
return new JsonMemberSerVisitor(context, dataSource, getDocumentTimestampFormat());
}

protected boolean shouldWriteDefaultOutputBody(GenerationContext context, OperationShape operation) {
// Operations that have any defined output shape should always send a default body.
return operation.getOutput().isPresent();
}

@Override
protected void writeErrorCodeParser(GenerationContext context) {
TypeScriptWriter writer = context.getWriter();
Expand All @@ -181,9 +243,34 @@ protected void writeErrorCodeParser(GenerationContext context) {
}

@Override
public void deserializeOutputDocument(
protected void deserializeInputDocumentBody(
GenerationContext context,
OperationShape operation,
List<HttpBinding> documentBindings
) {
deserializeDocumentBody(context, documentBindings);
}

@Override
protected void deserializeOutputDocumentBody(
GenerationContext context,
OperationShape operation,
List<HttpBinding> documentBindings
) {
deserializeDocumentBody(context, documentBindings);
}

@Override
protected void deserializeErrorDocumentBody(
GenerationContext context,
StructureShape error,
List<HttpBinding> documentBindings
) {
deserializeDocumentBody(context, documentBindings);
}

private void deserializeDocumentBody(
GenerationContext context,
Shape operationOrError,
List<HttpBinding> documentBindings
) {
TypeScriptWriter writer = context.getWriter();
Expand All @@ -205,20 +292,50 @@ public void deserializeOutputDocument(
}
}

protected HttpBinding readResponsePayload(
@Override
protected HttpBinding deserializeInputPayload(
GenerationContext context,
OperationShape operation,
HttpBinding payloadBinding
) {
HttpBinding returnedBinding = super.deserializeInputPayload(context, operation, payloadBinding);
readPayload(context, payloadBinding);
return returnedBinding;
}

@Override
protected HttpBinding deserializeOutputPayload(
GenerationContext context,
OperationShape operation,
HttpBinding payloadBinding
) {
HttpBinding returnedBinding = super.deserializeOutputPayload(context, operation, payloadBinding);
readPayload(context, payloadBinding);
return returnedBinding;
}

@Override
protected HttpBinding deserializeErrorPayload(
GenerationContext context,
StructureShape error,
HttpBinding payloadBinding
) {
HttpBinding returnedBinding = super.deserializeErrorPayload(context, error, payloadBinding);
readPayload(context, payloadBinding);
return returnedBinding;
}

protected void readPayload(
GenerationContext context,
HttpBinding payloadBinding
) {
HttpBinding returnedBinding = super.readResponsePayload(context, payloadBinding);
TypeScriptWriter writer = context.getWriter();
Shape target = context.getModel().expectShape(payloadBinding.getMember().getTarget());

// Decode the body from a JSON string.
if (target instanceof DocumentShape) {
writer.write("contents.$L = JSON.parse(data);", payloadBinding.getMemberName());
}

return returnedBinding;
}

private DocumentMemberDeserVisitor getMemberDeserVisitor(GenerationContext context, String dataSource) {
Expand Down

0 comments on commit deed209

Please sign in to comment.