package denominator.denominatord; import com.squareup.okhttp.mockwebserver.Dispatcher; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.RecordedRequest; import denominator.DNSApiManager; import static denominator.denominatord.RecordSetDispatcher.RECORDSET_PATTERN; public class DenominatorDispatcher extends Dispatcher { private final DNSApiManager mgr; private final Dispatcher zones; private final Dispatcher recordSets; DenominatorDispatcher(DNSApiManager mgr, JsonCodec codec) { this.mgr = mgr; this.zones = new ZoneDispatcher(mgr.api().zones(), codec); this.recordSets = new RecordSetDispatcher(mgr, codec); } @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException { try { if ("/healthcheck".equals(request.getPath())) { if (!request.getMethod().equals("GET")) { return new MockResponse().setResponseCode(405); } return new MockResponse().setResponseCode(mgr.checkConnection() ? 200 : 503); } else if (RECORDSET_PATTERN.matcher(request.getPath()).matches()) { return recordSets.dispatch(request); } else if (request.getPath() != null && request.getPath().startsWith("/zones")) { return zones.dispatch(request); } else { return new MockResponse().setResponseCode(404); } } catch (InterruptedException e) { throw e; } catch (RuntimeException e) { return new MockResponse().setResponseCode(e instanceof IllegalArgumentException ? 400 : 500) .addHeader("Content-Type", "text/plain") .setBody(e.getMessage() + "\n"); // curl nice } } }