Skip to content
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
2 changes: 2 additions & 0 deletions core/src/main/java/io/servicecomb/core/Const.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,6 @@ private Const() {
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";
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ public String saySomething(String prefix, @RequestBody Person user) {
}

@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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@ public String getScheme() {
return this.vertxRequest.scheme();
}

@Override
public String getRemoteAddr() {
return this.vertxRequest.remoteAddress().host();
}

@Override
public String getRemoteHost() {
return this.vertxRequest.remoteAddress().host();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,23 @@
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();
this.sockerAddress = (SocketAddress)invocation.getHandlerContext().get(Const.REMOTE_ADDRESS);
}

@Override
Expand Down Expand Up @@ -99,4 +104,19 @@ public String getPathInfo() {
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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -48,11 +51,17 @@ public class TestInvocationToHttpServletRequest {

@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();
Expand All @@ -61,6 +70,8 @@ public void setup() {
result = swaggerOperation;
invocation.getArgs();
result = args;
invocation.getHandlerContext();
result = handlerContext;
}
};

Expand Down Expand Up @@ -263,4 +274,46 @@ public void testGetPathInfoException(@Mocked URLPathBuilder builder) throws Exce
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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -117,7 +118,7 @@ private void runInExecutor() {

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);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import io.servicecomb.transport.common.MockUtil;
import io.servicecomb.transport.highway.message.RequestHeader;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetSocket;
import io.vertx.core.net.SocketAddress;
import mockit.Mock;
import mockit.MockUp;

Expand All @@ -45,14 +47,40 @@ public int add(int x, int y) {

private TcpConnection connection;

private NetSocket netSocket;

private SocketAddress socketAddress;

@Before
public void setup() {
unitTestMeta = new UnitTestMeta();
socketAddress = new MockUp<SocketAddress>() {
@Mock
public String host() {
return "127.0.0.1";
}

@Mock
public int port() {
return 8080;
}
}.getMockInstance();
netSocket = new MockUp<NetSocket>() {
@Mock
public SocketAddress remoteAddress() {
return socketAddress;
}
}.getMockInstance();
connection = new MockUp<TcpConnection>() {
@Mock
public void write(ByteBuf data) {
netSocketBuffer = data;
}

@Mock
public NetSocket getNetSocket() {
return netSocket;
}
}.getMockInstance();
}

Expand Down