From 63c917c979a698ce3b33ece19816cd827c64532a Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 24 May 2018 11:28:04 +0200 Subject: [PATCH] Include upload headers in interceptor and finish upload file operation --- dav4android | 2 +- .../android/lib/refactor/RemoteOperation.java | 7 ++- .../operations/UploadRemoteFileOperation.java | 59 ++++++++++++++----- 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/dav4android b/dav4android index 6a5835a9..d0a09ad1 160000 --- a/dav4android +++ b/dav4android @@ -1 +1 @@ -Subproject commit 6a5835a960c4a3d4361a70ef72914b9fa214363d +Subproject commit d0a09ad1ea87044d7e50cc870fc798562d1f0d38 diff --git a/src/com/owncloud/android/lib/refactor/RemoteOperation.java b/src/com/owncloud/android/lib/refactor/RemoteOperation.java index 24caf1aa..1af1434f 100644 --- a/src/com/owncloud/android/lib/refactor/RemoteOperation.java +++ b/src/com/owncloud/android/lib/refactor/RemoteOperation.java @@ -37,10 +37,11 @@ public abstract class RemoteOperation { return mClient.newBuilder() .addInterceptor(chain -> chain.proceed( - addRequestCredentials( - chain.request()) + addRequestCredentials(chain.request()) .addHeader(USER_AGENT_HEADER, mContext.getUserAgent()) - .build())) + .build() + ) + ) .followRedirects(false) .build(); } diff --git a/src/com/owncloud/android/lib/refactor/operations/UploadRemoteFileOperation.java b/src/com/owncloud/android/lib/refactor/operations/UploadRemoteFileOperation.java index 84bdac14..d0ca312f 100644 --- a/src/com/owncloud/android/lib/refactor/operations/UploadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/refactor/operations/UploadRemoteFileOperation.java @@ -30,23 +30,33 @@ import com.owncloud.android.lib.refactor.RemoteOperationResult; import java.io.File; -import at.bitfire.dav4android.DavOCResource; +import at.bitfire.dav4android.DavResource; import okhttp3.MediaType; +import okhttp3.Request; import okhttp3.RequestBody; +/** + * @author David González Verdugo + */ public class UploadRemoteFileOperation extends RemoteOperation { - private String mLocalPath; + private static final String CONTENT_TYPE_HEADER = "Content-Type"; + private static final String OC_TOTAL_LENGTH_HEADER = "OC-Total-Length"; + private static final String OC_X_OC_MTIME_HEADER = "X-OC-Mtime"; + private static final String IF_MATCH_HEADER = "If-Match"; + + private File mFileToUpload; private String mRemotePath; private String mMimeType; private String mFileLastModifTimestamp; + public UploadRemoteFileOperation(OCContext context, String localPath, String remotePath, String mimetype, String fileLastModifTimestamp) { super(context); - mLocalPath = localPath; - mRemotePath = remotePath; + mFileToUpload = new File(localPath); + mRemotePath = remotePath.replaceAll("^/+", ""); //Delete leading slashes mMimeType = mimetype; mFileLastModifTimestamp = fileLastModifTimestamp; } @@ -56,21 +66,25 @@ public class UploadRemoteFileOperation extends RemoteOperation { try { - File fileToUpload = new File(mLocalPath); MediaType mediaType = MediaType.parse(mMimeType); - RequestBody requestBody = RequestBody.create(mediaType, fileToUpload); + RequestBody requestBody = RequestBody.create(mediaType, mFileToUpload); - DavOCResource davOCResource = new DavOCResource( - getClient(), - getWebDavHttpUrl(mRemotePath), - null); + DavResource davResource = new DavResource( + getClient() + .newBuilder() + .addInterceptor(chain -> + chain.proceed( + addUploadHeaders(chain.request()) + .build() + ) + ) + .followRedirects(false) + .build(), + getWebDavHttpUrl(mRemotePath)); - davOCResource.put(requestBody, + davResource.put(requestBody, null, - false, - "multipart/form-data", - String.valueOf(fileToUpload.length()), - mFileLastModifTimestamp); + false); } catch (Exception e) { e.printStackTrace(); @@ -78,4 +92,19 @@ public class UploadRemoteFileOperation extends RemoteOperation { return null; } + + /** + * Add headers needed to upload a file + * @param request request in which include the headers + * @return request with upload headers + */ + private Request.Builder addUploadHeaders (Request request) { + + Request.Builder builder = request.newBuilder(); + builder.addHeader(CONTENT_TYPE_HEADER, "multipart/form-data"); + builder.addHeader(OC_TOTAL_LENGTH_HEADER, String.valueOf(mFileToUpload.length())); + builder.addHeader(OC_X_OC_MTIME_HEADER, mFileLastModifTimestamp); + + return builder; + } } \ No newline at end of file