diff --git a/source/java/org/alfresco/repo/webdav/PutMethod.java b/source/java/org/alfresco/repo/webdav/PutMethod.java index a667de177f..5087c189c8 100644 --- a/source/java/org/alfresco/repo/webdav/PutMethod.java +++ b/source/java/org/alfresco/repo/webdav/PutMethod.java @@ -19,7 +19,12 @@ package org.alfresco.repo.webdav; import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.Serializable; import java.nio.charset.Charset; import java.util.HashMap; @@ -35,6 +40,8 @@ import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.namespace.QName; +import org.alfresco.util.TempFileProvider; +import org.springframework.util.FileCopyUtils; /** * Implements the WebDAV PUT method @@ -48,6 +55,8 @@ public class PutMethod extends WebDAVMethod private String m_strContentType = null; private boolean m_expectHeaderPresent = false; + private File requestBody = null; + /** * Default constructor */ @@ -82,8 +91,16 @@ public class PutMethod extends WebDAVMethod */ protected void parseRequestBody() throws WebDAVServerException { - // Nothing to do in this method, the body contains - // the content it will be dealt with later + requestBody = TempFileProvider.createTempFile("webdav_PUT_", ".bin"); + try + { + OutputStream out = new FileOutputStream(requestBody); + FileCopyUtils.copy(m_request.getInputStream(), out); + } + catch (IOException e) + { + throw new WebDAVServerException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e); + } } /** @@ -149,13 +166,13 @@ public class PutMethod extends WebDAVMethod } else { - String guessedMimetype = getMimetypeService().guessMimetype(contentNodeInfo.getName()); + String guessedMimetype = getMimetypeService().guessMimetype(getPath()); mimetype = guessedMimetype; } writer.setMimetype(mimetype); // Get the input stream from the request data - InputStream is = m_request.getInputStream(); + InputStream is = new FileInputStream(requestBody); is = is.markSupported() ? is : new BufferedInputStream(is); ContentCharsetFinder charsetFinder = getMimetypeService().getContentCharsetFinder(); @@ -168,4 +185,17 @@ public class PutMethod extends WebDAVMethod // Set the response status, depending if the node existed or not m_response.setStatus(created ? HttpServletResponse.SC_CREATED : HttpServletResponse.SC_NO_CONTENT); } + + @Override + protected void cleanup() + { + try + { + requestBody.delete(); + } + catch (Throwable t) + { + logger.error("Failed to delete temp file", t); + } + } } diff --git a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java index 541d93aab6..bd33ebe81c 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java @@ -199,6 +199,10 @@ public abstract class WebDAVMethod throw new WebDAVServerException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e); } } + finally + { + cleanup(); + } } /** @@ -647,7 +651,9 @@ public abstract class WebDAVMethod return ns.toString(); } - + protected void cleanup() + { + } /** * Checks if write operation can be performed on node. *