Follow redirects in ClientGet
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / ClientGetCommandImpl.java
index 7908f5c..e60fed7 100644 (file)
@@ -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<String> identifierGenerator;
+       private final List<Consumer<String>> onRedirects = new ArrayList<>();
 
        private boolean ignoreDataStore;
        private boolean dataStoreOnly;
@@ -42,6 +46,12 @@ class ClientGetCommandImpl implements ClientGetCommand {
        }
 
        @Override
+       public ClientGetCommand onRedirect(Consumer<String> onRedirect) {
+               onRedirects.add(onRedirect);
+               return this;
+       }
+
+       @Override
        public ClientGetCommand ignoreDataStore() {
                ignoreDataStore = true;
                return this;
@@ -83,14 +93,13 @@ class ClientGetCommandImpl implements ClientGetCommand {
        }
 
        private Optional<Data> 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<Optional<Data>> {
 
                public ClientGetDialog() throws IOException {
-                       super(ClientGetCommandImpl.this.threadPool, ClientGetCommandImpl.this.connectionSupplier.get(), Optional.<Data>empty());
+                       super(ClientGetCommandImpl.this.threadPool, ClientGetCommandImpl.this.connectionSupplier.get(),
+                               Optional.<Data>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();
+                       }
                }
 
        }