package com.fourlastor.rxdispatcher; import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.server.HttpServerRequest; import io.reactivex.netty.protocol.http.server.HttpServerResponse; import io.reactivex.netty.protocol.http.server.RequestHandler; import rx.Observable; import rx.functions.Func1; import rx.subjects.PublishSubject; public class RxDispatcher implements RequestHandler<ByteBuf, ByteBuf> { PublishSubject<Response> subject = PublishSubject.create(); @Override public Observable<Void> handle( final HttpServerRequest<ByteBuf> request, final HttpServerResponse<ByteBuf> response ) { return subject .filter(new Func1<Response, Boolean>() { @Override public Boolean call(Response r) { return r.match(request); } }) .flatMap(new Func1<Response, Observable<Void>>() { @Override public Observable<Void> call(Response r) { r.process(response); return response.close(); } }); } public void match(String path, String body) { match(new SimpleResponse(path, body)); } public void match(Response response) { subject.onNext(response); } public interface Response { boolean match(HttpServerRequest<ByteBuf> request); void process(HttpServerResponse<ByteBuf> response); } }