From 5612fa249b0d4263c948872594acfeccd792cf9d Mon Sep 17 00:00:00 2001 From: Alex Osborne Date: Tue, 27 Aug 2019 23:53:34 +0900 Subject: [PATCH 1/2] Use super.getVariants() rather than super.getVariants(GET) This was a regression introduced in the upgrade to Restlet 2. I encountered a NullPointerException here when upgrading and misunderstood the cause of it. Since PUT and DELETE return no content they are actually supposed to return null. --- .../crawler/restlet/EnhDirectoryResource.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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..05a0bc1b 100644 --- a/engine/src/main/java/org/archive/crawler/restlet/EnhDirectoryResource.java +++ b/engine/src/main/java/org/archive/crawler/restlet/EnhDirectoryResource.java @@ -50,7 +50,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 +68,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(); From eeddfd763f8a0199b01fa0119d24c335de128183 Mon Sep 17 00:00:00 2001 From: Alex Osborne Date: Wed, 28 Aug 2019 12:46:29 +0900 Subject: [PATCH 2/2] Override PUT so it doesn't change the file extension Fixes #282 and HER-1907 --- .../crawler/restlet/EnhDirectoryResource.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) 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 05a0bc1b..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; @@ -153,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(); + } }