JAV-432 implement get custmon address(remote address)
diff --git a/core/src/main/java/io/servicecomb/core/Const.java b/core/src/main/java/io/servicecomb/core/Const.java
index 2be06b2..004535b 100644
--- a/core/src/main/java/io/servicecomb/core/Const.java
+++ b/core/src/main/java/io/servicecomb/core/Const.java
@@ -35,4 +35,6 @@
public static final String SRC_MICROSERVICE = "x-cse-src-microservice";
public static final String TARGET_MICROSERVICE = "x-cse-target-microservice";
+
+ public static final String REMOTE_ADDRESS = "x-cse-remote-address";
}
diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/ControllerImpl.java b/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/ControllerImpl.java
index eec32a9..8e144a4 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/ControllerImpl.java
+++ b/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/ControllerImpl.java
@@ -52,7 +52,11 @@
}
@RequestMapping(path = "/sayhi", method = RequestMethod.GET)
- public String sayHi(HttpServletRequest request) {
+ public String sayHi(HttpServletRequest request) throws Exception {
+ String addr = request.getRemoteAddr();
+ if (addr == null || addr.isEmpty()) {
+ throw new Exception("Can't get remote addr!");
+ }
String[] values = request.getParameterValues("name");
if (values != null && values.length > 0 && values[0].equals("throwexception")) {
throw new RuntimeException();
diff --git a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
index a50517e..521e8dc 100644
--- a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
+++ b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
@@ -102,6 +102,11 @@
}
@Override
+ public String getRemoteAddr() {
+ return this.vertxRequest.remoteAddress().host();
+ }
+
+ @Override
public String getRemoteHost() {
return this.vertxRequest.remoteAddress().host();
}
diff --git a/providers/provider-rest-common/src/main/java/io/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java b/providers/provider-rest-common/src/main/java/io/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java
index d59e017..be8a273 100644
--- a/providers/provider-rest-common/src/main/java/io/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java
+++ b/providers/provider-rest-common/src/main/java/io/servicecomb/provider/rest/common/InvocationToHttpServletRequest.java
@@ -22,18 +22,26 @@
import io.servicecomb.common.rest.RestConst;
import io.servicecomb.common.rest.definition.RestOperationMeta;
import io.servicecomb.common.rest.definition.RestParam;
+import io.servicecomb.core.Const;
import io.servicecomb.core.Invocation;
import io.servicecomb.foundation.common.exceptions.ServiceCombException;
import io.servicecomb.foundation.vertx.http.AbstractHttpServletRequest;
+import io.vertx.core.net.SocketAddress;
public class InvocationToHttpServletRequest extends AbstractHttpServletRequest {
private RestOperationMeta swaggerOperation;
private Object[] args;
+ private SocketAddress sockerAddress;
+
public InvocationToHttpServletRequest(Invocation invocation) {
this.swaggerOperation = invocation.getOperationMeta().getExtData(RestConst.SWAGGER_REST_OPERATION);
this.args = invocation.getArgs();
+ Object remoteAddress = invocation.getHandlerContext().get(Const.REMOTE_ADDRESS);
+ if (remoteAddress != null) {
+ this.sockerAddress = (SocketAddress) remoteAddress;
+ }
}
@Override
@@ -99,4 +107,19 @@
throw new ServiceCombException("Failed to get path info.", e);
}
}
+
+ @Override
+ public String getRemoteAddr() {
+ return this.sockerAddress == null ? "" : this.sockerAddress.host();
+ }
+
+ @Override
+ public String getRemoteHost() {
+ return this.sockerAddress == null ? "" : this.sockerAddress.host();
+ }
+
+ @Override
+ public int getRemotePort() {
+ return this.sockerAddress == null ? 0 : this.sockerAddress.port();
+ }
}
diff --git a/providers/provider-rest-common/src/test/java/io/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java b/providers/provider-rest-common/src/test/java/io/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java
index 1f5e3eb..4f5c012 100644
--- a/providers/provider-rest-common/src/test/java/io/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java
+++ b/providers/provider-rest-common/src/test/java/io/servicecomb/provider/rest/common/TestInvocationToHttpServletRequest.java
@@ -17,6 +17,7 @@
package io.servicecomb.provider.rest.common;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -30,9 +31,11 @@
import io.servicecomb.common.rest.definition.RestOperationMeta;
import io.servicecomb.common.rest.definition.RestParam;
import io.servicecomb.common.rest.definition.path.URLPathBuilder;
+import io.servicecomb.core.Const;
import io.servicecomb.core.Invocation;
import io.servicecomb.core.definition.OperationMeta;
import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+import io.vertx.core.net.SocketAddress;
import mockit.Expectations;
import mockit.Mocked;
@@ -48,11 +51,17 @@
@Mocked
Object[] args;
+
+ @Mocked
+ SocketAddress socketAddress;
+
+ Map<String, Object> handlerContext = new HashMap<>();
HttpServletRequest request;
@Before
public void setup() {
+ handlerContext.put(Const.REMOTE_ADDRESS, socketAddress);
new Expectations() {
{
invocation.getOperationMeta();
@@ -61,6 +70,8 @@
result = swaggerOperation;
invocation.getArgs();
result = args;
+ invocation.getHandlerContext();
+ result = handlerContext;
}
};
@@ -263,4 +274,46 @@
Assert.assertEquals("error", e.getCause().getMessage());
}
}
+
+ @Test
+ public void testGetRemoteAddress() throws Exception {
+ new Expectations() {
+ {
+ socketAddress.host();
+ result = "127.0.0.2";
+ socketAddress.port();
+ result = 8088;
+ }
+ };
+ String addr = request.getRemoteAddr();
+ String host = request.getRemoteHost();
+ int port = request.getRemotePort();
+ Assert.assertEquals(addr, "127.0.0.2");
+ Assert.assertEquals(host, "127.0.0.2");
+ Assert.assertEquals(port, 8088);
+ }
+
+ @Test
+ public void testGetRemoteAddressEmpty(@Mocked Invocation invocation) throws Exception {
+ handlerContext.remove(Const.REMOTE_ADDRESS);
+ new Expectations() {
+ {
+ invocation.getOperationMeta();
+ result = operationMeta;
+ operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION);
+ result = swaggerOperation;
+ invocation.getArgs();
+ result = args;
+ invocation.getHandlerContext();
+ result = handlerContext;
+ }
+ };
+ InvocationToHttpServletRequest request = new InvocationToHttpServletRequest(invocation);
+ String addr = request.getRemoteAddr();
+ String host = request.getRemoteHost();
+ int port = request.getRemotePort();
+ Assert.assertEquals(addr, "");
+ Assert.assertEquals(host, "");
+ Assert.assertEquals(port, 0);
+ }
}
diff --git a/transports/transport-highway/src/main/java/io/servicecomb/transport/highway/HighwayServerInvoke.java b/transports/transport-highway/src/main/java/io/servicecomb/transport/highway/HighwayServerInvoke.java
index 010c0ef..405b22a 100644
--- a/transports/transport-highway/src/main/java/io/servicecomb/transport/highway/HighwayServerInvoke.java
+++ b/transports/transport-highway/src/main/java/io/servicecomb/transport/highway/HighwayServerInvoke.java
@@ -25,6 +25,7 @@
import io.servicecomb.codec.protobuf.definition.OperationProtobuf;
import io.servicecomb.codec.protobuf.definition.ProtobufManager;
import io.servicecomb.codec.protobuf.utils.WrapSchema;
+import io.servicecomb.core.Const;
import io.servicecomb.core.CseContext;
import io.servicecomb.core.Invocation;
import io.servicecomb.core.definition.MicroserviceMeta;
@@ -117,7 +118,7 @@
private void doRunInExecutor() throws Exception {
Invocation invocation = HighwayCodec.decodeRequest(header, operationProtobuf, bodyBuffer, protobufFeature);
-
+ invocation.getHandlerContext().put(Const.REMOTE_ADDRESS, this.connection.getNetSocket().remoteAddress());
invocation.next(response -> {
sendResponse(invocation.getContext(), response);
});