package com.github.obourgain.elasticsearch.http.response; import static com.github.obourgain.elasticsearch.http.response.ValidStatusCodes._404; import java.util.Collections; import java.util.Set; import com.google.common.base.Charsets; import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.client.HttpClientResponse; import rx.Observable; import rx.functions.Func1; public class ErrorHandler { public static Func1<HttpClientResponse<ByteBuf>, Observable<HttpClientResponse<ByteBuf>>> AS_FUNC = new Func1<HttpClientResponse<ByteBuf>, Observable<HttpClientResponse<ByteBuf>>>() { @Override public Observable<HttpClientResponse<ByteBuf>> call(HttpClientResponse<ByteBuf> response) { return ErrorHandler.checkError(response); } }; public static Func1<HttpClientResponse<ByteBuf>, Observable<HttpClientResponse<ByteBuf>>> HANDLES_404 = new Func1<HttpClientResponse<ByteBuf>, Observable<HttpClientResponse<ByteBuf>>>() { @Override public Observable<HttpClientResponse<ByteBuf>> call(HttpClientResponse<ByteBuf> response) { return ErrorHandler.checkError(response, _404); } }; public static Observable<HttpClientResponse<ByteBuf>> checkError(HttpClientResponse<ByteBuf> response) { return checkError(response, Collections.<Integer>emptySet()); } public static Observable<HttpClientResponse<ByteBuf>> checkError(HttpClientResponse<ByteBuf> response, Set<Integer> non200ValidStatuses) { final int statusCode = response.getStatus().code(); if (statusCode > 300 && !non200ValidStatuses.contains(statusCode)) { return response.getContent().flatMap(new Func1<ByteBuf, Observable<HttpClientResponse<ByteBuf>>>() { @Override public Observable<HttpClientResponse<ByteBuf>> call(ByteBuf byteBuf) { return Observable.error(new ElasticsearchHttpException(byteBuf.toString(Charsets.UTF_8), statusCode)); } }); } return Observable.just(response); } }