use of org.tinyradius.core.packet.response.RadiusResponse in project tinyradius-netty by globalreachtech.
the class ProxyHandler method channelRead0.
@Override
protected void channelRead0(ChannelHandlerContext ctx, RequestCtx msg) {
final RadiusRequest request = msg.getRequest();
RadiusEndpoint clientEndpoint = msg.getEndpoint();
Optional<RadiusEndpoint> serverEndpoint = getProxyServer(request, clientEndpoint);
if (!serverEndpoint.isPresent()) {
logger.info("Server not found for client proxy request, ignoring");
return;
}
logger.debug("Proxying packet to {}", serverEndpoint.get().getAddress());
radiusClient.communicate(request, serverEndpoint.get()).addListener(f -> {
final RadiusResponse packet = (RadiusResponse) f.getNow();
if (f.isSuccess() && packet != null) {
final RadiusResponse response = RadiusResponse.create(request.getDictionary(), packet.getType(), packet.getId(), packet.getAuthenticator(), packet.getAttributes());
ctx.writeAndFlush(msg.withResponse(response));
}
});
}
use of org.tinyradius.core.packet.response.RadiusResponse in project tinyradius-netty by globalreachtech.
the class ClientDatagramCodec method decode.
@Override
protected void decode(ChannelHandlerContext ctx, DatagramPacket msg, List<Object> out) {
final InetSocketAddress remoteAddress = msg.sender();
if (remoteAddress == null) {
logger.warn("Ignoring response, remoteAddress is null");
return;
}
try {
RadiusResponse response = fromDatagram(dictionary, msg);
logger.debug("Received packet from {} - {}", remoteAddress, response);
out.add(response);
} catch (RadiusPacketException e) {
logger.warn("Could not deserialize packet: {}", e.getMessage());
}
}
use of org.tinyradius.core.packet.response.RadiusResponse in project tinyradius-netty by globalreachtech.
the class RadiusClientTest method communicateEndpointListFirstSuccess.
@Test
void communicateEndpointListFirstSuccess() throws RadiusPacketException {
final byte id = (byte) random.nextInt(256);
final RadiusResponse response = RadiusResponse.create(DefaultDictionary.INSTANCE, (byte) 2, id, null, Collections.emptyList());
final CapturingOutboundHandler capturingOutboundHandler = spy(new CapturingOutboundHandler(p -> p.trySuccess(response)));
final RadiusClient radiusClient = new RadiusClient(bootstrap, address, timeoutHandler, capturingOutboundHandler);
final InetSocketAddress address2 = new InetSocketAddress(1);
// never used
final RadiusEndpoint stubEndpoint2 = new RadiusEndpoint(address2, "secret2");
final InetSocketAddress address3 = new InetSocketAddress(2);
// never used
final RadiusEndpoint stubEndpoint3 = new RadiusEndpoint(address3, "secret3");
final List<RadiusEndpoint> endpoints = Arrays.asList(stubEndpoint, stubEndpoint2, stubEndpoint3);
final RadiusRequest request = RadiusRequest.create(dictionary, (byte) 1, (byte) 1, null, Collections.emptyList());
final Future<RadiusResponse> future = radiusClient.communicate(request, endpoints);
await().until(future::isDone);
assertTrue(future.isSuccess());
assertEquals(response, future.getNow());
assertEquals(1, capturingOutboundHandler.requests.size());
assertEquals("secret", capturingOutboundHandler.requests.get(0).getEndpoint().getSecret());
}
use of org.tinyradius.core.packet.response.RadiusResponse in project tinyradius-netty by globalreachtech.
the class RadiusClientTest method communicateEndpointListAllFail.
@Test
void communicateEndpointListAllFail() throws RadiusPacketException {
final Exception expectedException = new Exception("test 123");
final CapturingOutboundHandler capturingOutboundHandler = new CapturingOutboundHandler(p -> p.tryFailure(expectedException));
final RadiusClient radiusClient = new RadiusClient(bootstrap, address, timeoutHandler, capturingOutboundHandler);
final RadiusEndpoint stubEndpoint2 = new RadiusEndpoint(new InetSocketAddress(1), "secret2");
final RadiusEndpoint stubEndpoint3 = new RadiusEndpoint(new InetSocketAddress(2), "secret3");
final List<RadiusEndpoint> endpoints = Arrays.asList(stubEndpoint, stubEndpoint2, stubEndpoint3);
final RadiusRequest request = RadiusRequest.create(dictionary, (byte) 1, (byte) 1, null, Collections.emptyList());
final Future<RadiusResponse> future = radiusClient.communicate(request, endpoints);
await().until(future::isDone);
assertFalse(future.isSuccess());
assertTrue(future.cause().getMessage().contains("all endpoints failed"));
assertSame(expectedException, future.cause().getCause());
assertEquals(3, capturingOutboundHandler.requests.size());
assertEquals("secret", capturingOutboundHandler.requests.get(0).getEndpoint().getSecret());
assertEquals("secret2", capturingOutboundHandler.requests.get(1).getEndpoint().getSecret());
assertEquals("secret3", capturingOutboundHandler.requests.get(2).getEndpoint().getSecret());
// unpooled, let GC handle it
assertEquals(1, request.toByteBuf().refCnt());
}
use of org.tinyradius.core.packet.response.RadiusResponse in project tinyradius-netty by globalreachtech.
the class RadiusClientTest method retainPacketsWithRetries.
@Test
void retainPacketsWithRetries() throws RadiusPacketException {
final byte id = (byte) random.nextInt(256);
final CapturingOutboundHandler capturingOutboundHandler = new CapturingOutboundHandler(a -> {
});
final RadiusClient radiusClient = new RadiusClient(bootstrap, address, new FixedTimeoutHandler(timer, 2, 0), capturingOutboundHandler);
final RadiusRequest request = RadiusRequest.create(dictionary, (byte) 1, (byte) 1, null, Collections.emptyList());
final Future<RadiusResponse> future = radiusClient.communicate(request, stubEndpoint);
await().until(future::isDone);
assertFalse(future.isSuccess());
assertEquals("Client send timeout - max attempts reached: 2", future.cause().getMessage());
// unpooled, let GC handle it
assertEquals(1, request.toByteBuf().refCnt());
}
Aggregations