X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FClientGetCommandImpl.java;fp=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FClientGetCommandImpl.java;h=e60fed7263ae66f7651530a21cb1544c3372acd8;hb=63b09b59276e7f5d469df8085e85b0ee79c9d680;hp=7908f5c4b4e3ca052ec654a313efbe6b9893e77d;hpb=6090cca7d3eedfc2c8e41c8ff162f4705519705c;p=jFCPlib.git diff --git a/src/main/java/net/pterodactylus/fcp/quelaton/ClientGetCommandImpl.java b/src/main/java/net/pterodactylus/fcp/quelaton/ClientGetCommandImpl.java index 7908f5c..e60fed7 100644 --- a/src/main/java/net/pterodactylus/fcp/quelaton/ClientGetCommandImpl.java +++ b/src/main/java/net/pterodactylus/fcp/quelaton/ClientGetCommandImpl.java @@ -2,9 +2,12 @@ package net.pterodactylus.fcp.quelaton; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; +import java.util.function.Consumer; import java.util.function.Supplier; import net.pterodactylus.fcp.AllData; @@ -27,6 +30,7 @@ class ClientGetCommandImpl implements ClientGetCommand { private final ListeningExecutorService threadPool; private final ConnectionSupplier connectionSupplier; private final Supplier identifierGenerator; + private final List> onRedirects = new ArrayList<>(); private boolean ignoreDataStore; private boolean dataStoreOnly; @@ -42,6 +46,12 @@ class ClientGetCommandImpl implements ClientGetCommand { } @Override + public ClientGetCommand onRedirect(Consumer onRedirect) { + onRedirects.add(onRedirect); + return this; + } + + @Override public ClientGetCommand ignoreDataStore() { ignoreDataStore = true; return this; @@ -83,14 +93,13 @@ class ClientGetCommandImpl implements ClientGetCommand { } private Optional execute(String uri) throws InterruptedException, ExecutionException, IOException { - ClientGet clientGet = createClientGetCommand(uri); + ClientGet clientGet = createClientGetCommand(identifierGenerator.get(), uri); try (ClientGetDialog clientGetDialog = new ClientGetDialog()) { return clientGetDialog.send(clientGet).get(); } } - private ClientGet createClientGetCommand(String uri) { - String identifier = identifierGenerator.get(); + private ClientGet createClientGetCommand(String identifier, String uri) { ClientGet clientGet = new ClientGet(uri, identifier, ReturnType.direct); if (ignoreDataStore) { clientGet.setIgnoreDataStore(true); @@ -116,7 +125,8 @@ class ClientGetCommandImpl implements ClientGetCommand { private class ClientGetDialog extends FcpDialog> { public ClientGetDialog() throws IOException { - super(ClientGetCommandImpl.this.threadPool, ClientGetCommandImpl.this.connectionSupplier.get(), Optional.empty()); + super(ClientGetCommandImpl.this.threadPool, ClientGetCommandImpl.this.connectionSupplier.get(), + Optional.empty()); } @Override @@ -155,7 +165,12 @@ class ClientGetCommandImpl implements ClientGetCommand { @Override protected void consumeGetFailed(GetFailed getFailed) { - finish(); + if (getFailed.getCode() == 27) { + onRedirects.forEach(onRedirect -> onRedirect.accept(getFailed.getRedirectURI())); + sendMessage(createClientGetCommand(getIdentifier(), getFailed.getRedirectURI())); + } else { + finish(); + } } }