Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TCK: Add a mutable version of MicronautAwsProxyRequest #1638

Merged
merged 1 commit into from
Mar 8, 2023
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 @@ -40,6 +40,10 @@
import io.micronaut.http.HttpParameters;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.MediaType;
import io.micronaut.http.MutableHttpHeaders;
import io.micronaut.http.MutableHttpParameters;
import io.micronaut.http.MutableHttpRequest;
import io.micronaut.http.cookie.Cookie;
import io.micronaut.http.cookie.Cookies;
import io.micronaut.http.simple.SimpleHttpHeaders;
import io.micronaut.http.simple.SimpleHttpParameters;
Expand Down Expand Up @@ -81,12 +85,12 @@ public class MicronautAwsProxyRequest<T> implements HttpRequest<T> {
private final AwsProxyRequest awsProxyRequest;
private final HttpMethod httpMethod;
private final MutableConvertibleValues<Object> attributes = new MutableConvertibleValuesMap<>();
private final HttpHeaders headers;
private final HttpParameters parameters;
private final MutableHttpHeaders headers;
private final MutableHttpParameters parameters;
private final String path;
private final ContainerConfig config;
private final ConversionService conversionService;
private Cookies cookies;
private SimpleCookies cookies;
private MicronautAwsProxyResponse<?> response;
private T decodedBody;

Expand Down Expand Up @@ -453,13 +457,18 @@ private String getScheme() {
return "https";
}

@Override
public MutableHttpRequest<T> mutate() {
return new MicronautAwsMutableProxyRequest();
}

/**
* Implementation of {@link HttpParameters} for AWS.
*
* @author graemerocher
* @since 1.1
*/
private class AwsParameters implements HttpParameters {
private class AwsParameters implements MutableHttpParameters {

private MultiValuedTreeMap<String, String> params = awsProxyRequest.getMultiValueQueryStringParameters();

Expand Down Expand Up @@ -501,15 +510,26 @@ public <T> Optional<T> get(CharSequence name, ArgumentConversionContext<T> conve
}
return Optional.empty();
}

@Override
public MutableHttpParameters add(CharSequence name, List<CharSequence> values) {
params.addAll(name.toString(), values.stream().map(CharSequence::toString).toList());
return this;
}

@Override
public void setConversionService(ConversionService conversionService) {
// Not used
}
}

/**
* Implementation of {@link HttpHeaders} for AWS.
*/
private static class AwsHeaders implements HttpHeaders {
private static class AwsHeaders implements MutableHttpHeaders {

private final Map<String, List<String>> headers;
private final ConversionService conversionService;
private ConversionService conversionService;

public AwsHeaders(@Nullable Headers multivalueHeaders, @Nullable SingleValueHeaders singleValueHeaders, ConversionService conversionService) {
this.conversionService = conversionService;
Expand Down Expand Up @@ -575,6 +595,25 @@ public <T> Optional<T> get(CharSequence name, ArgumentConversionContext<T> conve
}
return Optional.empty();
}

@Override
public MutableHttpHeaders add(CharSequence header, CharSequence value) {
String headerName = HttpHeaderUtils.normalizeHttpHeaderCase(header.toString());
headers.computeIfAbsent(headerName, s -> new ArrayList<>());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
headers.computeIfAbsent(headerName, s -> new ArrayList<>());
headers.computeIfAbsent(headerName, s -> new ArrayList<>()).add(value.toString());

headers.get(headerName).add(value.toString());
return this;
}

@Override
public MutableHttpHeaders remove(CharSequence header) {
headers.remove(HttpHeaderUtils.normalizeHttpHeaderCase(header.toString()));
return this;
}

@Override
public void setConversionService(ConversionService conversionService) {
this.conversionService = conversionService;
}
}

/**
Expand Down Expand Up @@ -639,4 +678,72 @@ public String getAttribute(String key) {
return attributes.get(key);
}
}

private class MicronautAwsMutableProxyRequest implements MutableHttpRequest<T> {

private URI uri = MicronautAwsProxyRequest.this.getUri();
@Nullable
private Object body;

@Override
public MutableHttpRequest<T> cookie(Cookie cookie) {
MicronautAwsProxyRequest.this.cookies.put(cookie.getName(), cookie);
return this;
}

@Override
public MutableHttpRequest<T> uri(URI uri) {
this.uri = uri;
return this;
}

@Override
public <T1> MutableHttpRequest<T1> body(T1 body) {
this.body = body;
return (MutableHttpRequest<T1>) this;
}

@Override
public MutableHttpHeaders getHeaders() {
return headers;
}

@Override
public MutableConvertibleValues<Object> getAttributes() {
return MicronautAwsProxyRequest.this.getAttributes();
}

@Override
public Optional<T> getBody() {
if (body != null) {
return Optional.of((T) body);
}
return MicronautAwsProxyRequest.this.getBody();
}

@Override
public Cookies getCookies() {
return MicronautAwsProxyRequest.this.cookies;
}

@Override
public MutableHttpParameters getParameters() {
return MicronautAwsProxyRequest.this.parameters;
}

@Override
public HttpMethod getMethod() {
return MicronautAwsProxyRequest.this.getMethod();
}

@Override
public URI getUri() {
return this.uri;
}

@Override
public void setConversionService(ConversionService conversionService) {
// ignored, we use the parent
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,8 @@
@SuiteDisplayName("HTTP Server TCK for Function AWS API Proxy")
@ExcludeClassNamePatterns({
"io.micronaut.http.server.tck.tests.RemoteAddressTest", // CaptureRemoteAddressFiter throws NPE getting the address
"io.micronaut.http.server.tck.tests.filter.ResponseFilterTest",
"io.micronaut.http.server.tck.tests.filter.RequestFilterExceptionHandlerTest",
"io.micronaut.http.server.tck.tests.filter.ClientRequestFilterTest",
"|io.micronaut.http.server.tck.tests.ErrorHandlerTest", // 2 tests Fail as CORs headers are not added to the response after deserialization fails
"io.micronaut.http.server.tck.tests.filter.RequestFilterTest",
"io.micronaut.http.server.tck.tests.BodyTest", // Fails with a multi-value publisher as the body type
"io.micronaut.http.server.tck.tests.filter.ClientResponseFilterTest"
})
Expand Down