polish
This commit is contained in:
@@ -3,4 +3,12 @@
|
|||||||
This module represents a concept of a light weight AWS forwarding proxy which deploys and interacts with existing
|
This module represents a concept of a light weight AWS forwarding proxy which deploys and interacts with existing
|
||||||
Spring Boot web application deployed as AWS Lambda.
|
Spring Boot web application deployed as AWS Lambda.
|
||||||
|
|
||||||
A sample is provided in `/sample` directory
|
|
||||||
|
A sample is provided in [sample](https://github.com/spring-cloud/spring-cloud-function/tree/serverless-web/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/sample/pet-store) directory. It contain README and SAM template file to simplify the deployment. This module is identified as the only additional dependnecy to the existing web-app.
|
||||||
|
|
||||||
|
_NOTE: Although this module is AWS specific, this dependency is protocol only (not binary), therefore there is no AWS dependnecies._
|
||||||
|
|
||||||
|
The aformentioned proxy is identified as AWS Lambda [handler](https://github.com/spring-cloud/spring-cloud-function/blob/serverless-web/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/sample/pet-store/template.yml#L14)
|
||||||
|
|
||||||
|
The main Spring Boot configuration file is identified as [MAIN_CLASS](https://github.com/spring-cloud/spring-cloud-function/blob/serverless-web/spring-cloud-function-adapters/spring-cloud-function-adapter-aws-web/sample/pet-store/template.yml#L22)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
package org.springframework.web.client;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
|
||||||
|
import javax.servlet.ServletConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
|
import org.springframework.cloud.function.adapter.aws.web.FunctionClassUtils;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
|
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
||||||
|
import org.springframework.web.servlet.DispatcherServlet;
|
||||||
|
|
||||||
|
public class WebProxyUtils {
|
||||||
|
|
||||||
|
public static ProxyMvc buildMvcProxy(Class<?>... componentClasses) {
|
||||||
|
if (ObjectUtils.isEmpty(componentClasses)) {
|
||||||
|
Class<?> startClass = FunctionClassUtils.getStartClass();
|
||||||
|
if (startClass != null) {
|
||||||
|
componentClasses = new Class[] {startClass};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new IllegalStateException("Failed to discover component classes");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AnnotationConfigWebApplicationContext applpicationContext = new AnnotationConfigWebApplicationContext();
|
||||||
|
applpicationContext.register(componentClasses);
|
||||||
|
|
||||||
|
ServletContext servletContext = new ProxyServletContext();
|
||||||
|
ServletConfig servletConfig = new ProxyServletConfig(servletContext);
|
||||||
|
|
||||||
|
DispatcherServlet servlet = new DispatcherServlet(applpicationContext);
|
||||||
|
try {
|
||||||
|
servlet.init(servletConfig);
|
||||||
|
return new ProxyMvc(servlet, applpicationContext);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
throw new IllegalStateException("Failed to create MVC Proxy", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ProxyServletConfig implements ServletConfig {
|
||||||
|
|
||||||
|
private final ServletContext servletContext;
|
||||||
|
|
||||||
|
ProxyServletConfig(ServletContext servletContext) {
|
||||||
|
this.servletContext = servletContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getServletName() {
|
||||||
|
return "serverless-proxy";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServletContext getServletContext() {
|
||||||
|
return this.servletContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Enumeration<String> getInitParameterNames() {
|
||||||
|
return Collections.enumeration(new ArrayList<String>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getInitParameter(String name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
package org.springframework.cloud.function.adapter.aws.web;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.web.client.ProxyHttpServletRequest;
|
||||||
|
import org.springframework.web.client.ProxyHttpServletResponse;
|
||||||
|
import org.springframework.web.client.ProxyMvc;
|
||||||
|
import org.springframework.web.client.WebProxyUtils;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.ResolvedType;
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
public class RequestResponseTests {
|
||||||
|
|
||||||
|
private ObjectMapper mapper = new ObjectMapper();
|
||||||
|
|
||||||
|
private ProxyMvc mvc;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void before() {
|
||||||
|
this.mvc = WebProxyUtils.buildMvcProxy(PetStoreSpringAppConfig.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void after() {
|
||||||
|
this.mvc.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateGetListOfPojos() throws Exception {
|
||||||
|
HttpServletRequest request = new ProxyHttpServletRequest(null, "GET", "/pets");
|
||||||
|
ProxyHttpServletResponse response = new ProxyHttpServletResponse();
|
||||||
|
mvc.service(request, response);
|
||||||
|
TypeReference<List<Pet>> tr = new TypeReference<List<Pet>>() {
|
||||||
|
};
|
||||||
|
List<Pet> pets = mapper.readValue(response.getContentAsByteArray(), tr);
|
||||||
|
assertThat(pets.size()).isEqualTo(10);
|
||||||
|
assertThat(pets.get(0)).isInstanceOf(Pet.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateGetPojo() throws Exception {
|
||||||
|
HttpServletRequest request = new ProxyHttpServletRequest(null, "GET", "/pets/6e3cc370-892f-4efe-a9eb-82926ff8cc5b");
|
||||||
|
ProxyHttpServletResponse response = new ProxyHttpServletResponse();
|
||||||
|
mvc.service(request, response);
|
||||||
|
Pet pet = mapper.readValue(response.getContentAsByteArray(), Pet.class);
|
||||||
|
assertThat(pet).isNotNull();
|
||||||
|
assertThat(pet.getName()).isNotEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validatePost() throws Exception {
|
||||||
|
ProxyHttpServletRequest request = new ProxyHttpServletRequest(null, "POST", "/pets/");
|
||||||
|
String jsonPet = "{\n"
|
||||||
|
+ " \"id\":\"1234\",\n"
|
||||||
|
+ " \"breed\":\"Canish\",\n"
|
||||||
|
+ " \"name\":\"Foo\",\n"
|
||||||
|
+ " \"date\":\"2012-04-23T18:25:43.511Z\"\n"
|
||||||
|
+ "}";
|
||||||
|
request.setContent(jsonPet.getBytes());
|
||||||
|
request.setContentType("application/json");
|
||||||
|
ProxyHttpServletResponse response = new ProxyHttpServletResponse();
|
||||||
|
mvc.service(request, response);
|
||||||
|
Pet pet = mapper.readValue(response.getContentAsByteArray(), Pet.class);
|
||||||
|
assertThat(pet).isNotNull();
|
||||||
|
assertThat(pet.getName()).isNotEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user