package netflix.ocelli.examples.rxnetty.http; import io.netty.handler.codec.http.HttpResponseStatus; import io.reactivex.netty.protocol.http.server.HttpServer; import netflix.ocelli.Instance; import rx.Observable; import rx.functions.Func1; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.concurrent.TimeUnit; final class HttpExampleUtils { private HttpExampleUtils() { } protected static Observable<Instance<SocketAddress>> newHostStreamWithCannedLatencies(Long... latencies) { return Observable.from(latencies) .map(latency -> { return startServer(latency); }) .map(new SockAddrToInstance()); } protected static Observable<Instance<SocketAddress>> newHostStreamWithCannedStatus( HttpResponseStatus... cannedStatuses) { return Observable.from(cannedStatuses) .map(cannedStatus -> { if (null != cannedStatus) { return startServer(cannedStatus); } return new InetSocketAddress(0); }) .map(new SockAddrToInstance()); } protected static SocketAddress startServer(long latencyMillis) { return HttpServer.newServer() .start((request, response) -> { return Observable.timer(latencyMillis, TimeUnit.MILLISECONDS) .flatMap(aTick -> response.addHeader("X-Instance", response.unsafeNettyChannel() .localAddress()) .setStatus(HttpResponseStatus.OK)); }) .getServerAddress(); } protected static SocketAddress startServer(HttpResponseStatus cannedStatus) { return HttpServer.newServer() .start((request, response) -> { return response.addHeader("X-Instance", response.unsafeNettyChannel().localAddress()) .setStatus(cannedStatus); }) .getServerAddress(); } protected static class InvalidResponseException extends RuntimeException { private static final long serialVersionUID = -712946630951320233L; public InvalidResponseException() { } } private static class SockAddrToInstance implements Func1<SocketAddress, Instance<SocketAddress>> { @Override public Instance<SocketAddress> call(SocketAddress socketAddr) { return new Instance<SocketAddress>() { @Override public Observable<Void> getLifecycle() { return Observable.never(); } @Override public SocketAddress getValue() { return socketAddr; } }; } } }