diff --git a/engine/src/main/java/org/archive/crawler/restlet/EnhDirectoryResource.java b/engine/src/main/java/org/archive/crawler/restlet/EnhDirectoryResource.java index 18c59354..ffebd7e6 100644 --- a/engine/src/main/java/org/archive/crawler/restlet/EnhDirectoryResource.java +++ b/engine/src/main/java/org/archive/crawler/restlet/EnhDirectoryResource.java @@ -21,6 +21,8 @@ package org.archive.crawler.restlet; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.util.LinkedList; @@ -50,7 +52,11 @@ public class EnhDirectoryResource extends DirectoryServerResource { */ @Override public List getVariants() { - List variants = new LinkedList<>(super.getVariants(Method.GET)); + List superVariants = super.getVariants(); + if (superVariants == null) { + return null; // PUT and DELETE return no content + } + List variants = new LinkedList<>(superVariants); Form f = getRequest().getResourceRef().getQueryAsForm(); String format = f.getFirstValue("format"); if("textedit".equals(format)) { @@ -64,7 +70,11 @@ public class EnhDirectoryResource extends DirectoryServerResource { } catch (Exception e) { throw new RuntimeException(e); } - variants = new LinkedList<>(super.getVariants(Method.GET)); + superVariants = super.getVariants(); + if (superVariants == null) { + return null; + } + variants = new LinkedList<>(superVariants); } // wrap FileRepresentations in EditRepresentations ListIterator iter = variants.listIterator(); @@ -145,4 +155,28 @@ public class EnhDirectoryResource extends DirectoryServerResource { getResponse().redirectSeeOther(ref); return new EmptyRepresentation(); } + + /* + * XXX: We override Restlet's default PUT behaviour (see FileClientHelper.handleFilePut) as it unhelpfully changes + * the file extension based on the content-type and there's no apparent way to disable that. + */ + @Override + public Representation put(Representation entity) throws ResourceException { + File file = new File(URI.create(getTargetUri())); + if (getTargetUri().endsWith("/") || file.isDirectory()) { + return super.put(entity); + } + boolean created = !file.exists(); + try (FileOutputStream out = new FileOutputStream(file)) { + entity.write(out); + } catch (FileNotFoundException e) { + throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND, e); + } catch (IOException e) { + throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e); + } + if (created) { + getResponse().setStatus(Status.SUCCESS_CREATED); + } + return new EmptyRepresentation(); + } }