Skip to content

Commit fbabb7e

Browse files
committed
THRIFT-5774: Add remote client's IP address to ServerContext in TServerEventHandler
1 parent 68139d1 commit fbabb7e

File tree

8 files changed

+92
-3
lines changed

8 files changed

+92
-3
lines changed

lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.apache.thrift.server;
2121

2222
import java.io.IOException;
23+
import java.net.SocketAddress;
2324
import java.nio.ByteBuffer;
2425
import java.nio.channels.SelectionKey;
2526
import java.nio.channels.Selector;
@@ -31,6 +32,7 @@
3132
import org.apache.thrift.TByteArrayOutputStream;
3233
import org.apache.thrift.TException;
3334
import org.apache.thrift.protocol.TProtocol;
35+
import org.apache.thrift.transport.SocketAddressProvider;
3436
import org.apache.thrift.transport.TIOStreamTransport;
3537
import org.apache.thrift.transport.TMemoryInputTransport;
3638
import org.apache.thrift.transport.TNonblockingServerTransport;
@@ -297,6 +299,11 @@ public FrameBuffer(
297299

298300
if (eventHandler_ != null) {
299301
context_ = eventHandler_.createContext(inProt_, outProt_);
302+
SocketAddress remoteAddress =
303+
trans_ instanceof SocketAddressProvider
304+
? ((SocketAddressProvider) trans_).getRemoteSocketAddress()
305+
: null;
306+
context_.setRemoteAddress(remoteAddress);
300307
} else {
301308
context_ = null;
302309
}

lib/java/src/main/java/org/apache/thrift/server/ServerContext.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
/** Interface for storing server's connection context. */
2121
package org.apache.thrift.server;
2222

23+
import java.net.SocketAddress;
24+
2325
public interface ServerContext {
2426

2527
/**
@@ -42,4 +44,12 @@ public interface ServerContext {
4244
* unwrapped from this context.
4345
*/
4446
boolean isWrapperFor(Class<?> iface);
47+
48+
/**
49+
* Set the remote socket address for this ServerContext. The remoteAddress is null when transport
50+
* is not socket based
51+
*
52+
* @param remoteAddress The remote socket address, may be null.
53+
*/
54+
default void setRemoteAddress(SocketAddress remoteAddress) {}
4555
}

lib/java/src/main/java/org/apache/thrift/server/TSimpleServer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919

2020
package org.apache.thrift.server;
2121

22+
import java.net.SocketAddress;
2223
import org.apache.thrift.TException;
2324
import org.apache.thrift.TProcessor;
2425
import org.apache.thrift.protocol.TProtocol;
26+
import org.apache.thrift.transport.SocketAddressProvider;
2527
import org.apache.thrift.transport.TTransport;
2628
import org.apache.thrift.transport.TTransportException;
2729
import org.slf4j.Logger;
@@ -70,6 +72,11 @@ public void serve() {
7072
outputProtocol = outputProtocolFactory_.getProtocol(outputTransport);
7173
if (eventHandler_ != null) {
7274
connectionContext = eventHandler_.createContext(inputProtocol, outputProtocol);
75+
SocketAddress remoteAddress =
76+
client instanceof SocketAddressProvider
77+
? ((SocketAddressProvider) client).getRemoteSocketAddress()
78+
: null;
79+
connectionContext.setRemoteAddress(remoteAddress);
7380
}
7481
while (true) {
7582
if (eventHandler_ != null) {

lib/java/src/main/java/org/apache/thrift/server/TThreadPoolServer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.thrift.server;
2121

22+
import java.net.SocketAddress;
2223
import java.net.SocketException;
2324
import java.util.Optional;
2425
import java.util.concurrent.ExecutorService;
@@ -31,6 +32,7 @@
3132
import org.apache.thrift.TException;
3233
import org.apache.thrift.TProcessor;
3334
import org.apache.thrift.protocol.TProtocol;
35+
import org.apache.thrift.transport.SocketAddressProvider;
3436
import org.apache.thrift.transport.TServerTransport;
3537
import org.apache.thrift.transport.TTransport;
3638
import org.apache.thrift.transport.TTransportException;
@@ -239,7 +241,12 @@ public void run() {
239241
eventHandler = Optional.ofNullable(getEventHandler());
240242

241243
if (eventHandler.isPresent()) {
242-
connectionContext = eventHandler.get().createContext(inputProtocol, outputProtocol);
244+
connectionContext = eventHandler_.createContext(inputProtocol, outputProtocol);
245+
SocketAddress remoteAddress =
246+
client_ instanceof SocketAddressProvider
247+
? ((SocketAddressProvider) client_).getRemoteSocketAddress()
248+
: null;
249+
connectionContext.setRemoteAddress(remoteAddress);
243250
}
244251

245252
while (true) {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.thrift.transport;
21+
22+
import java.net.SocketAddress;
23+
24+
/** Interface that can retrieve the socket address. */
25+
public interface SocketAddressProvider {
26+
27+
SocketAddress getRemoteSocketAddress();
28+
29+
SocketAddress getLocalSocketAddress();
30+
}

lib/java/src/main/java/org/apache/thrift/transport/TNonblockingSocket.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.slf4j.LoggerFactory;
3434

3535
/** Transport for use with async client. */
36-
public class TNonblockingSocket extends TNonblockingTransport {
36+
public class TNonblockingSocket extends TNonblockingTransport implements SocketAddressProvider {
3737

3838
private static final Logger LOGGER = LoggerFactory.getLogger(TNonblockingSocket.class.getName());
3939

@@ -205,4 +205,14 @@ public String toString() {
205205
+ socketChannel_.socket().getLocalAddress()
206206
+ "]";
207207
}
208+
209+
@Override
210+
public SocketAddress getRemoteSocketAddress() {
211+
return socketChannel_.socket().getRemoteSocketAddress();
212+
}
213+
214+
@Override
215+
public SocketAddress getLocalSocketAddress() {
216+
return socketChannel_.socket().getLocalSocketAddress();
217+
}
208218
}

lib/java/src/main/java/org/apache/thrift/transport/TSocket.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@
2424
import java.io.IOException;
2525
import java.net.InetSocketAddress;
2626
import java.net.Socket;
27+
import java.net.SocketAddress;
2728
import java.net.SocketException;
2829
import org.apache.thrift.TConfiguration;
2930
import org.slf4j.Logger;
3031
import org.slf4j.LoggerFactory;
3132

3233
/** Socket implementation of the TTransport interface. To be commented soon! */
33-
public class TSocket extends TIOStreamTransport {
34+
public class TSocket extends TIOStreamTransport implements SocketAddressProvider {
3435

3536
private static final Logger LOGGER = LoggerFactory.getLogger(TSocket.class.getName());
3637

@@ -247,4 +248,14 @@ public void close() {
247248
socket_ = null;
248249
}
249250
}
251+
252+
@Override
253+
public SocketAddress getRemoteSocketAddress() {
254+
return socket_.getRemoteSocketAddress();
255+
}
256+
257+
@Override
258+
public SocketAddress getLocalSocketAddress() {
259+
return socket_.getLocalSocketAddress();
260+
}
250261
}

lib/java/src/main/java/org/apache/thrift/transport/sasl/NonblockingSaslHandler.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.apache.thrift.transport.sasl.NegotiationStatus.COMPLETE;
2323
import static org.apache.thrift.transport.sasl.NegotiationStatus.OK;
2424

25+
import java.net.SocketAddress;
2526
import java.nio.channels.SelectionKey;
2627
import java.nio.charset.StandardCharsets;
2728
import javax.security.sasl.SaslServer;
@@ -31,6 +32,7 @@
3132
import org.apache.thrift.protocol.TProtocolFactory;
3233
import org.apache.thrift.server.ServerContext;
3334
import org.apache.thrift.server.TServerEventHandler;
35+
import org.apache.thrift.transport.SocketAddressProvider;
3436
import org.apache.thrift.transport.TMemoryTransport;
3537
import org.apache.thrift.transport.TNonblockingTransport;
3638
import org.apache.thrift.transport.TTransportException;
@@ -325,6 +327,11 @@ private void executeProcessing() {
325327
if (eventHandler != null) {
326328
if (!serverContextCreated) {
327329
serverContext = eventHandler.createContext(requestProtocol, responseProtocol);
330+
SocketAddress remoteAddress =
331+
underlyingTransport instanceof SocketAddressProvider
332+
? ((SocketAddressProvider) underlyingTransport).getRemoteSocketAddress()
333+
: null;
334+
serverContext.setRemoteAddress(remoteAddress);
328335
serverContextCreated = true;
329336
}
330337
eventHandler.processContext(serverContext, memoryTransport, memoryTransport);

0 commit comments

Comments
 (0)