feat:support polaris route for gateway mvc (#1493)
parent
a5dc460b9e
commit
0cf3d21f12
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Tencent is pleased to support the open source community by making spring-cloud-tencent available.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause License (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://opensource.org/licenses/BSD-3-Clause
|
||||||
|
*
|
||||||
|
* 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 com.tencent.cloud.polaris.router.instrument.scgmvc;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import com.tencent.cloud.common.metadata.MetadataContextHolder;
|
||||||
|
import com.tencent.cloud.metadata.provider.ServletMetadataProvider;
|
||||||
|
import com.tencent.polaris.metadata.core.MetadataType;
|
||||||
|
import com.tencent.polaris.metadata.core.constant.MetadataConstants;
|
||||||
|
import com.tencent.polaris.metadata.core.manager.CalleeMetadataContainerGroup;
|
||||||
|
import jakarta.servlet.Filter;
|
||||||
|
import jakarta.servlet.FilterChain;
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.ServletRequest;
|
||||||
|
import jakarta.servlet.ServletResponse;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import org.springframework.core.Ordered;
|
||||||
|
|
||||||
|
import static org.springframework.cloud.gateway.server.mvc.filter.FormFilter.FORM_FILTER_ORDER;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interceptor used for setting SCG MVC metadata provider.
|
||||||
|
*
|
||||||
|
* @author luguoji
|
||||||
|
*/
|
||||||
|
public class RouterLabelMvcFilter implements Filter, Ordered {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getOrder() {
|
||||||
|
return FORM_FILTER_ORDER - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new RequestData for passing router labels.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
|
||||||
|
throws IOException, ServletException {
|
||||||
|
MetadataContextHolder.get().getMetadataContainer(MetadataType.MESSAGE, false)
|
||||||
|
.setMetadataProvider(new ServletMetadataProvider((HttpServletRequest) request,
|
||||||
|
CalleeMetadataContainerGroup.getStaticApplicationMetadataContainer()
|
||||||
|
.getRawMetadataStringValue(MetadataConstants.LOCAL_IP)));
|
||||||
|
filterChain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Tencent is pleased to support the open source community by making spring-cloud-tencent available.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the BSD 3-Clause License (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://opensource.org/licenses/BSD-3-Clause
|
||||||
|
*
|
||||||
|
* 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 com.tencent.cloud.polaris.router.instrument.scgmvc;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import com.tencent.cloud.common.metadata.MetadataContextHolder;
|
||||||
|
import com.tencent.polaris.metadata.core.MessageMetadataContainer;
|
||||||
|
import com.tencent.polaris.metadata.core.MetadataContainer;
|
||||||
|
import com.tencent.polaris.metadata.core.MetadataType;
|
||||||
|
import jakarta.servlet.FilterChain;
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.mock.web.MockCookie;
|
||||||
|
import org.springframework.mock.web.MockHttpServletRequest;
|
||||||
|
import org.springframework.mock.web.MockHttpServletResponse;
|
||||||
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.fail;
|
||||||
|
import static org.springframework.cloud.gateway.server.mvc.filter.FormFilter.FORM_FILTER_ORDER;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for ${@link RouterLabelMvcFilter}.
|
||||||
|
*
|
||||||
|
* @author luguoji
|
||||||
|
*/
|
||||||
|
@ExtendWith(SpringExtension.class)
|
||||||
|
@SpringBootTest(classes = RouterLabelMvcFilterTest.TestApplication.class,
|
||||||
|
properties = {"spring.cloud.polaris.namespace=test", "spring.application.name=test", "spring.main.web-application-type=servlet", "spring.cloud.gateway.enabled=false"})
|
||||||
|
public class RouterLabelMvcFilterTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRouterLabelMvc() {
|
||||||
|
try {
|
||||||
|
RouterLabelMvcFilter routerLabelMvcFilter = new RouterLabelMvcFilter();
|
||||||
|
|
||||||
|
assertThat(routerLabelMvcFilter.getOrder())
|
||||||
|
.isEqualTo(FORM_FILTER_ORDER - 1);
|
||||||
|
|
||||||
|
FilterChain filterChain = (servletRequest, servletResponse) -> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||||
|
request.addHeader("uid", "1000");
|
||||||
|
request.setCookies(new MockCookie("k1", "v1"));
|
||||||
|
request.setMethod(HttpMethod.POST.name());
|
||||||
|
request.setRequestURI("/test/path");
|
||||||
|
request.setQueryString("q1=a1");
|
||||||
|
|
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||||
|
routerLabelMvcFilter.doFilter(request, response, filterChain);
|
||||||
|
// get message metadata container
|
||||||
|
MetadataContainer metadataContainer = MetadataContextHolder.get()
|
||||||
|
.getMetadataContainer(MetadataType.MESSAGE, false);
|
||||||
|
// method
|
||||||
|
assertThat(metadataContainer.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_METHOD)).isEqualTo(HttpMethod.POST.toString());
|
||||||
|
// path
|
||||||
|
assertThat(metadataContainer.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_PATH)).isEqualTo("/test/path");
|
||||||
|
// header
|
||||||
|
assertThat(metadataContainer.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, "uid")).isEqualTo("1000");
|
||||||
|
// cookie
|
||||||
|
assertThat(metadataContainer.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_COOKIE, "k1")).isEqualTo("v1");
|
||||||
|
// query
|
||||||
|
assertThat(metadataContainer.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_QUERY, "q1")).isEqualTo("a1");
|
||||||
|
}
|
||||||
|
catch (ServletException | IOException e) {
|
||||||
|
fail("Exception encountered.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
protected static class TestApplication {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue